コマンド置換がスペースで区切られた一重引用符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番目の単語は次のようになります。
''
何もないことになる。\'
一重引用符('
)で'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
、さらに完全に安全です)。