Grep
grep vs zgrep 與多個文件的退出狀態差異
設置
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 是一個 shell 腳本。如果任何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
問題: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
您可以從 https://savannah.gnu.org/git/?group=gzip獲取原始碼。返回程式碼在 commit 中更改
d2a1928e5534017456dc8a3b600ba0b30cce4a6e
:commit d2a1928e5534017456dc8a3b600ba0b30cce4a6e Author: Paul Eggert <eggert@cs.ucla.edu> 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