aboutsummaryrefslogtreecommitdiff
path: root/src/scripts/xzgrep.in
diff options
context:
space:
mode:
Diffstat (limited to 'src/scripts/xzgrep.in')
-rw-r--r--src/scripts/xzgrep.in21
1 files changed, 21 insertions, 0 deletions
diff --git a/src/scripts/xzgrep.in b/src/scripts/xzgrep.in
index 559dbbc5..dd0643d6 100644
--- a/src/scripts/xzgrep.in
+++ b/src/scripts/xzgrep.in
@@ -57,6 +57,13 @@ files_without_matches=0
no_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
option=$1
shift
@@ -192,6 +199,20 @@ for i; do
elif test $with_filename -eq 0 &&
{ test $# -eq 1 || test $no_filename -eq 1; }; then
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
# Append a colon so that the last character will never be a newline
# which would otherwise get lost in shell command substitution.