$(command $arg)を引用する正しい方法は何ですか?

$(command $arg)を引用する正しい方法は何ですか?

長年私を悩ませてきたこの問題を解決する時間が来ました...

私は時々このような状況に直面し、これが行く道だと思います。

$(comm "$(arg)")

そして私の意見が経験によってよく裏付けられていると信じています。しかし、もはや確信できません。住宅検査私も決断できません。両方:

"$(dirname $0)"/stop.bash
           ^-- SC2086: Double quote to prevent globbing and word splitting.

そして:

$(dirname "$0")/stop.bash
^-- SC2046: Quote this to prevent word splitting.

これの論理は何ですか?

(しかし、これはShellcheckバージョン0.4.4です。)

答え1

を使用する必要があります"$(somecmd "$file")"

引用符がない場合は、空白のパスが引数で分割され、誤ったsomecmdファイルをターゲットにします。だから、中に引用符を入れる必要があります。

出力にスペースが含まれるとsomecmd分割が発生するため、コマンド全体の置換を引用符で囲む必要があります。

コマンド置換内の引用符は、その外部の引用符には影響しません。Bashの自己参照マニュアルはこれについては明確ではありませんが、BashGuideが明示的に言及。これPOSIXのテキストまた必要だから「有効なシェルスクリプト」入場許可$(...)

この$(command)形式では、左角かっこの後から一致する右角かっこまでのすべての文字がコマンドを構成します。指定されていない結果を生成するリダイレクトのみを含むスクリプトを除いて、すべての有効なシェルスクリプトをコマンドと共に使用できます。


例:

$ file="./space here/foo"

ㅏ。引用符なしでdirnameすべてを処理./spaceしますhere/foo

$ printf "<%s>\n" $(dirname $file)
<.>
<here>

b。内部の引用符、dirnameプロセス、./space here/fooおよび提供は./space here2つの部分に分けられます。

$ printf "<%s>\n" $(dirname "$file")
<./space>
<here>

氏。外部引用符、dirname処理./space、およびhere/fooは別の行に出力されますが、今、これらの2行はパラメータを形成します。:

$ printf "<%s>\n" "$(dirname $file)"
<.
here>

d。正解を提供する内部および外部参照:

$ printf "<%s>\n" "$(dirname "$file")"
<./space here>

(最初の引数だけを処理するとより簡単になりますが、dirnameケースaとcの違いは表示されません。)

ファイル名がダッシュで始まる場合は、オプションと見なされないようにdirname(およびおそらく他の場合でも)追加する必要があるため、を使用してください。--"$(dirname -- "$file")"

関連情報