以下を含むシェルスクリプトがあります。私はそれを呼んだ./script.sh
。 Echoは正常に実行されますが、出力を変数に保存しようとすると失敗します。これは、これls
までにテストしたすべてのコマンドに当てはまりますpwd
。node
#!/bin/zsh
echo foo
# foo
output=$("echo foo")
# command not found: echo foo
どうですか?
編集する:修正:最後のエコーが文字列の内側にありました!
答え1
問題を見つけたようです。echo
完全なコマンド自体ではなくに渡された文字列のみを引用符で囲む必要があります。
output=$("echo foo")
次のように変更する必要があります。
output=$(echo "foo")
output
変数にリテラル文字列を含めるには、echo foo
次のように設定する必要があります。
output='echo foo'
しかし、これを行うことも可能です:
output=$(echo 'echo foo')
答え2
予想されるように、角かっこ内のコマンドはサブシェルを生成します。しかし、$()はあなたが思うものとは異なります。コマンド出力を文字列として返しませんが、コマンド出力をシェルに置き換えます。証拠が必要な場合は、以下を試してください。$(echo "echo 123")
代わりに、シェルで実行するときは、配列ではなく二重引用符を使用して文字列としてキャプチャしようとします(出力はスペースで区切られます)。
output="$(echo foo)"
これはzshに限られた問題ではなく、bashにも当てはまります。