下面是我的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正如您所看到的,我的脚本有两个实例正在执行,谁能告诉我bash在这里到底在做什么?具体地说,为什么我的脚本有两个实例在执行,有没有更好的方法?
谢谢
发布于 2013-04-18 07:39:35
在运行子subshell ( $(...)部分)时,bash使用fork()系统调用,该系统调用将创建调用进程(执行子subshell命令的位置)的副本。您的脚本不会再次运行,而是命令行从父级继承而来,因为这里没有exec。在子shell中,bash设置管道,这就是为什么您会看到find和grep是它的子级。
https://stackoverflow.com/questions/16072051
复制相似问题