スクリプトはコマンドを正常に実行しますが、出力を変数に保存しようとすると失敗します。

スクリプトはコマンドを正常に実行しますが、出力を変数に保存しようとすると失敗します。

以下を含むシェルスクリプトがあります。私はそれを呼んだ./script.sh。 Echoは正常に実行されますが、出力を変数に保存しようとすると失敗します。これは、これlsまでにテストしたすべてのコマンドに当てはまりますpwdnode

#!/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にも当てはまります。

関連情報