ps出力にパイプラインプロセスを表示するには?

ps出力にパイプラインプロセスを表示するには?

inotifywait/ tmpディレクトリで新しいファイルを監視し、出力を次にパイプする非常に簡単なスクリプトがありますsed

#!/bin/bash

/usr/local/bin/inotifywait -q -m /tmp --format %f | sed 's/a/b/'

thenの出力を確認すると、これが表示され、pstree実際inotifywaitsed実行中です。

  |-bash(20568)---test(8208)-+-inotifywait(8209)
  |                          `-sed(8210)

inotifywaitここで、whileループの出力を直接パイプするのではなく、次にパイプする場合sed

#!/bin/bash

/usr/local/bin/inotifywait -q -m /tmp --format %f | 
  while IFS= read -r file; do
    sed 's/a/b/' "$file"
  done

..次によるとpstree

    |-bash(20568)---test(8979)-+-inotifywait(8980)
    |                          `-test(8981)

..そしてps

$ ps -p 8981 -o command
COMMAND
/bin/bash ./test
$

..外部ユーティリティではなくシェルを起動しますsed。シェルが組み込まれているwhileのでこれは正しいですか?bash

答え1

パイプラインのプロセス関係は、主に使用するシェルによって異なります。

最新のシェルは、パイプラインのすべての単純なプロセス(コマンド)をプライマリシェルの子として直接作成します。

以前のシェルでは、実装ごとに異なる方法でこれを実行していました。

入力がリダイレクトされると、一部のシェルはサブシェル内でwhileループを実行しますが、他のシェルはそうではありません。

whileこれはシェル組み込みコマンドではなく、シェル構文の一部です。

結論:そのシェルの作成者ではなく、その特定のシェルで現在期待されている方法で操作が機能していることを確認したくない限り、複雑なシェルコマンドで親と子の関係を分析しようとしないでください。

関連情報