最近、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 

コメント

  • OTOH、eval "$(dircolors)"は合理的な方法です。 gpg-agentなど、そのパターンに従う他のいくつかのコマンドと同じです。
  • @derobertはい、$(ssh-agent)。良い点です。

回答

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}

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です