入力がBashのパイプに送信される方法を理解する


17

パイプがbashでどのように機能するかはよくわかりません。

あるコマンドの出力を別のコマンドの入力として使用することを知っています。

コマンドが画面に出力するものなので、出力を取得できます。

しかし、コマンドが受け取る入力をどのように知ることができますか?

これがうまくいくと思った例です:

which gem | rm

残念ながらそうではありませんでした。

どのgemが出力される/usr/bin/gemので、それが正しい出力である必要がありますか?

私はそれがrmに与えられたと思ったので、それは信じられませんrm /usr/bin/gemが、私は間違っていました。

だから私の質問は、コマンドがどのような入力を取るのかをどうやって知るのですか?


2
他のこととは別にrm /usr/bin/gemひどい考えです。それgem(およびそれと一緒に使用するRubyインタープリター)をそのままにして、使用するRubyインタープリター(およびgem)をインストールしますrvmrvm.beginrescueend.com
Telemachus

回答:


23

「入力」と「コマンドライン引数」は異なるものです。

rm 引数として提供されたファイルを削除します。

パイプは、左側のコマンドの出力を右側のコマンドの入力にリダイレクトします。右側のプログラムのコマンドライン引数には影響しません。

あなたがしようとしていることを行うには、xargsプログラムを実行するために標準入力をコマンドライン引数に変換してみてください。それが仕事です。

which gem | xargs rm、たとえば、gemPATH内のを削除します。


12

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がファイル自体を開くのと同じ効果が得られます。

あるプログラムの出力を別のプログラムの引数として使用する場合は、バックティックを使用します。

rm `which gem`

または、この代替(bash固有)構文:

rm $(which gem)

編集:またはxargs別の回答者が指摘するように。コマンドラインで猫のスキンを作成する多くの方法。


cat file.txt | grep "foo"比べて何百倍も遅いことに注意してくださいgrep "foo" file.txt
-Borealid

1
これは私が取得できない部分です。引数と標準入力とは何ですか?
ajsie

8
@ajsie:プログラム名の後にEnterキーを押す前に入力すると、それは引数になります。実行開始後にプログラムに入力すると、標準入力になります。
ボレアリス

1
とった!これがすべてを説明しました。これで、コマンドを直接使用して、プロンプト(grep)が表示されるかどうかを確認できます。また、マニュアル(man grep)を読んでstd入力を使用するかどうかを確認できます。
ajsie

@ajsie:マンページに飛び込みたくない場合grep --helpは、受け入れられた引数の簡単な概要もあります。
-Borealid

3

man興味のあるコマンドのページをチェックしてください。これらのプログラムは、読み取り元であることを示しますstdinman grepstdinを読み取る一般的なコマンドを試してください)。


私が試したman grep | grep 'standard input'となったIf no file arguments are specified, the standard input is used.最後のマッチとして。👍私はgrep自分の薬を少し味見しなければなりませんでした。😎
ma11hew28

2

PATHにスペースを含むディレクトリがある場合、またはコマンド名にスペースが含まれている場合、これらはすべて危険です。

rm `which gem`       # Dangerous
rm $(which gem)      # Dangerous
which gem | xargs rm # Dangerous

GNU Parallel http:// www.gnu.org/software/parallel/にはその問題がないため、PATHにスペースを含むディレクトリがある場合、またはコマンド名にスペースが含まれている場合でも機能します。

which gem | parallel rm
parallel -a <(which bass) rm

GNU Parallelの紹介ビデオを見る:http : //www.youtube.com/watch?v=OpaiGYxkSuQ

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.