--- zgrep.in.orig 2002-09-27 22:53:14.000000000 -0700 +++ zgrep.in 2006-09-22 18:04:16.000000000 -0700 @@ -24,7 +24,7 @@ PATH="BINDIR:$PATH"; export PATH -prog=`echo $0 | sed 's|.*/||'` +prog=`echo "$0" | sed 's|.*/||'` case "$prog" in *egrep) grep=${EGREP-egrep} ;; *fgrep) grep=${FGREP-fgrep} ;; @@ -93,20 +93,38 @@ res=0 for i do - gzip -cdfq "$i" | + gzip -cdfq -- "$i" | if test $files_with_matches -eq 1; then - $grep $opt "$pat" > /dev/null && echo $i + $grep $opt "$pat" > /dev/null && printf "%s\n" "$i" elif test $files_without_matches -eq 1; then - $grep $opt "$pat" > /dev/null || echo $i + $grep $opt "$pat" > /dev/null || printf "%s\n" "$i" elif test $with_filename -eq 0 && { test $# -eq 1 || test $no_filename -eq 1; }; then $grep $opt "$pat" else + i=$(echo "$i" | sed -e 's/[\\|&]/\\&/g') if test $with_filename -eq 1; then sed_script="s|^[^:]*:|${i}:|" else sed_script="s|^|${i}:|" fi - $grep $opt "$pat" | sed "$sed_script" + # Hack adapted from GPLed code at + # http://home.comcast.net/~j.p.h/cus-faq-2 + # Has the same effect as the following two lines of bash: + # + # $grep $opt "$pat" | sed "$sed_script" + # exit ${PIPESTATUS[0]} + # + # Inside the `...`, fd4 goes to the pipe whose other end is read + # and passed to eval; fd1 is the normal standard output + # preserved the line before with exec 3>&1 + exec 3>&1 + eval ` + exec 4>&1 >&3 3>&- + { + $grep $opt "$pat" 4>&-; echo "r=$?;" >&4 + } | sed "$sed_script" + ` + exit $r fi r=$? test $res -lt $r && res=$r