inotifywait
/ tmpディレクトリで新しいファイルを監視し、出力を次にパイプする非常に簡単なスクリプトがありますsed
。
#!/bin/bash
/usr/local/bin/inotifywait -q -m /tmp --format %f | sed 's/a/b/'
thenの出力を確認すると、これが表示され、pstree
実際inotifywait
にsed
実行中です。
|-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
これはシェル組み込みコマンドではなく、シェル構文の一部です。
結論:そのシェルの作成者ではなく、その特定のシェルで現在期待されている方法で操作が機能していることを確認したくない限り、複雑なシェルコマンドで親と子の関係を分析しようとしないでください。