%22%E3%81%AE%E3%81%9D%E3%81%AE%E4%BB%96%E3%81%AE%E5%8B%95%E4%BD%9C.png)
ランダムに名前付き関数を介して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 "
echo
bashがコマンドを評価すると、"$@"
別の単語に展開されます。 echo
しかし、これらの個々の単語は文字列に結合されます。私たちがそれを見る前に、私たちはこれを見ました"$(echo $@)"
。 eval
動作原理は似ています。すべての引数から文字列を生成し、文字列を計算します。したがって:
$ eval 'printf "%s\n" "' "$@" '"'
arg1 arg2 arg3
これも文書化されていますman bash
。
評価[パラメータ...]
argsを読み込み、一緒に接続してコマンドを形成します。その後、コマンドはシェルから読み取られ実行されます。
答え2
違いを確認するには、より簡単な例を見てください。
$ set "a b" c "d e"
$ printf "%s\n" "$@"
a b
c
d e
さっきおっしゃったのがまさにそれです。しなければならない使用は簡単で、理解しやすく、修正が簡単です。
$ printf "%s\n" "$(echo $@)"
a b c d e
$@
まずここを展開してください。引用しない$(echo a b c d e)
(コマンド置換の周りの引用符は別々であり、まだ適用されていません。)と同じです。printf
フォーマット文字列の後に追加のパラメータがあります。
$ eval "printf \"%s\n\" \"$@\""
a b c d e
これに$@
は が引用されていますが、拡張は上記の 2 番と同じ出力を生成するコマンドで連結されるeval
( printf "%s\n" a b
、c
および ) の 3 つの別々の引数を生成します。d e