v*****r 发帖数: 1119 | 1 ps -ef | grep "command" | grep -v grep
以上命令的 exit status ($?) 在match到 “command" 的时候是 0,在没有 match 的
时候是 1.
在没有 match 的时候,觉得 exit status 也应该是由 ”grep -v grep“ 决定的呀
, 为什么会是 1 哪? | h*******c 发帖数: 248 | 2 echo "aa"|grep -v "aa";echo $?
1
Anything wrong? | v*****r 发帖数: 1119 | 3 你和我问的是同一个问题,唯一能解释的通的理由就是:
grep -v 在只有一行 input passed through standard input 的时候,会把 exit
status 设成 1 , 因为只有一行 input 的话,grep -v 就能 assume no match, 我的
猜想
【在 h*******c 的大作中提到】 : echo "aa"|grep -v "aa";echo $? : 1 : Anything wrong?
| h*******c 发帖数: 248 | 4 true;echo $?
0
false;echo $?
1
echo "aa"|grep -v "aa";echo $?
1
echo "aa"|grep -v "bb";echo $?
aa
0
I don't think anything strange here."aa" not match -v "aa", so return false,
"aa" match -v "bb" so return true. | v*****r 发帖数: 1119 | 5 主要是想搞清为什么这两个 cases 下, $? 会不同
{ echo "aa"; } | grep -v "aa" ; echo $?
{ echo "aa"; echo "bb"; } | grep -v "aa" ; echo $?
我这么理解对不对?
grep -v 没 output, set $? to 1
grep -v 有 output, set $? to 0
false,
【在 h*******c 的大作中提到】 : true;echo $? : 0 : false;echo $? : 1 : echo "aa"|grep -v "aa";echo $? : 1 : echo "aa"|grep -v "bb";echo $? : aa : 0 : I don't think anything strange here."aa" not match -v "aa", so return false,
| c*******t 发帖数: 13 | 6 $ man 1 grep
EXIT STATUS
Normally, the exit status is 0 if selected lines are found and
1
otherwise. But the exit status is 2 if an error occurred, unless
the
-q or --quiet or --silent option is used and a selected line is
found.
Note, however, that POSIX only mandates, for programs such as
grep,
cmp, and diff, that the exit status in case of error be greater than
1;
it is therefore advisable, for the sake of portability, to use
logic
【在 v*****r 的大作中提到】 : 主要是想搞清为什么这两个 cases 下, $? 会不同 : { echo "aa"; } | grep -v "aa" ; echo $? : { echo "aa"; echo "bb"; } | grep -v "aa" ; echo $? : 我这么理解对不对? : grep -v 没 output, set $? to 1 : grep -v 有 output, set $? to 0 : : false,
| v*****r 发帖数: 1119 | 7 你没看清我问的问题: grep -v 是根据什么设 exit status 的? Manual 里没提到。
从以下这两个 commands 的对比来看,似乎只能是根据 grep -v 后还有没有 line(s)
left for stdout 来决定 exit status 的value了。
{ echo "aa"; } | grep -v "aa" ; echo $?
{ echo "aa"; echo "bb"; } | grep -v "aa" ; echo $?
有时间俺会 check out grep 的 source code 来 confirm 一下。
and
【在 c*******t 的大作中提到】 : $ man 1 grep : EXIT STATUS : Normally, the exit status is 0 if selected lines are found and : 1 : otherwise. But the exit status is 2 if an error occurred, unless : the : -q or --quiet or --silent option is used and a selected line is : found. : Note, however, that POSIX only mandates, for programs such as : grep,
| j*a 发帖数: 14423 | 8 你要这么想 grep有输出就是0 没有就是1
grep aa和grep -v aa只是形式是这么做的
要是改为 grep "aa" 和 grep "![aa]"什么的 这就好理解了 别太在意那个-v
)
【在 v*****r 的大作中提到】 : 你没看清我问的问题: grep -v 是根据什么设 exit status 的? Manual 里没提到。 : 从以下这两个 commands 的对比来看,似乎只能是根据 grep -v 后还有没有 line(s) : left for stdout 来决定 exit status 的value了。 : { echo "aa"; } | grep -v "aa" ; echo $? : { echo "aa"; echo "bb"; } | grep -v "aa" ; echo $? : 有时间俺会 check out grep 的 source code 来 confirm 一下。 : : and
|
|