引数として使用するときのeval "コマンド\"$@\""、"$@"、および"$(echo $@)"のその他の動作

引数として使用するときのeval

ランダムに名前付き関数を介してTorブラウザ(firefox)にプログラムで複数のパラメータを渡したいと思いますtor。これはコマンドのためのものですtor search terms。チャジャン!私のクエリです。これら3つのバリエーションを使用すると、

~/tor-browser_en-US/Browser/start-tor-browser -search "$(echo $@)"

eval "~/tor-browser_en-US/Browser/start-tor-browser -search \"$@\""

~/tor-browser_en-US/Browser/start-tor-browser -search "$@"

最初の2行だけが同じ機能を実行しているようです。単一のTorブラウザウィンドウに任意のテキストコンテンツから用語を検索させます。ただし、3行目は各単語ごとに新しい検索バーを作成します。

なぜこのような問題が発生しますか?

明確にします。私は解決策を見つけるのではなく、bahviourの説明に興味があります。

ベストアンサー1

3番目のバージョンの"$*"場合"$@"

説明する

これを説明するために、いくつかの位置パラメータを設定しましょう。

$ set -- arg1 arg2 arg3

それでは、公式を使ってecho読んでみましょう。

$ printf "%s\n" "$(echo $@)"
arg1 arg2 arg3

"$@"彼らが何をしているかを見てみましょう:

$ printf "%s\n" "$@"
arg1
arg2
arg3

違いは、単一の文字列では"$@"なく3つの単語に展開されることです。"$(echo $@)"同様の動作が必要な場合は、以下を"$(echo $@)"使用する必要があります"$*"

$ printf "%s\n" "$*"
arg1 arg2 arg3

文書

からman bash

"$*"単一の文字列を生成します。

「$*」は「$1c$2c...」と同じです。ここで、cはIFS変数値の最初の文字です。

対照的に、一連の単語を生成する状態は次のとおりですman bash$@

「$@」は「$1」「$2」と同じです...

使用評価

観察する:

$ echo 'printf "%s\n" "' "$@" '"'
printf "%s\n" " arg1 arg2 arg3 "

echobashがコマンドを評価すると、"$@"別の単語に展開されます。 echoしかし、これらの個々の単語は文字列に結合されます。私たちがそれを見る前に、私たちはこれを見ました"$(echo $@)"eval動作原理は似ています。すべての引数から文字列を生成し、文字列を計算します。したがって:

$ eval 'printf "%s\n" "' "$@" '"'
 arg1 arg2 arg3 

これも文書化されていますman bash

評価[パラメータ...]
argsを読み込み、一緒に接続してコマンドを形成します。その後、コマンドはシェルから読み取られ実行されます。

おすすめ記事