コマンドライン引数と標準入力は区別されています。パイプは、あるプロセスの標準出力を別のプロセスの標準入力に接続します。つまり、
ls | echo
は、ls の標準出力を echo の標準入力に接続します。いいですよね?さて、echo は標準入力を無視して、コマンドライン引数(この場合は何も出力されません)を自身の標準出力にダンプします。出力は、何も出力されません。
この場合の解決策はいくつかあります。一つは、標準入力を読み込んで標準出力にダンプするコマンドを使用することです。
ls | cat
このコマンドは、あなたの作業の定義にもよりますが、「動作」するでしょう。
ls | xargs echo
は「動く」でしょう。あなたが本当に欲しいのは、あるコマンドの標準出力を別のコマンドラインの引数に変換することです。他の人が言っているように、xargs
はこの場合の典型的なヘルパーツールであり、標準入力からコマンドのコマンドライン引数を読み込んで、実行するコマンドを構築します。
echo $(ls)
置換コマンド $()
0x1&
を使って、これを多少変換することもできます。
これらのツールはどちらもシェルスクリプトの中核をなすものなので、両方を学ぶべきです。
完全性を期すために、ご質問にあるように、標準入力をコマンドラインの引数に変換するもう一つの基本的な方法は、シェルに内蔵されているread
コマンドです。これは「ワード」(変数 IFS
で定義されたワード)をテンポラリ変数に変換します。