web-dev-qa-db-ja.com

「xargs」とコマンド置換の違いは?

多くの場合、xargsの代わりにコマンド置換を使用します。たとえば、rm $(ls)ls | xargs rmと同じです

それらの違いは何ですか?

違いの1つは、xargsが現在のシェルで実行されている間にコマンド置換がサブシェルで実行されることだと思いますが、よくわかりません。

違いをリストしてください。

13
Sinoosh

1つの違いは、パイプの代わりにコマンド置換を使用する場合、渡されるデータのサイズはコマンドバッファーのサイズによって制限されるため、場合によっては警告なしで切り捨てられることです。これは、次のコマンドに渡される前に、コマンド出力全体を生成し、メモリに保存する必要があることも意味します。そのため、大きな出力では、必要以上のメモリを使用できます。

最初の方法の別の問題は、出力が空白で分割されるため、スペースを含むファイル名を処理できないことです。 xargsも空白の問題の影響を受けますが、使用する区切り文字を変更することで修正できます。ちなみにファイル名を適切に処理するには、2番目の例で区切り文字としてヌルバイトを使用する必要があります。

3番目の問題は、グロブが展開されるため、ファイルの名前にアスタリスクまたは疑問符が含まれている場合、予期しない結果が生じることです。

この問題に関する素敵な議論はここにあります: http://mywiki.wooledge.org/ParsingLs

正しい構文は

echo rm *

またはxargsを使用する必要がある場合、

find . -maxdepth 1 -print0 | xargs -0 echo rm

出力が正しいように見えたら、echoを削除します。

9
user000001