这是我的bash脚本:
#!/bin/bash
$(find / -name "foo" | grep "bar")
Run Code Online (Sandbox Code Playgroud)
这是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
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我的脚本有2个实例被执行,有人能告诉我bash在这里做了什么吗?具体来说,为什么我的脚本有2个实例被执行,有没有更好的方法呢?
谢谢
当您运行子shell($(...)部件)时,bash使用fork()系统调用,该调用创建调用进程的副本(将执行您的subshell命令).您的脚本没有再次运行,而是命令行只是从父级继承,因为没有exec.在子shell中bash设置了管道,这就是你看到它find和grep它的孩子的原因.
| 归档时间: |
|
| 查看次数: |
199 次 |
| 最近记录: |