シェルスクリプトで$でechoコマンドを使用する

シェルスクリプトで$でechoコマンドを使用する

最近はechoコマンドを使って前に$を付けました。驚いたことに、それはバグであることが判明しました。私の注文はこれです。

# !/bin/bash
$(echo 'a')

エラーは...

./test1.sh: line 3: a: command not found

ここで何が起こっているのかを説明できる人はいますか?よろしくお願いします。

答え1

$(echo a)「コマンド置換」です。$(...)に置き換えられます内部コマンドの出力。この例の出力は でありa、シェルはその出力を実行しようとします。シェルが呼び出されたコマンドが見つからず、aエラーメッセージが表示されます。

あなたの意図が何であるか、何が起こると期待しているのかは不明です。これは非常に珍しいコマンド置換の結果を実行したい。


一部のプログラムは、シェルが評価する必要がある文字列を出力します。したがって、次のコードを見ることができます。

eval "$(ssh-agent)"

与えられたコマンドの出力を評価(実行)します。これらのコマンドは厳密に指定された出力を持ち、通常この方法で実行しても安全と見なされます。上記の例では、ssh-agentSSHエージェントプロセスが開始され、クライアントがssh後でエージェントを使用するために必要な適切な環境変数を設定するいくつかのコマンドが出力されます。たとえば、次のようになります。

SSH_AUTH_SOCK=/tmp/ssh-Ppg1EO5eRIZp/agent.6017; export SSH_AUTH_SOCK;
SSH_AGENT_PID=6018; export SSH_AGENT_PID;
echo Agent pid 6018;

次に評価に合格しますeval

eval単に$(ssh-agent)コマンドの出力がssh-agent複合コマンドに近いので、ここで使用されています。それ以外の場合は、evalコマンド;終端が特別になります。

例:

$ s='echo hello; echo world'
$ $s
hello; echo world
$ eval "$s"
hello
world

答え2

次のコマンドを使用して、シェルがset -x実行する操作を確認できます。

set -x
$(echo 'a')
  ++ echo a
  + a

シェルが実行され、echo aコマンドラインに出力が表示されます。これは、次のコマンドラインを実行したいのと同じ効果があります。

a

aシェルは、パスで(関数、エイリアス、ハッシュリストの前にも)コマンドを見つけますが、見つからないため、エラーが発生します。

出力が有効なコマンドであれば有効です。

$(echo 'ls')

関連情報