mirror of
https://git.tukaani.org/xz.git
synced 2024-04-04 12:36:23 +02:00
xzgrep: Use grep -H --label when available (GNU, *BSDs).
It avoids the use of sed for prefixing filenames to output lines. Using sed for that is slower and prone to security bugs so now the sed method is only used as a fallback. This also fixes an actual bug: When grepping a binary file, GNU grep nowadays prints its diagnostics to stderr instead of stdout and thus the sed-method for prefixing the filename doesn't work. So with this commit grepping binary files gives reasonable output with GNU grep now. This was inspired by zgrep but the implementation is different.
This commit is contained in:
parent
b56729af9f
commit
bd7b290f3f
1 changed files with 21 additions and 0 deletions
|
@ -57,6 +57,13 @@ files_without_matches=0
|
||||||
no_filename=0
|
no_filename=0
|
||||||
with_filename=0
|
with_filename=0
|
||||||
|
|
||||||
|
# See if -H and --label options are supported (GNU and *BSDs).
|
||||||
|
if test f:x = "$(eval "echo x | $grep -H --label=f x 2> /dev/null")"; then
|
||||||
|
grep_supports_label=1
|
||||||
|
else
|
||||||
|
grep_supports_label=0
|
||||||
|
fi
|
||||||
|
|
||||||
while test $# -ne 0; do
|
while test $# -ne 0; do
|
||||||
option=$1
|
option=$1
|
||||||
shift
|
shift
|
||||||
|
@ -192,6 +199,20 @@ for i; do
|
||||||
elif test $with_filename -eq 0 &&
|
elif test $with_filename -eq 0 &&
|
||||||
{ test $# -eq 1 || test $no_filename -eq 1; }; then
|
{ test $# -eq 1 || test $no_filename -eq 1; }; then
|
||||||
eval "$grep"
|
eval "$grep"
|
||||||
|
elif test $grep_supports_label -eq 1; then
|
||||||
|
# The grep implementation in use allows us to specify the filename
|
||||||
|
# that grep will prefix to the output lines. This is faster and
|
||||||
|
# less prone to security bugs than the fallback method that uses sed.
|
||||||
|
# This also avoids confusing output with GNU grep >= 3.5 (2020-09-27)
|
||||||
|
# which prints "binary file matches" to stderr instead of stdout.
|
||||||
|
#
|
||||||
|
# If reading from stdin, let grep use whatever name it prefers for
|
||||||
|
# stdin. With GNU grep it's a locale-specific translated string.
|
||||||
|
if test "x$i" = "x-"; then
|
||||||
|
eval "$grep -H"
|
||||||
|
else
|
||||||
|
eval "$grep -H --label \"\$i\""
|
||||||
|
fi
|
||||||
else
|
else
|
||||||
# Append a colon so that the last character will never be a newline
|
# Append a colon so that the last character will never be a newline
|
||||||
# which would otherwise get lost in shell command substitution.
|
# which would otherwise get lost in shell command substitution.
|
||||||
|
|
Loading…
Reference in a new issue