例:
ls | echo
は何も表示しません(実際には空白行)。私はそれがファイルのリストを印刷することを期待するでしょう。
一方、ls | grep 'foo'
は期待通りに動作します(名前に 'foo'を含むファイルを表示します)。
このような状況で私がすることは、ls | while read OUT; do echo $OUT; done
のようなものですが、これはかなり面倒です。
なぜ配管は他のコマンドではなくいくつかのコマンドで動作しますか?どうすればこの問題を回避できますか?
コマンドライン引数と標準入力には違いがあります。パイプはあるプロセスの標準出力を別のプロセスの標準入力に接続します。そう
ls | echo
Lsの標準出力をechoの標準入力に接続します。いいですか?そう、echoは標準入力を無視し、そのコマンドライン引数をダンプします - この場合はなにもしません - それ自身の標準出力。出力:まったく何もありません。
この場合、いくつか解決策があります。 1つは、catのように、標準入力を読み、標準出力にダンプするコマンドを使用することです。
ls | cat
あなたの仕事の定義が何であるかに応じて、「働きます」。
しかし、一般的な場合はどうでしょうか。あなたが本当に欲しいのは、あるコマンドの標準出力を別のコマンドライン引数に変換することです。他の人が言っているように、このケースではxargs
が標準的なヘルパーツールです。その標準入力からコマンドの引数を読み、実行するコマンドを構築します。
ls | xargs echo
置換コマンド$()
を使ってこれを変換することもできます
echo $(ls)
また、あなたが望むことをするでしょう。
これらのツールはどちらもシェルスクリプティングの中核をなすものです。両方を学ぶ必要があります。
完全性のために、あなたが問題で示すように、標準入力をコマンドライン引数に変換するためのもう一つの基本的な方法はシェルの組み込みのread
コマンドです。 「単語」(IFS
変数で定義されている単語)を一時変数に変換します。この変数は、どのコマンド実行でも使用できます。
echo
は入力を読み取らないため、ls | echo
は空白行のみを出力します。パイプラインの最後のコマンドは、実際には空行以外の何も表示しないecho
です。
一般に
a | b
a
の出力がb
の入力になるようにします。 man bash
のPipelines
セクションを読むことをお勧めします。
ls
とecho
を一緒に使いたいのなら、ここでいくつかの(かなり役に立たない)例を挙げます。
ls | xargs -L 1 echo
echo `ls`
for i in `ls` ; do echo $i ; done
echo
を使いたい場合はls
コマンドを試してください。
ls | xargs echo
これはecho
の出力でls
を呼び出します。
単に使用しないのはなぜですか。
echo `ls`
もっと安全です。
echo "`ls -lrt`"