使用する:
ls | xargs -t -i{} echo {} 2>&1 >/dev/null
2>&1
は、標準エラーをxargs
現在の標準出力の送信先に送信します。は>/dev/null
元の標準出力をに送信します/dev/null
。したがって、最終的な結果として、標準出力にはechoコマンドが/dev/null
含まれ、ファイル名が含まれます。ファイル名のスペースについて、また、sed
スクリプトを使用して各行の先頭に「echo」を配置する方が簡単かどうか(-t
オプションなし)、または次を使用できるかどうかについて議論できます。
ls | xargs -i{} echo echo {}
(テスト済み:Solaris 10、Korn Shell;他のシェルおよびUnixプラットフォームで動作するはずです。)
コマンドの内部動作を確認してもかまわない場合は、xargs
実行されたコマンドのエラー出力とエラー出力を分離することができました。
al * zzz | xargs -t 2>/tmp/xargs.stderr -i{} ksh -c "ls -dl {} 2>&1"
(非標準)コマンドal
は、引数を1行に1つずつリストします。
for arg in "$@"; do echo "$arg"; done
最初のリダイレクト(2>/tmp/xargs.stderr
)は、エラー出力をからxargs
ファイルに送信します/tmp/xargs.stderr
。実行されるコマンドは' ksh -c "ls -dl {} 2>&1"
'です。これは、Kornシェルを使用しls -ld
てファイル名で実行され、エラー出力は標準出力に送られます。
の出力は/tmp/xargs.stderr
次のようになります。
ksh -c ls -dl x1 2>&1
ksh -c ls -dl x2 2>&1
ksh -c ls -dl xxx 2>&1
ksh -c ls -dl zzz 2>&1
エラーをテストしていることを確認するためにls -ld
、の代わりに''を使用しました。ファイル、、、およびが存在しましたが、そうではありません。echo
x1
x2
xxx
zzz
標準出力の出力は次のようになりました。
-rw-r--r-- 1 jleffler rd 1020 May 9 13:05 x1
-rw-r--r-- 1 jleffler rd 1069 May 9 13:07 x2
-rw-r--r-- 1 jleffler rd 87 May 9 20:42 xxx
zzz: No such file or directory
コマンドを''でラップせずに実行するksh -c "..."
と、I / Oリダイレクトが引数としてコマンド(' ls -ld
')に渡されたため、ファイル''が見つからなかったことが報告されました2>&1
。つまりxargs
、シェル自体を使用してI/Oリダイレクトを実行しませんでした。
他のさまざまなリダイレクトを手配することは可能ですが、基本的な問題は、xargs
それ自体のエラー出力を実行するコマンドのエラー出力から分離するための準備がないため、実行が難しいことです。
もう1つの明らかなオプションはxargs
、シェルスクリプトを記述してから、シェルにそれを実行させることです。これは私が前に示したオプションです:
ls | xargs -i{} echo echo {} >/tmp/new.script
次に、次のコマンドを確認できます。
cat /tmp/new.script
次のコマンドを実行して、エラーを破棄できます。
sh /tmp/new.script 2>/dev/null
また、コマンドからの標準出力も表示したくない場合は、コマンド1>&2
の最後に追加してください。