xargs:各行に対してコマンドを実行し、引数をスペースで区切りますか?

xargs:各行に対してコマンドを実行し、引数をスペースで区切りますか?

wsl.exe を使用して、cygwin bash と oh-my-zsh でこの問題を再現できます。私の意図は、コマンドラインから次の2行を実行することです。

npm rm plugin-alias
npm i -D plugin-alias

私はこれをしようとしています:

echo -ne "rm\0i -D\0" | xargs -t -0 -IREPLACE npm REPLACE plugin-alias

よく走っていますrm-t実行中ですnpm rm plugin-alias。しかしi -D、エラー:

npm 'i -D' plugin-alias
Unknown command: "i -D"

i -Dxargsを複数の引数で渡して実行する方法はありますかnpm i -D plugin-alias

,区切り記号を and に変更してみました\nが違いがないようです。

引用符を削除する必要がある場合は、sedそうします。しかし、xargsこれによって発生する問題が解決されることを願っています。


更新:@muruが役に立つコメントを提供しました。

@muru:実際の引用は含まれていません。

私:それでは、なぜ不明なコマンド:「i -D」というエラーメッセージが表示されますか?

@muru:xargsはi -Dを次のように提供するためです。単一引数npmで。

これで理解したので、タイトルをより正確に編集できます。より良い検索可能性のために、元のタイトルは「xargsが空白のエントリを引用する理由とそれを防ぐ方法は何ですか?」でした。

ベストアンサー1

答え:

xargs:各行に対してコマンドを実行し、引数をスペースで区切りますか?

テーマでは、これが-L¹オプションが使用される用途です。

xargs -L1 cmd << 'EOF'
1 2 3
first 'second arg'
"a 1" b\
2
EOF

cmdそれぞれ実行されます1 Lイネ入力(論理行、2番目のパラメータに含まれる改行文字を引用し、末尾のスペースを使用すると長い行を分割できるため、3行目は2つの物理行で構成されていることがわかります)、各行を次に分割します。議論を中心に。

-Iただし、GNUスタイルと組み合わせることはできません-0

これはどのような引用を理解するので(構文は現代のシェルの構文とは異なることに注意してください)、任意の引数を指定することができます(制限は実装によって異なります²) -0

BSDの場合、xargswhileと組み合わせて-J次のことができます。

xargs -rL1 -J {} npm {} plugin-alias << 'EOF'
rm
i -D
EOF

他の実装では、次のようにshパラメータの順序を変更できます。

xargs -L1 sh -c '[ "$#" -eq 0 ] || exec npm "$@" plugin-alias' sh << 'EOF'
rm
i -D
EOF

(ここは[ "$#" -eq 0 ] ||非標準代替品としても使用されます-r)。


1 GNUxargsには廃止予定の-l非標準が1つ以上あります-L 1-lたとえば、次のように複数行を使用することもできます。代わりに-Lオプションに追加する必要があります。または)。-l1-l 1-L1-L 1

²たとえば、一部はテキストではなく入力を妨げ、一部はコマンドラインの長さまたは個々の引数の制限が非常に低く、一部はファイルの終わりを理解し_ます...また、区切り文字として認識される文字のリスト以下によって異なります。いくつかの実装とロケール設定。

おすすめ記事