以下是一个脚本:
$ cat test.sh
#!/bin/sh
echo ------------------------
date
OCCURANCE=`ps -ef|grep "test.sh" | grep -vc grep`
ps -ef|grep "test.sh" | grep -vc grep
ps -ef|grep "test.sh" | grep -v grep
echo $OCCURANCE
Linux中的输出:
------------------------
Mon Apr 29 10:36:38 GMT 2013
1
tmon 15565 7469 0 10:36 pts/0 00:00:00 /bin/sh ./test.sh
2
SunOS中的输出:
------------------------
Monday, April 29, 2013 10:33:47 AM GMT
1
tmon 21248 17305 0 10:33:48 pts/7 0:00 /bin/sh ./test.sh
1
根据代码,2个数值应该相同。 但是,为什么SunOS和Linux都是假的呢?
答案 0 :(得分:1)
在Linux中,反引号生成的子shell在ps
的输出中有一个包含字符串test.sh
的条目。在Sun上,它没有。
答案 1 :(得分:1)
/bin/sh
可能是bash
的符号链接。您的脚本正在启动子shell,导致另一个进程。
另一方面,ksh
中的子shell不要求单独的过程。尝试在ksh
中运行代码,您将看到预期的输出。
同样,在SunOS上使用的shell可能不是bash
。如果您尝试在Solaris上使用bash
,您会注意到与Linux类似的行为。