In v4.999.9beta~30 (xzless: Support compressed standard input,
2009-08-09), xzless learned to parse ‘less -V’ output to figure out
whether less is new enough to handle $LESSOPEN settings starting
with “|-”.  That worked well for a while, but the version string from
‘less’ versions 448 (June, 2012) is misparsed, producing a warning:

        $ xzless /tmp/test.xz; echo $?
        /usr/bin/xzless: line 49: test: 456 (GNU regular expressions): \
        integer expression expected
        0

More precisely, modern ‘less’ lists the regexp implementation along
with its version number, and xzless passes the entire version number
with attached parenthetical phrase as a number to "test $a -gt $b",
producing the above confusing message.

        $ less-444 -V | head -1
        less 444
        $ less -V | head -1
        less 456 (no regular expressions)

So relax the pattern matched --- instead of expecting "less <number>",
look for a line of the form "less <number>[ (extra parenthetical)]".
While at it, improve the behavior when no matching line is found ---
instead of producing a cryptic message, we can fall back on a LESSPIPE
setting that is supported by all versions of ‘less’.

The implementation uses "awk" for simplicity.  Hopefully that’s
portable enough.

Reported-by: Jörg-Volker Peetz <jvpe...@web.de>
Signed-off-by: Jonathan Nieder <jrnie...@gmail.com>
---
Hi Jörg,

Jörg-Volker Peetz wrote[1]:

> /usr/bin/xzless: line 49: test: 456 (GNU regular expressions): integer
> expression expected
>
> This is due to the fact that less -V prints a line like
>
> less 456 (GNU regular expressions)

Good catch.  How about something like this patch?

[1] http://bugs.debian.org/693537

 src/scripts/xzless.in | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/scripts/xzless.in b/src/scripts/xzless.in
index a3da697..9bc9706 100644
--- a/src/scripts/xzless.in
+++ b/src/scripts/xzless.in
@@ -46,7 +46,8 @@ if test "${LESSMETACHARS+set}" != set; then
        LESSMETACHARS="$space$tab$nl'"';*?"()<>[|&^`#\$%=~'
 fi
 
-if test "$(less -V | { read ver && echo ${ver#less }; })" -ge 429; then
+less_ver=$(less -V | awk '/^less ([0-9]+)( \(.*\))?$/ { print $2; exit }')
+if test -n "$less_ver" && test "$less_ver" -ge 429; then
        # less 429 or later: LESSOPEN pipe will be used on
        # standard input if $LESSOPEN begins with |-.
        LESSOPEN="|-$xz -cdfq -- %s"
-- 
1.8.0


Reply via email to