这是我的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个实例被执行,是否有更好的方法呢?
由于
答案 0 :(得分:5)
当您运行子shell($(...)
部分)时,bash使用fork()
系统调用来创建调用进程的副本(将执行您的subshell命令)。您的脚本没有再次运行,而是命令行只是从父级继承,因为没有exec。在子shell中bash设置了管道,这就是为什么你看到find
和grep
作为它的孩子。