2010-09-16 13:40:08 +0000 2010-09-16 13:40:08 +0000
88
88

コマンド出力を他のコマンドにパイプするには?

例:

ls | echo は何も表示しません (実際には空行です)。ファイルのリストを表示するのではないかと期待しています。一方、

ls | grep 'foo' は期待通りに動作します (名前に ‘foo’ が含まれるファイルを表示します)。

このような状況で私がやっていることは、次のようなことです。ls | while read OUT; do echo $OUT; done しかし、これはかなり面倒です。

なぜパイピングはいくつかのコマンドでは動作するのに、他のコマンドでは動作しないのですか?どうすればこの問題を回避できますか?

回答 (4)

123
123
123
2010-09-16 14:16:59 +0000

コマンドライン引数と標準入力は区別されています。パイプは、あるプロセスの標準出力を別のプロセスの標準入力に接続します。つまり、

ls | echo

は、ls の標準出力を echo の標準入力に接続します。いいですよね?さて、echo は標準入力を無視して、コマンドライン引数(この場合は何も出力されません)を自身の標準出力にダンプします。出力は、何も出力されません。

この場合の解決策はいくつかあります。一つは、標準入力を読み込んで標準出力にダンプするコマンドを使用することです。

ls | cat

このコマンドは、あなたの作業の定義にもよりますが、「動作」するでしょう。

ls | xargs echo

は「動く」でしょう。あなたが本当に欲しいのは、あるコマンドの標準出力を別のコマンドラインの引数に変換することです。他の人が言っているように、xargs はこの場合の典型的なヘルパーツールであり、標準入力からコマンドのコマンドライン引数を読み込んで、実行するコマンドを構築します。

echo $(ls)

置換コマンド $()

0x1&

を使って、これを多少変換することもできます。

これらのツールはどちらもシェルスクリプトの中核をなすものなので、両方を学ぶべきです。

完全性を期すために、ご質問にあるように、標準入力をコマンドラインの引数に変換するもう一つの基本的な方法は、シェルに内蔵されているreadコマンドです。これは「ワード」(変数 IFS で定義されたワード)をテンポラリ変数に変換します。

19
19
19
2010-09-16 13:54:37 +0000

パイプラインの最後のコマンドは実際にはls | echoであり、何も表示されません。

一般的に。

a | b

は、echo の出力が echo の入力になるようにします。abの部分を読むことをお勧めします。


どうしてもPipelinesman bashを一緒に使いたい場合は、いくつかの(かなり役に立たない)例を紹介します。

ls | xargs -L 1 echo
echo `ls`
for i in `ls` ; do echo $i ; done
13
13
13
2010-09-16 14:03:04 +0000

echoコマンドをlsしたい場合は、以下のようにしてみてください。

ls | xargs echo

これでechoが呼び出され、lsの出力が得られます。

3
3
3
2011-11-09 09:48:27 +0000

単純に以下のようにしてみてはいかがでしょうか。

echo `ls`

あるいはもっと安全な方法があります。

echo "`ls -lrt`"