パイプを使用してコマンドを減らします。

パイプを使用してコマンドを減らします。

私はPipe(|)がstdoutをサブシェルのstdinにパイプするために使用されることを学びました。

ただし、コマンドにはlessファイル名パラメーターが必要です。less file1.txt

しかしls -l /root | less

したがって、この場合は時間がかかりません。stdin 文書これはの標準出力でls -l /root作成されました。私の言葉は、実際にless stdin自分の入札が少ない時を意味します。ところで、別の命令のために混乱します。これはtrコマンドです。

trこのコマンドは何も許可しません。文書引数の例tr a-z A-Z file1.txt:キーボードからstdinを取得するか、stdinをリダイレクトします。ただし、ご注文はls -l /root | tr a-z A-Z可能です。まあ、私の家は間違っていた。

パイプラインは実際にどのように機能しますか?基本原理は、パイプがメインシェルの標準出力をサブシェルの標準入力に渡すことです。しかし、メインシェルの標準出力がサブシェルの標準入力に行くという事実は知りませんでした。文書あるいは、キーボードで文字を入力する必要がある状況かもしれません。しかし、上記の例を見ると、シェルは両方のケースを考慮します。

答え1

私はパイプ(|)が標準出力をサブシェルの標準入力に渡すために使用されることを学びました。

左のコマンド stdout を右のコマンド stdin に渡します。これらのコマンドの一方または両方がサブシェルで実行されるかどうかは、シェルの実装によって異なります。

それにもかかわらず、シェルは引数が両方のコマンドのいずれかに渡されるかどうか気にしません。プログラムは、標準入力と標準出力を無視するなど、適切であると判断されたとおりに動作できます。

ttyさらに、プログラムは標準入力がインタラクティブキーボードであるかどうかを検出し、それに応じて動作することができます。これはlessコマンドで観察されるものです。引数が与えられない場合、標準入力は通常読み込まれますが、そうであれば処理を拒否しますttyソースコード示す:

  if (isatty(fd0))
  {
    error("Missing filename (\"less --help\" for help)", NULL_PARG);
    quit(QUIT_OK);
  }

答え2

だから私はこの場合はless次のものが必要だと思います。stdin 文書これはの標準出力でls -l /root作成されました。

これは正確であり、あなたが観察したものと矛盾しませんtr

シェル管路Construct() は以下を生成します。PRODUCER | CONSUMER匿名パイププロセスPRODUCERCONSUMER。匿名パイプは、名前とディレクトリエントリがないが正常に読み書きできるファイル形式です。パイプでは、シェルはパイプの書き込み端を生産者の標準出力に接続し、パイプの読み取り端を消費者の標準入力に接続します。

このtrコマンドはstdinからデータを読み込み、stdoutにのみ書き込みます。lessこのコマンドは、コマンドラインにファイル名を渡さなかった場合にのみこれを行います。ファイル名を渡すと、less標準入力ではなくこのファイルから読み取られます。実行される操作は、lessファイルからデータを読み取る多くの同様のアプリケーションによる一般的な規則です。

あなたも正しいかもしれません。 。 。興味があるSTDOUTとSTDINを接続することはどういう意味ですか?そしてコマンドにどのように複数の出力がありますか?

関連情報