这是a.sh
:
#!/bin/bash
echo $(ps ax |wc -l)
这是我在shell上看到的:
$ ps ax |wc -l
109
$ ./a.sh
111
显然这两个数字应该相同。差异似乎是ps
格式化结果的方式在bash脚本中有所不同,但我无法弄清楚为什么?这是在CentOS 7系统上。
修改
这不仅仅是由于某些评论使其发声而产生的额外shell进程问题。举个例子:
#!/bin/bash
echo "$(ps -ax |grep httpd)"
输出:
$ ./a.sh
10052 ? S 0:01 /usr/sbin/httpd -DFOREGROUND
10230 ? Ss 0:02 /usr/sbin/httpd -DFOREGROUND
13790 ? S 0:00 /usr/sbin/httpd -DFOREGROUND
13839 ? S 0:00 /usr/sbin/httpd -DFOREGROUND
13848 ? S 0:00 /usr/sbin/httpd -DFOREGROUND
13852 ? S 0:00 /usr/sbin/httpd -DFOREGROUND
16015 ? S 0:00 /usr/sbin/httpd -DFOREGROUND
18805 ? S 0:00 /usr/sbin/httpd -DFOREGROUND
18865 ? S 0:00 /usr/sbin/httpd -DFOREGROUND
18866 ? S 0:00 /usr/sbin/httpd -DFOREGROUND
18886 ? S 0:00 /usr/sbin/httpd -DFOREGROUND
$ ps ax|grep httpd
10052 ? S 0:01 /usr/sbin/httpd -DFOREGROUND
10230 ? Ss 0:02 /usr/sbin/httpd -DFOREGROUND
13790 ? S 0:00 /usr/sbin/httpd -DFOREGROUND
13839 ? S 0:00 /usr/sbin/httpd -DFOREGROUND
13848 ? S 0:00 /usr/sbin/httpd -DFOREGROUND
13852 ? S 0:00 /usr/sbin/httpd -DFOREGROUND
16015 ? S 0:00 /usr/sbin/httpd -DFOREGROUND
18805 ? S 0:00 /usr/sbin/httpd -DFOREGROUND
18865 ? S 0:00 /usr/sbin/httpd -DFOREGROUND
18866 ? S 0:00 /usr/sbin/httpd -DFOREGROUND
18886 ? S 0:00 /usr/sbin/httpd -DFOREGROUND
20565 pts/0 R+ 0:00 grep --color=auto httpd
所以这里shell脚本返回 less 行而不是bash prompt命令。
答案 0 :(得分:2)
看起来对我来说。运行./a.sh
时,将创建两个新进程 - 新bash
shell和bash
创建的$(...)
子shell。 (不是回声,就像我之前写的那样。即使使用/usr/bin/echo
,也不会在ps
之后运行,因此不会计算。)
$ ps -ax -o pid,cmd | wc -l
267
$ cat a.sh
#!/bin/bash
echo $( ps -ax -o pid,cmd | wc -l )
$ ./a.sh
269
现在摆脱额外的子shell:
$ cat b.sh
#!/bin/bash
ps -ax -o pid,cmd | wc -l
[jack@marta ~]$ ./b.sh
268
现在,通过不启动新shell来摆脱额外的过程:
$ source b.sh
267