PS命令在shell脚本中返回不同的格式

时间:2017-06-01 18:13:28

标签: linux bash

这是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命令。

1 个答案:

答案 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