GNU/Linux >> Linux の 問題 >  >> Linux

出力を変数に割り当てるときにコマンド置換を引用する必要がありますか?

この質問にはすでに回答があります :二重引用符はいつ必要ですか?

(1つの回答)
4年前に閉鎖されました。

出力を変数に割り当てる場合でも、以下に示すようにコマンド置換を引用する傾向があります。

var="$(command)"

それは実際に必要ですか?いつ壊れますか?ここで受け入れられた答えは次のように主張しています:

DIRNAME =” $(dirname $ FILE)”は、$ FILEに空白またはグロビング文字[?*。

が含まれている場合、希望どおりに機能しません。

リンクは、引用に関するGray Cat Wikiのすばらしいページを指していますが、そのページでは、引用コマンドの置換について具体的に言及していません。そして、変数を引用しながら 明らかに必要ですが、コマンド置換自体を引用することは必要ないようです。

ただし、同じ投稿は次のように終わります:

DIRNAME =” $(dirname“ $ FILE”)”が推奨される方法です。 DIRNAME =は、他に何も変更せずにコマンドとスペースに置き換えることができ、dirnameは正しい文字列を受け取ります。

これは私がいつも考えていたことであり、引用していない投稿をここで頻繁に取り上げています。ただし、上記にリンクされているwikiページにも次のように記載されています。

二重引用符を安全に省略できる場合がいくつかあります:

単純な割り当ての右側。 foo =$barは引用符なしで書くことができます。これはPOSIXに準拠しています。

[。 。 。 ]

var=$(command) 本当に「単純な」割り当てではありませんが、それでも、引用が実際に必要なケースを見つけることができませんでした:

$ var=$(echo "foo bar baz")  ## whitespace works
$  echo "$var"
foo bar baz

$ var=$(printf "foonbar * baz") ## so do globbing characters
$ echo "$var"
foo
bar * baz

$ var1="foonbar * baz"
$ var=$(printf "$var1")  ## printing a variable doesn't make any difference
$ echo "$var" 
foo
bar * baz

$ var=$(printf '%sn' "$var1")
$ echo "$var"
foonbar * baz

$ var=$(printf -- '-e %sn' "$var1") ## strings starting with - also work
$ echo "$var"
-e foonbar * baz

もちろん、コマンド置換がcommand1 "$(command2)"のようなものに直接使用されている場合は、引用符が絶対に必要です。 、しかし、変数に割り当てる場合はそうではないようです。

だから、私は何が欠けていますか?見積もりは必要ですか?戻り値を変数に割り当てるときに、コマンド置換を引用するコーナーケース あなたを守りますか?または、変数代入演算の右側である場合、コマンド置換を引用符で囲まなくてもかまいませんか?

承認された回答:

参考までに、Bashのマニュアルはこれについて明確です:

変数は、フォームのステートメントによって割り当てることができます

name=[value]

値が指定されていない場合、変数にはヌル文字列が割り当てられます。すべての値は、チルダ展開、パラメーターと変数の展開、コマンド置換、算術展開、および引用符の削除を受けます(詳細は以下を参照)。 […]単語分割は実行されません 、以下で説明する「[メール保護]」を除きます。 ファイル名の展開は実行されません。

単語の分割やファイル名の拡張がないため、引用符は必要ありません。

関連:PostgreSQLpsqlコマンドラインツールとSETCONSTRAINTS DEFERRED?

POSIXについては、セクション2.9.1の簡単なコマンド:

2.変数の割り当てまたはリダイレクトではない単語は、展開されるものとします。拡張後にフィールドが残っている場合拡張後にフィールドが残っている場合、最初のフィールドはコマンド名と見なされ、残りのフィールドはコマンドの引数になります。
[…]
4.各変数の割り当て値を割り当てる前に、チルダ展開、パラメーター展開、コマンド置換、算術展開、および引用符の削除のために展開する必要があります。

これが、フィールド分割がステップ2で実行された拡張に対してのみ発生することを意味すると解釈されるのかどうかわかりませんか?ステップ4はしません フィールド分割については言及しますが、フィールド分割に関するセクションでは、複数のフィールドを作成する場合の例外として変数の割り当てについても言及していません。


Linux
  1. コマンドの出力をシェル変数に割り当てる方法は?

  2. コマンドの出力をシェル変数に保存しますか?

  3. コマンド実行時にターミナル出力を非表示にする方法は?

  1. Linux 時間コマンドの例

  2. Bashを使用して、最後のコマンドの出力を変数に自動的にキャプチャしますか?

  3. 猫の出力を変数に保存すると、すべての改行が削除されます

  1. Grub2のコマンドからの出力に等しい変数を設定するにはどうすればよいですか?

  2. Linux での tee コマンドの例

  3. UNIXのtimeコマンドの出力をbashの変数にリダイレクトしますか?