为什么bash在$()中使用管道时执行我脚本的2个实例

时间:2013-04-17 23:32:16

标签: linux bash shell

这是我的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个实例被执行,是否有更好的方法呢?

由于

1 个答案:

答案 0 :(得分:5)

当您运行子shell($(...)部分)时,bash使用fork()系统调用来创建调用进程的副本(将执行您的subshel​​l命令)。您的脚本没有再次运行,而是命令行只是从父级继承,因为没有exec。在子shell中bash设置了管道,这就是为什么你看到findgrep作为它的孩子。