web-dev-qa-db-ja.com

バックティックvs二重引用符

私はこれを長い間疑問に思っていましたが、それを調べる方法を理解していませんでした-

これは:

x=`command -v r2g`

これと同じ:

x="$(command -v r2g)"

それともこれと同じです:

x=$(command -v r2g)

...後者の場合、これを修正する必要がありますか?

x="`command -v r2g`"
8
Alexander Mills

4つの例は機能的に同等です。

バックティックは時代遅れであり、ボーンシェル(家宝のような)のような1970シェルを使用していない限り、バックティックは必要ありません。主な問題は、 ネストするのがかなり難しい ということです:

$ echo $(uname | $(echo cat))
Linux

$ echo `uname | `echo cat``
bash: command substitution: line 2: syntax error: unexpected end of file
echo cat

いずれにせよ展開が引用されていると見なされるため、割り当てのみが含まれるコマンドラインの厳密な側では、展開を引用する必要はありません(ただし無害です)。

$ var=$(uname)

しかし、それはnotは常にtrueであり、コマンドexportでの割り当ては引数と見なされ、一部のシェル(bashではない)で分割され、globされます:

$ dash -c 'export MYVAR=`echo a test`;echo "$MYVAR"'
a

同じ理由がlocalローカル変数の割り当てには引用符が必要ですか? )とdeclare(およびその他)にも当てはまります。

「修正する」ためにすべきことは、次のとおりです。

x=$(command -v r2g)

そして時々(移植可能なスクリプトの場合):

export x="$(command -v r2g)"
4
Isaac

はい、バッククォートも引用する必要があります。

これは、コマンド出力にスペースが含まれていない場合に適したbashスタイルの問題である可能性があります。これは、shellhardenユーティリティの作成者からの引用です。 " bashで安全に行う方法 "から:

_Should I use backticks?
Command substitutions also come in this form:

Correct: "`cmd`"
Bad: `cmd`
While it is possible to use this style correctly, it looks even more awkward in quotes and is less readable when nested. The consensus around this one is pretty clear: Avoid.

Shellharden rewrites these into the dollar-parenthesis form.
_

また、_"_を使用してバッククォートを引用するか、$()を使用するように(より適切に)書き直すのも良い方法だと思います。バッククォートの使用時にコマンド出力にスペースまたは特殊文字が含まれている場合、式を引用しないと問題が発生する可能性があります。

3
Alexander

はい、このドキュメントによると私の推測は正しいようです: https://github.com/anordal/shellharden/blob/master/how_to_do_things_safely_in_bash.md

それは言う:

# Should I use backticks?
# Command substitutions also come in this form:

Correct: "`cmd`"
Bad: `cmd`
0
Alexander Mills