首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当在$()中使用管道时,为什么bash执行我的脚本的两个实例

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

Stack Overflow用户
提问于 2013-04-18 07:32:16
回答 1查看 202关注 0票数 1

下面是我的bash脚本:

代码语言:javascript
复制
#!/bin/bash

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

下面是ps的输出:

代码语言:javascript
复制
$ 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在这里到底在做什么?具体地说,为什么我的脚本有两个实例在执行,有没有更好的方法?

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-18 07:39:35

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16072051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档