パイプを使用する必要がある場合とパイプを使用しないでください。
たとえば、PDFファイルを処理する一部のプロセスを終了するには、パイプを使用して次のことを行うことはできません。
ps aux | grep pdf | awk '{print $2}'|kill
代わりに、次の方法でのみこれを達成できます。
kill $(ps aux| grep pdf| awk '{print $2}')
または
ps aux | grep pdf | awk '{print $2}'| xargs kill
man bash
(バージョン)によると4.1.2
:
The standard output of command is connected via a pipe to the standard input of command2.
上記のシナリオの場合:
- 標準入力
grep
は標準出力ですps
。これはうまくいきます。 - 標準入力
awk
は標準出力ですgrep
。これはうまくいきます。 - 標準入力
kill
は標準出力ですawk
。それは動作しません。
次のコマンドの標準入力は、常に前のコマンドの標準出力から入力されます。
kill
またはで動作しないのはなぜですかrm
?kill
入力rm
と入力grep
の違いは何ですかawk
?- どんなルールがありますか?
ベストアンサー1
これはUnix/Linuxの哲学の一部を扱う興味深い質問です。
grep
それでは、、同じプログラムと、同じプログラムsed
の違いは何ですか?私は両方を見る。sort
kill
rm
ls
これフィルター側面
最初のタイプのプログラムとも呼ばれます。フィルター。ファイルまたはSTDINから入力を受け取り、修正し、主にSTDOUTなどのいくつかの出力を生成します。これは、他のプログラムをソースとターゲットとして使用するパイプラインで使用するためのものです。
2番目のタイプのプログラムは入力に応じて動作しますが、提供される出力は通常入力から独立しています。
kill
正常に動作するときは出力もなく、何もありませんrm
。成功を示す戻り値だけで済みます。通常、STDINから入力を受けませんが、ほとんどはSTDOUTに出力を提供します。
ls
フィルターの側面は。もちろん、入力があるかもしれませんが(必ずしもそうではありません)、出力はその入力と密接に関連していますが、フィルタとして機能することはできません。しかし、これらのプログラムの場合、別の側面が有効です。
これ意味論側面
フィルタの場合、入力は次のようになります。意味上意味なし。彼らはただデータを読み、データを修正し、データを出力します。これが値のリストなのか、一部のファイル名なのか、HTMLソースコードなのかは関係ありません。このデータの意味は、コードによってのみ提供されます。あなたフィルタに正規表現
grep
、ルール、awk
またはPerlプログラムを提供します。kill
またはなどの他のプログラムの場合、ls
入力に重要性、ㅏ表現する。kill
プロセスID、ls
ファイル名、またはパス名が必要です。任意のデータを処理できず、意図したものでもありません。これらの多くは入力やパラメータを必要としませんps
。たとえば、通常はSTDINから読み込まれません。
これら2つの側面を組み合わせることができます。フィルタは、入力がプログラムに意味論的な意味を持たないプログラムです。
明らかに、この哲学についてどこかで読んだでしょう。しかし、今はどんなソースも覚えていません。申し訳ありません。ソースがある方は自由に修正してください。