perl grep和cli grep之间的不一致

Cra*_*lus 0 linux perl grep

我正在做以下事情:

#!/usr/bin/perl  
use strict;  
use warnings;  

my $proc = `ps -ef|grep -c myscriptname`;  
print $proc;  
Run Code Online (Sandbox Code Playgroud)

当我在脚本中运行它时,它会打印2.

ps -ef|grep -c myscriptname在命令行上只显示:1
为什么?

同样的 my $proc = qx/ps -ef|grep -c myscriptname/

更新
要明确我运行此片段somerandomscript.pl

更新2
遵循edorqui的建议我删除-c获取:

12013 15777 15776 0 14:11 pts/6 00:00:00 sh -c ps -ef | grep myscriptname   
12013 15779 15777 0 14:11 pts/6 00:00:00 grep myscriptname Argument "12013 15777 15776 0 14:11 pts/6 00:00:00 sh -c ps..." isn't numeric in numeric gt (>) at somerandomscript.pl line 8  
Run Code Online (Sandbox Code Playgroud)

从脚本里面

fed*_*qui 5

ps -ef命令显示grep本身.

要跳过此行为,请尝试grepping以获取与grep本身不匹配的正则表达式条件:

ps -ef | grep myscript[n]ame
Run Code Online (Sandbox Code Playgroud)

或者类似的东西可以做到:

ps -ef | grep myscriptnam[e]
Run Code Online (Sandbox Code Playgroud)

说明

如果您sleep在后台运行命令:

$ sleep 100 &
[1] 9768
Run Code Online (Sandbox Code Playgroud)

然后用以下方法查找ps -ef:

$ ps -ef | grep sleep
me    9768  3673  0 14:00 pts/6    00:00:00 sleep 100
me    9771  3673  0 14:00 pts/6    00:00:00 grep --color=auto sleep
Run Code Online (Sandbox Code Playgroud)

你得到两行:进程本身和grep寻找它的命令.为了避免它并显示它自己的过程,我们可以:

$ ps -ef | grep -v grep | grep sleep
Run Code Online (Sandbox Code Playgroud)

或者在代码中使用正则表达式,以便grep进程不匹配:

$ ps -ef | grep slee[p]
me    9768  3673  0 14:00 pts/6    00:00:00 sleep 100
Run Code Online (Sandbox Code Playgroud)

因为线

me    9771  3673  0 14:00 pts/6    00:00:00 grep --color=auto sleep
Run Code Online (Sandbox Code Playgroud)

不符合grep slee[p].

请参阅相关主题中的说明.