printf "%s" `echo ../.. | sed 's/[.]/\\&/g'`
printf "%s" $(echo ../.. | sed 's/[.]/\\&/g')
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
でください。)