「入力」と「コマンドライン引数」は別物です。
rm 引数として提供されたファイルを削除します。
パイプは、左側のコマンドの出力を右側のコマンドの入力にリダイレクトします。右側のプログラムのコマンド ライン引数には影響しません。
あなたがやろうとしていることをするために、 xargs を使ってみてください プログラムを実行するために、標準入力をコマンドライン引数に変換します。それがその仕事です。
which gem | xargs rm 、たとえば、 gem を削除します
rm 入力をとらず、引数を取ります。これらは異なります。引数は、コマンド ラインでプログラムの動作に影響を与えるスイッチやファイル名などです。入力は、プログラムが処理するデータです。例:grep 入力と引数の両方を取ります:
grep "foo" file.txt
2 つの引数があります "foo" と file.txt . 入力 コンテンツです file.txt の 、文字列 file.txt ではありません 自体。 grep は入力を受け取るので、パイプで使用できます:
cat file.txt | grep "foo"
cat は file.txt を取っているため、同じ出力が生成されます。 引数として、コンテンツを生成します file.txt の 出力として。その出力は次に grep にパイプされ、最初の例のように grep でファイル自体を開くのと同じ効果が得られます。
1 つのプログラムの出力を 引数 として使用する場合 別のものにするには、バッククォートを使用します:
rm `which gem`
または、この代替 (bash 固有の) 構文:
rm $(which gem)
編集:または xargs 別の回答者が指摘するように。コマンド ラインで猫の皮を剥ぐ方法はたくさんあります。
man をチェックしてください 興味のあるコマンドのページ。これらのプログラムは、stdin から読み取ることを示します。 (man grep を試してください stdin を読み取る一般的なコマンドの場合)。