Bashは「>>()」をどのように処理しますか?

Bashは「>>()」をどのように処理しますか?

出力リダイレクトとプロセス置換の実験中に、偶然に次のコマンドとその結果の出力が見つかりました。

    me@elem:~$ echo foo >>(cat);echo 列
    バー
    私 @elem:~$ foo

(はい、最後に空白の改行は意図的なものです。)

したがって、bash echoのバーは一般的なプロンプト、echoのfoo、echoの改行を印刷し、そこにカーソルを置きます。もう一度Enterを押すと、新しい行にプロンプ​​トが表示され、その後にカーソルが残ります(誰かが空のコマンドラインでEnterを押したときに期待どおり)。

私はファイル記述子にfooを書き、catを読んでfooをエコーし​​、2番目はecho barに書き込んでからコマンドプロンプトに戻ることを期待しています。しかし、これは明らかに真実ではありません。

何が起こっているのかを説明できる人はいますか?

ベストアンサー1

時間に応じて、プロンプトの前foobar後、または後にコンテンツが表示されることがあります。bar一貫したタイミングのために少しの遅延を追加します。

$ echo foo > >(sleep 1; cat); echo bar; sleep 2 
bar
foo
$

barすぐに表示され、foo1秒後に表示され、1秒後に次のプロンプトが表示されます。

何が起こるかは、bashがバックグラウンドでプロセス交換を実行することです。

  1. 基本的なbashプロセスは実行のためにサブシェルを起動し、sleep 1; catそれらのパイプを設定します。
  2. 基本bashプロセスが実行されますecho foo。これはパイプのバッファを埋めないため、echoコマンドはブロックせずに終了します。
  3. 基本bashプロセスが実行されますecho bar
  4. 基本bashプロセス開始コマンドsleep 2
  5. 同時に、サブシェルはコマンドを実行しますsleep 1
  6. 約1秒後にsleep 1子プロセスに戻ります。サブプロセスは引き続き実行されますcat
  7. cat入力を出力(画面に表示)にコピーし、その逆にコピーします。
  8. サブシェルが操作を終了して終了します。
  9. 1秒後にsleep 2戻ってください。デフォルトのシェルプロセスが実行を完了し、次のプロンプトが表示されます。

おすすめ記事