いくつかのコマンドが標準入力から読み取られないのはなぜですか?

いくつかのコマンドが標準入力から読み取られないのはなぜですか?

パイプを使用する必要がある場合とパイプを使用しないでください。

たとえば、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の違いは何ですか?私は両方を見る。sortkillrmls

これフィルター側面

  • 最初のタイプのプログラムとも呼ばれます。フィルター。ファイルまたはSTDINから入力を受け取り、修正し、主にSTDOUTなどのいくつかの出力を生成します。これは、他のプログラムをソースとターゲットとして使用するパイプラインで使用するためのものです。

  • 2番目のタイプのプログラムは入力に応じて動作しますが、提供される出力は通常入力から独立しています。kill正常に動作するときは出力もなく、何もありませんrm。成功を示す戻り値だけで済みます。通常、STDINから入力を受けませんが、ほとんどはSTDOUTに出力を提供します。

lsフィルターの側面は。もちろん、入力があるかもしれませんが(必ずしもそうではありません)、出力はその入力と密接に関連していますが、フィルタとして機能することはできません。しかし、これらのプログラムの場合、別の側面が有効です。

これ意味論側面

  • フィルタの場合、入力は次のようになります。意味上意味なし。彼らはただデータを読み、データを修正し、データを出力します。これが値のリストなのか、一部のファイル名なのか、HTMLソースコードなのかは関係ありません。このデータの意味は、コードによってのみ提供されます。あなたフィルタに正規表現grep、ルール、awkまたはPerlプログラムを提供します。

  • killまたはなどの他のプログラムの場合、ls入力に重要性、ㅏ表現するkillプロセスID、lsファイル名、またはパス名が必要です。任意のデータを処理できず、意図したものでもありません。これらの多くは入力やパラメータを必要としませんps。たとえば、通常はSTDINから読み込まれません。

これら2つの側面を組み合わせることができます。フィルタは、入力がプログラムに意味論的な意味を持たないプログラムです。

明らかに、この哲学についてどこかで読んだでしょう。しかし、今はどんなソースも覚えていません。申し訳ありません。ソースがある方は自由に修正してください。

おすすめ記事