diff options
author | Jonathan Nieder <jrnieder@gmail.com> | 2012-11-19 00:10:10 -0800 |
---|---|---|
committer | Lasse Collin <lasse.collin@tukaani.org> | 2012-12-15 20:01:45 +0200 |
commit | 9f62fd9605eade23b62b07a235d1f02156f7a5c6 (patch) | |
tree | db07f8939a08390a2c566e47ed45a8a3c29f5706 | |
parent | xz: Fix the note about --rsyncable on the man page. (diff) | |
download | xz-9f62fd9605eade23b62b07a235d1f02156f7a5c6.tar.xz |
xzless: Make "less -V" parsing more robust
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 <jvpeetz@web.de>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
-rw-r--r-- | src/scripts/xzless.in | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/src/scripts/xzless.in b/src/scripts/xzless.in index a3da697c..9bc9706b 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" |