違いは何ですか? (コマンド代替) [重複]

違いは何ですか? (コマンド代替) [重複]
  1. printf "%s" `echo ../.. | sed 's/[.]/\\&/g'`
  2. printf "%s" $(echo ../.. | sed 's/[.]/\\&/g')
  3. printf "%s" "$(echo ../.. | sed 's/[.]/\\&/g')"

答え1

私が知る限り、いや、この特別なケースでは、そして文字列../..

引用符があるかどうかにかかわらず、2番目と3番目の間に大きな違いはありません。その特定の入力、string../..ただし、コマンド置換の出力にスペースやワイルドカードが含まれている場合は違いがあります。

$ mkdir temp; cd temp; touch hello.txt
$ printf "%s" $(echo "foo * bar"); echo
foohello.txtbar
$ printf "%s" "$(echo "foo * bar")"; echo
foo * bar

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


バックティックバージョンは廃止され、$(...)rtとは異なる動作をします。引用してエスケープします。バックティック内では、$(...)バックスラッシュセットがコマンド置換に使用されるため、異なる結果が得られます。 (\\&切り替えると、sed自体がsedに特別で、残りのバックスラッシュが特別な意味を取り除くため、sed\&印刷はリテラルになります。)&&

望むより:$(stuff)と `stuff`の違いは何ですか?


また、Bash 5.0には、バックスラッシュがある場合、文字列に他の実際のglob文字が含まれていなくても、文字列がglobとして扱われるのに十分なバグ/バグ機能があります。

2番目のコマンドでは、引用符のない拡張の結果はglobとして扱われ、\.\./\.\.たとえば同じ方法になります。 (パス名は江戸に常に存在する必要があります。もちろん、他の名前も一致する可能性があります。)../...[.]/.[.].?/.?../../.?/.?

同様に、次のようにfailglobトリガーできます。

bash-5.0.3$ shopt -s failglob
bash-5.0.3$ echo $(echo 'xxxxxx\x')
bash5.0.3: no match: xxxxxx\x

(しかししないecho xxxxxx\xでください。)

よりBash-5.1-ベータ発表 例えばbug-bashメーリングリストにこのバグを報告してください。

関連情報