最近、echoコマンドを使用して先頭に$を付けました。驚いたことに、その結果はエラーでした。私のコマンドは次のようなものでした。
# !/bin/bash $(echo "a")
エラーは..
./test1.sh: line 3: a: command not found
誰かがここで何が起こっているのか説明できますか?よろしくお願いします。
回答
$(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
コメント
回答
set -x
を使用してシェルの動作を確認します。
set -x $(echo "a") ++ echo a + a
シェルはecho a
を実行し、出力をコマンドラインに配置します。これは、次のコマンドラインを実行しようとした場合と同じです。
a
シェルはコマンドa
(および関数、エイリアス、ハッシュリストの前でも)はそれを検出しないため、エラーをスローします。
出力が有効なコマンドである場合は機能します:
$(echo "ls")
コメント
- 実際に$ otherを使用してから、変数を呼び出すのは何ですか。
- @Ashu明らかに、コマンド置換にも使用されます–あなたの場合。計算(
echo $((1+2+3))
)、文字列の作成($'foo\nbar'
/$"foo"
)、および(シェル関連が少ない)bash
が理解する正規表現([[ foo =~ ^f..$ ]]
)。また、いくつかの方法で変数を変更するためにも使用されます:${foo#bar}
eval "$(dircolors)"
は合理的な方法です。 gpg-agentなど、そのパターンに従う他のいくつかのコマンドと同じです。$(ssh-agent)
。良い点です。