설정
echo "abc" >/tmp/foo1
echo "def" >/tmp/foo2
cp /tmp/foo1 /tmp/gzfoo1
cp /tmp/foo2 /tmp/gzfoo2
gzip /tmp/gzfoo*
grep 종료 상태에 파일이 여러 개 있고 일치 항목 중 하나가 0입니다.
grep -q abc /tmp/foo[12]
echo $?
0
zgrep 종료 상태, 압축이 풀린 파일이 여러 개 있습니다. 일치하는 파일 중 하나는 1입니다.
zgrep -q abc /tmp/foo[12]
echo $?
1
zgrep 종료 상태에 여러 개의 아카이브가 있고 일치 항목이 1개 있습니다.
zgrep -q abc /tmp/gzfoo[12].gz
echo $?
1
zgrep이 쉘 스크립트라는 것을 알았습니다. 확실히 그럴거같아어느grep은 0이 아닌 값을 반환하고, zgrep도 0이 아닌 값을 반환합니다. 다음은 zgrep에서 발췌한 내용입니다.
res=0
for input_file
do
# ... run grep on input_file ...
r=$?
...
test $res -lt $r && res=$r
done
exit $res
zgrep 버전은 (고대) 1.3.12입니다.
$ zgrep --version
zgrep (gzip) 1.3.12
Copyright (C) 2007 Free Software Foundation, Inc.
This is free software. You may redistribute copies of it under the terms of
the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.
There is NO WARRANTY, to the extent permitted by law.
Written by Jean-loup Gailly.
이는 zgrep(gzip) 1.6에서도 발생합니다.
$ /<other_zgrep_path/bin/zgrep --version
zgrep (gzip) 1.6
Copyright (C) 2010-2013 Free Software Foundation, Inc.
This is free software. You may redistribute copies of it under the terms of
the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.
There is NO WARRANTY, to the extent permitted by law.
Written by Jean-loup Gailly.
$ /<other_zgrep_path/bin/zgrep -q abc /tmp/gzfoo[12].gz
$ echo $?
1
질문: zgrep에 버그가 있나요? 고쳐야 할까요?
편집: 이 문제가 없는 zgrep/gzip 1.8을 사용하는 최신 시스템을 찾았습니다. 그래서 내 기계가 오래된 것 같습니다. 새 컴퓨터에서는 다음과 같이 보입니다.
: zgrep --version
zgrep (gzip) 1.8
Copyright (C) 2010-2016 Free Software Foundation, Inc.
This is free software. You may redistribute copies of it under the terms of
the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.
There is NO WARRANTY, to the extent permitted by law.
Written by Jean-loup Gailly.
: zgrep -q abc /tmp/foo[12]
: echo $?
0
오래되고 버그가 있는 zgrep을 방지하기 위한 해키 해결 방법:
: ( gzcat -f /tmp/foo[12] | grep -q abc ) >&/dev/null
: echo $?
0
답변1
에서 소스코드를 얻을 수 있습니다.
https://savannah.gnu.org/git/?group=gzip. 커밋 시 반환 코드가 변경되었습니다 d2a1928e5534017456dc8a3b600ba0b30cce4a6e
.
commit d2a1928e5534017456dc8a3b600ba0b30cce4a6e
Author: Paul Eggert <[email protected]>
Date: Thu Jun 12 18:43:08 2014 -0700
zgrep: exit with status 0 if a file matches and there's no trouble
Reported by Pavel Raiskup in: http://bugs.gnu.org/17760
* zgrep.in (res): Treat exit status 0 to be greater than 1.
Also, exit immediately on software configuration error.
커밋 메시지에는 버그 보고서에 대한 링크가 포함되어 있습니다. https://debbugs.gnu.org/cgi/bugreport.cgi?bug=17760
직접 쉽게 확인하실 수 있습니다. zgrep
위의 커밋 에서 빌드:
$ /media/data/gzip-install-newer/bin/zgrep --version
zgrep (gzip) 1.6.17-d2a1
Copyright (C) 2010-2014 Free Software Foundation, Inc.
This is free software. You may redistribute copies of it under the terms of
the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.
There is NO WARRANTY, to the extent permitted by law.
Written by Jean-loup Gailly.
$ /media/data/gzip-install-newer/bin/zgrep -q abc /tmp/foo[12]
$ echo $?
0
zgrep
이전 커밋 에서 빌드:
$ /media/data/gzip-install/bin/zgrep --version
zgrep (gzip) 1.6.16-ed8c
Copyright (C) 2010-2014 Free Software Foundation, Inc.
This is free software. You may redistribute copies of it under the terms of
the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.
There is NO WARRANTY, to the extent permitted by law.
Written by Jean-loup Gailly.
$ /media/data/gzip-install/bin/zgrep -q abc /tmp/foo[12]
$ echo $?
1