私はこれを長い間疑問に思っていましたが、それを調べる方法を理解していませんでした-
これは:
x=`command -v r2g`
これと同じ:
x="$(command -v r2g)"
それともこれと同じです:
x=$(command -v r2g)
...後者の場合、これを修正する必要がありますか?
x="`command -v r2g`"
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)"
はい、バッククォートも引用する必要があります。
これは、コマンド出力にスペースが含まれていない場合に適した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.
_
また、_"
_を使用してバッククォートを引用するか、$()
を使用するように(より適切に)書き直すのも良い方法だと思います。バッククォートの使用時にコマンド出力にスペースまたは特殊文字が含まれている場合、式を引用しないと問題が発生する可能性があります。
はい、このドキュメントによると私の推測は正しいようです: 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`