xargsが最後の引数を処理しないのはなぜですか?

xargsが最後の引数を処理しないのはなぜですか?

観察する:

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は入力にa2つのフラグメントが含まれていることを確認しますb␤。指示に従って、xargsは最初に各フラグメントでbashを呼び出してecho a 1から実行しますecho b␤1

仕事を正しくする方法

findの一部のバージョンでは、シェルの断片をxargs含めることができます{}。これはほとんど常に悪い考えであり、一部のファイル名やその他のデータが破損し、通常はセキュリティホールになります。データを別々のパラメータとして渡します。

「find -exec sh -c」を使っても安全ですか?

おすすめ記事