Bash - "bash -c"を介してパイプを使用してコマンド文字列のみを実行できるのはなぜですか?

Bash - "bash -c"を介してパイプを使用してコマンド文字列のみを実行できるのはなぜですか?

次のコード例は問題を示しています。

bash -c "$(echo 'ls | wc -l')" # Working
"$(echo 'ls | wc -l')"         # Not working
$(echo 'ls | wc -l')           # Not working
'ls | wc -l'                   # Not working
'ls'                           # Working
ls | wc -l                     # Obviously working

私がここで何を見逃しているのでしょうか?

答え1

"ls"シェルに実行するテキスト文字列を指定すると、その文字列がコマンド(コマンド名ではないなど)に対応する場合は、"ls -l"そのタスクを実行できます。

  • 最初の例は、echo実行中のコマンドが呼び出しシェルによって実行されるために機能しますbash -c "ls | wc -l"。その後、パイプはによって実行されますbash -c

  • 2番目、3番目、4番目の例は、結果のテキスト文字列に追加の評価ステップが必要なため、機能しませんls | wc -levalあなたのためにそれを行います。

"ls -l"あるいは、うまく"ls | wc -l"いかない理由は、参照削除が発生するためです。後ろにコマンドライン評価のトークン化。

$(echo 'ls | wc -l')うまくいかないのは、単語が分離された後でもコマンド置換が発生するためです。

関連情報