設定
echo "abc" >/tmp/foo1
echo "def" >/tmp/foo2
cp /tmp/foo1 /tmp/gzfoo1
cp /tmp/foo2 /tmp/gzfoo2
gzip /tmp/gzfoo*
grep 終了状態に複数のファイルがあり、一致の 1 つが 0 です。
grep -q abc /tmp/foo[12]
echo $?
0
zgrep 終了状態、解凍されたファイルが複数あります。一致するファイルの1つは1です。
zgrep -q abc /tmp/foo[12]
echo $?
1
zgrep 終了状態に複数のアーカイブがあり、一致が 1 つあります。
zgrep -q abc /tmp/gzfoo[12].gz
echo $?
1
zgrepがシェルスクリプトであることがわかりました。確かにそうだどのgrepはゼロ以外の値を返し、zgrepもゼロ以外の値を返します。以下は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
Q: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