最近はechoコマンドを使って前に$を付けました。驚いたことに、それはバグであることが判明しました。私の注文はこれです。
# !/bin/bash
$(echo 'a')
エラーは...
./test1.sh: line 3: a: command not found
ここで何が起こっているのかを説明できる人はいますか?よろしくお願いします。
答え1
$(echo a)
「コマンド置換」です。$(...)
に置き換えられます内部コマンドの出力。この例の出力は でありa
、シェルはその出力を実行しようとします。シェルが呼び出されたコマンドが見つからず、a
エラーメッセージが表示されます。
あなたの意図が何であるか、何が起こると期待しているのかは不明です。これは非常に珍しいコマンド置換の結果を実行したい。
一部のプログラムは、シェルが評価する必要がある文字列を出力します。したがって、次のコードを見ることができます。
eval "$(ssh-agent)"
与えられたコマンドの出力を評価(実行)します。これらのコマンドは厳密に指定された出力を持ち、通常この方法で実行しても安全と見なされます。上記の例では、ssh-agent
SSHエージェントプロセスが開始され、クライアントが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')