コマンドの置換 - 一重引用符とスペース

コマンドの置換 - 一重引用符とスペース

コマンド置換がスペースで区切られた一重引用符POSIXパスのリストを渡すにはどうすればよいですか?

command1 $(command2)
command1 '/path/to/file 1' '/path/to/file 2' '/path/to/file 3'

拡張機能をどのように追跡しますか?

ベストアンサー1

を使用して、どのコマンドが実行されているかを正確に確認できますset -x。やや愚かな例:

$ echo $(echo "foo 'bar baz' taz\\ jaz")
foo 'bar baz' taz\ jaz

減らす:

++ echo 'foo '\''bar baz'\'' taz\ jaz'
+ echo foo ''\''bar' 'baz'\''' 'taz\' jaz
foo 'bar baz' taz\ jaz

すべてのエスケープのため読書が少し難しいです。たとえば、2番目の単語は次のようになります。

  1. ''何もないことになる。
  2. \'一重引用符(')で
  3. 'bar'~になるbar

したがって、パラメータはに渡されます'bar。次のようにこれを確認できます(Data::Dumpがインストールされていると仮定しますが、残念ながらデフォルトではありません)。$(echo…これはPerl行にそのままコピーされました。

$ perl -MData::Dump=pp -E 'pp @ARGV' $(echo "foo 'bar baz' taz\\ jaz")
("foo", "'bar", "baz'", "taz\\", "jaz")

ここで何が起こるのかは、bashが$IFS引数解析ではなく単語分割(offベース)を実行することです。したがって、残念ながら、それを使用し、evalそれに伴うすべてのリスクを処理する必要があるかもしれません。

$ eval "echo $(echo "foo 'bar baz' taz\\ jaz")"
foo bar baz taz jaz

(また、コマンドがNULで区切られた名前のリストで出力を生成することができる場合は、次のようにします。シンプル取り扱いの使用xargs -0、さらに完全に安全です)。

おすすめ記事