リダイレクトとパイプ

リダイレクトとパイプ

リダイレクトとパイプの違いと関係を知りたいです。

  1. パイプは、コマンドのstdout出力を他のコマンドのstdin入力に接続するためにのみ使用されますか?
  2. リダイレクトは、コマンドのstdout出力をファイルに接続し、ファイルをコマンドのstdin入力に接続するためにのみ使用されますか?しかし、あるようですcommand >& 2
  3. パイプはcom1 | com2リダイレクトに置き換えることができますcom1 > tempfile; com2 < tempfile。ファイルを使用しないように代替アイテムを変更できますか?
  4. リダイレクトをパイプに置き換えることはできますか?

ありがとうございます!

ベストアンサー1

  1. はい。より正確には、シェルでは、パイプは左コマンドの標準出力を右コマンドの標準入力に接続します。より正確には、foo | barシェルの場合は次のことを意味します。

    1. 作る管路
    2. 子プロセスをフォークし、パイプの書き込み端を標準出力に接続します。次に、fooこのサブプロセスで実行します。
    3. サブプロセスをフォークし、パイプの読み取り端を標準入力に接続します。次に、barこのサブプロセスで実行します。
    4. 両方の子プロセスが終了するのを待ちます。
  2. はい。通常のリダイレクトはファイルを名前で表します。>fooリダイレクトの別の形式は、次にファイルを表します。記述子。たとえば、>&2「ファイル記述子2が現在接続されているすべての項目に標準出力をリダイレクトする」などです。

    このトピックでは、リダイレクトが左から右に処理されることに注意してください。たとえば、標準出力と標準エラーを同じファイルにリダイレクトするには、を使用しますfoo >filename 2>&1。ターミナルに入力したコマンドは、foo 2>&1 >filenameまず標準エラーをターミナルに接続します(この時点では、標準出力と標準エラーがまだターミナルに接続されているため違いはありません)、次に標準出力をファイルに接続します。

  3. はい、でも。シェルのパイプコンストラクタは匿名パイプを生成します。名前付きパイプ

    mkfifo f
    cat f
    # (in another terminal)
    echo hello >f
    

    名前付きパイプはパイプよりはるかに一般的ではありません。 2つの独立した起動プロセスをリンクする必要がある場合は、この機能を使用してください。頻繁には発生しませんが、必要に応じて使用することをお勧めします。

    あなたが提供した交換はfoo >tempfile; bar <tempfile異なります。まず、fooすべての出力を一時ファイルに書き込み、bar実行を開始します。パイプを介してコマンドを並列に実行できます。

  4. はい、しかしそれほど役に立ちません。

    cat input_file | some_command   # a uselessly complicated way of writing some_command <input_file
    echo hello | tee output_file    # a uselessly complicated way of writing echo hello >output_file
    

おすすめ記事