次のコード例は問題を示しています。
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 -l
。eval
あなたのためにそれを行います。
"ls -l"
あるいは、うまく"ls | wc -l"
いかない理由は、参照削除が発生するためです。後ろにコマンドライン評価のトークン化。
$(echo 'ls | wc -l')
うまくいかないのは、単語が分離された後でもコマンド置換が発生するためです。