1

これが私のbashスクリプトです:

#!/bin/bash

$(find / -name "foo" | grep "bar")

ps の出力は次のとおりです。

$ ps fx
PID TTY      STAT   TIME COMMAND
2690 ?        Sl     1:04 gnome-terminal
5903 pts/8    Ss     0:00  \_ bash
7003 pts/8    S      0:00      \_ bash -x ./test_script.sh
7004 pts/8    S      0:00      |   \_ bash -x ./test_script.sh
7005 pts/8    S      0:00      |       \_ find / -name foo
7006 pts/8    S      0:00      |       \_ grep bar

$ ps aux

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
1000      7003  0.0  0.0   5172  1108 pts/8    S    16:23   0:00 bash -x ./test_script.sh
1000      7004  0.0  0.0   5172   520 pts/8    S    16:23   0:00 bash -x ./test_script.sh
1000      7005  0.7  0.0   4720  1176 pts/8    S    16:23   0:00 find / -name foo
1000      7006  0.0  0.0   4368   824 pts/8    S    16:23   0:00 grep bar

私のスクリプトが実行されているインスタンスが 2 つありますが、bash がここで何をしているのか正確に教えてもらえますか? 具体的には、スクリプトのインスタンスが 2 つ実行されているのはなぜですか。これを行うためのより良い方法はありますか?

ありがとう

4

1 に答える 1

5

サブシェル (部分) を実行すると、$(...)bash はfork()呼び出しプロセス (サブシェル コマンドが実行される場所) のコピーを作成するシステム コールを使用します。スクリプトは再度実行されませんが、exec がないため、ここではコマンド ラインが親から継承されるだけです。子シェルでは、bash がパイプラインをセットアップします。これが、 と がその子として表示される理由findですgrep

于 2013-04-17T23:39:34.707 に答える