観察する:
mark@L-R910LPKW:~$ echo a b | xargs -d' ' -I{} bash -c 'echo {} 1'
a 1
b
bash: line 2: 1: command not found
mark@L-R910LPKW:~$
どうしたの?
ベストアンサー1
何かが間違っています。
b
出力に表示されるので処理されていますが、期待した方法ではありません。
最初のステップとして、bashが何を見るかを教えてくれます。-x
トレースを有効にするオプションを渡します。
$ echo a b | xargs -d' ' -I{} bash -x -c 'echo {} 1'
+ echo a 1
a 1
+ echo b
b
+ 1
bash: line 2: 1: command not found
echo a 1
したがって、期待どおりにbashが最初に呼び出されます。しかし、次の行はあなたが思うようには見えecho b
ません。echo b 1
余分な行があります1
。なぜ?
さて、xargsに空白に分割するように指示します。改行文字を含むa b
入力を渡しました。
したがって、xargsは入力にa
2つのフラグメントが含まれていることを確認しますb
。指示に従って、xargsは最初に各フラグメントでbashを呼び出してecho a 1
から実行しますecho b1
。
仕事を正しくする方法
find
の一部のバージョンでは、シェルの断片をxargs
含めることができます{}
。これはほとんど常に悪い考えであり、一部のファイル名やその他のデータが破損し、通常はセキュリティホールになります。データを別々のパラメータとして渡します。