zgrep: fix exit status with multiple files

zgrep should exit with success when given multiple files and the
pattern is found in at least one file.  Prior to this change,
it would exit with success only if the pattern was found in _every_ file.

Reviewed by:	dab ngie
MFC after:	2 weeks
Sponsored by:	Dell EMC Isilon
Differential Revision:	https://reviews.freebsd.org/D26616
This commit is contained in:
Eric van Gyzen 2020-10-01 21:48:22 +00:00
parent 36972ee3e0
commit 63c8336d4d
2 changed files with 31 additions and 5 deletions

View File

@ -891,6 +891,24 @@ mflag_body()
atf_check -o inline:"test1:2\n" grep -m 2 -EHc "a|b|e|f" test1 atf_check -o inline:"test1:2\n" grep -m 2 -EHc "a|b|e|f" test1
} }
atf_test_case zgrep_multiple_files
zgrep_multiple_files_head()
{
atf_set "descr" "Ensures that zgrep functions properly with multiple files"
}
zgrep_multiple_files_body()
{
echo foo > test1
echo foo > test2
atf_check -o inline:"test1:foo\ntest2:foo\n" zgrep foo test1 test2
echo bar > test1
atf_check -o inline:"test2:foo\n" zgrep foo test1 test2
echo bar > test2
atf_check -s exit:1 zgrep foo test1 test2
}
# End FreeBSD # End FreeBSD
atf_init_test_cases() atf_init_test_cases()
@ -944,5 +962,6 @@ atf_init_test_cases()
atf_add_test_case fgrep_oflag atf_add_test_case fgrep_oflag
atf_add_test_case cflag atf_add_test_case cflag
atf_add_test_case mflag atf_add_test_case mflag
atf_add_test_case zgrep_multiple_files
# End FreeBSD # End FreeBSD
} }

View File

@ -157,28 +157,35 @@ then
pattern_found=1 pattern_found=1
fi fi
ret=0
# call grep ... # call grep ...
if [ $# -lt 1 ] if [ $# -lt 1 ]
then then
# ... on stdin # ... on stdin
if [ ${pattern_file} -eq 0 ]; then if [ ${pattern_file} -eq 0 ]; then
${cattool} ${catargs} - | ${grep} ${grep_args} -- "${pattern}" - || ret=$? ${cattool} ${catargs} - | ${grep} ${grep_args} -- "${pattern}" -
else else
${cattool} ${catargs} - | ${grep} ${grep_args} -- - || ret=$? ${cattool} ${catargs} - | ${grep} ${grep_args} -- -
fi fi
ret=$?
else else
# ... on all files given on the command line # ... on all files given on the command line
if [ ${silent} -lt 1 -a $# -gt 1 ]; then if [ ${silent} -lt 1 -a $# -gt 1 ]; then
grep_args="-H ${grep_args}" grep_args="-H ${grep_args}"
fi fi
# Succeed if any file matches. First assume no match.
ret=1
for file; do for file; do
if [ ${pattern_file} -eq 0 ]; then if [ ${pattern_file} -eq 0 ]; then
${cattool} ${catargs} -- "${file}" | ${cattool} ${catargs} -- "${file}" |
${grep} --label="${file}" ${grep_args} -- "${pattern}" - || ret=$? ${grep} --label="${file}" ${grep_args} -- "${pattern}" -
else else
${cattool} ${catargs} -- "${file}" | ${cattool} ${catargs} -- "${file}" |
${grep} --label="${file}" ${grep_args} -- - || ret=$? ${grep} --label="${file}" ${grep_args} -- -
fi
this_ret=$?
# A match (0) overrides a no-match (1). An error (>=2) overrides all.
if [ ${this_ret} -eq 0 -a ${ret} -eq 1 ] || [ ${this_ret} -ge 2 ]; then
ret=${this_ret}
fi fi
done done
fi fi