341 lines
8.4 KiB
Bash
Executable File
341 lines
8.4 KiB
Bash
Executable File
#!/bin/sh
|
|
#
|
|
# lessfile/lesspipe
|
|
# $Id: lessopen,v 1.4 1998/05/12 09:37:46 torin Exp $
|
|
# Plus POSIX sh changes by Y.Dirson
|
|
#
|
|
# Less filter for viewing non text files.
|
|
#
|
|
# Written by: Behan Webster <behanw@pobox.com>
|
|
# Many Modifications by Darren Stalder
|
|
# Further Modifications by Thomas Schoepf <schoepf@debian.org>
|
|
#
|
|
# combined lessfile and lesspipe to avoid duplication of decode stage
|
|
# shell is sure icky. I'm real tempted to rewrite the whole thing in Perl
|
|
#
|
|
# Unfortunately, this means that I have filename dependencies sprinkled
|
|
# throughout the code. If you don't want lessfile to be called that,
|
|
# you'll need to change the LESSFILE envar below.
|
|
#
|
|
# Usage: eval `lessfile` or eval `lesspipe`
|
|
#
|
|
# less passes in:
|
|
# $1 filename to be viewed with less (used by LESSOPEN)
|
|
# and possibly (if used by lessfile)
|
|
# $2 filename that was created during LESSOPEN
|
|
|
|
TMPDIR=${TMPDIR:-/tmp}
|
|
BASENAME=`basename $0`
|
|
LESSFILE=lessfile
|
|
|
|
# Helper function to list contents of ISO files (CD images)
|
|
iso_list() {
|
|
isoinfo -d -i "$1"
|
|
isoinfo -d -i "$1" | grep -q ^Rock\.Ridge && iiopts="$iiopts -R"
|
|
isoinfo -d -i "$1" | grep -q ^Joliet && iiopts="$iiopts -J"
|
|
echo
|
|
isoinfo -f $iiopts -i "$1"
|
|
}
|
|
|
|
if [ $# -eq 1 ] ; then
|
|
# we were called as LESSOPEN
|
|
|
|
# if the file doesn't exist, we don't do anything
|
|
if [ ! -r "$1" ]; then
|
|
exit 0
|
|
fi
|
|
|
|
# generate filename for possible use by lesspipe
|
|
umask 077
|
|
if [ $BASENAME = $LESSFILE ]; then
|
|
TMPFILE=`tempfile -d $TMPDIR -p lessf`
|
|
if [ -z "$TMPFILE" ]; then
|
|
echo >&2 "Could not find essential program 'tempfile'. Exiting"
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
(
|
|
# possibly redirect stdout to a file for lessfile
|
|
if [ $BASENAME = $LESSFILE ]; then exec > $TMPFILE; fi
|
|
|
|
# Allow for user defined filters
|
|
#if [ -x ~/.lessfilter -a -O ~/.lessfilter ]; then
|
|
if [ -x ~/.lessfilter ]; then
|
|
~/.lessfilter "$1"
|
|
if [ $? -eq 0 ]; then
|
|
if [ $BASENAME = $LESSFILE ]; then
|
|
if [ -s $TMPFILE ]; then
|
|
echo $TMPFILE
|
|
else
|
|
rm -f $TMPFILE
|
|
fi
|
|
fi
|
|
exit 0
|
|
fi
|
|
fi
|
|
|
|
# Decode file for less
|
|
case `echo "$1" | tr '[:upper:]' '[:lower:]'` in
|
|
*.a)
|
|
if [ -x "`which ar`" ]; then ar tv "$1"
|
|
else echo "No ar available"; fi ;;
|
|
|
|
*.arj)
|
|
if [ -x "`which unarj`" ]; then unarj l "$1"
|
|
else echo "No unarj available"; fi ;;
|
|
|
|
*.tar.bz2)
|
|
if [ -x "`which bunzip2`" ]; then
|
|
bunzip2 -dc "$1" | tar tvvf -
|
|
else echo "No bunzip2 available"; fi ;;
|
|
|
|
*.bz)
|
|
if [ -x "`which bunzip`" ]; then bunzip -c "$1"
|
|
else echo "No bunzip available"; fi ;;
|
|
|
|
*.bz2)
|
|
if [ -x "`which bunzip2`" ]; then bunzip2 -dc "$1"
|
|
else echo "No bunzip2 available"; fi ;;
|
|
|
|
*.deb|*.udeb|*.ddeb|*.ipk)
|
|
echo "$1:"; dpkg --info "$1"
|
|
echo
|
|
echo '*** Contents:'; dpkg-deb --contents "$1"
|
|
;;
|
|
|
|
*.doc)
|
|
if [ -x "`which catdoc`" ]; then
|
|
catdoc "$1"
|
|
else
|
|
# no catdoc, read normally if file is text.
|
|
if ( file "$1" | grep ASCII 2>/dev/null >/dev/null); then
|
|
cat "$1"
|
|
else
|
|
echo "No catdoc available";
|
|
fi
|
|
fi
|
|
;;
|
|
|
|
*.egg)
|
|
if [ -x "`which unzip`" ]; then
|
|
unzip -p "$1" EGG-INFO/PKG-INFO | \
|
|
sed '/^Description:/,/^\S/{/^Description:/d; /^\S/b; d}'
|
|
echo
|
|
unzip -v "$1"
|
|
else
|
|
echo "No unzip available"
|
|
fi
|
|
;;
|
|
|
|
*.gif|*.jpeg|*.jpg|*.pcd|*.png|*.tga|*.tiff|*.tif)
|
|
if [ -x "`which identify`" ]; then
|
|
identify "$1"
|
|
else
|
|
echo "No identify available"
|
|
echo "Install ImageMagick to browse images"
|
|
fi
|
|
;;
|
|
|
|
*.iso)
|
|
if [ -x "`which isoinfo`" ]; then iso_list "$1"
|
|
else
|
|
echo "No isoinfo available"
|
|
echo "Install mkisofs to view ISO images"
|
|
fi
|
|
;;
|
|
|
|
*.bin|*.raw)
|
|
if [ -x "`which isoinfo`" ]; then
|
|
file "$1" | grep -q ISO\.9660 && iso_list "$1"
|
|
else
|
|
echo "No isoinfo available"
|
|
echo "Install mkisofs to view ISO images"
|
|
fi
|
|
;;
|
|
|
|
*.lha|*.lzh)
|
|
if [ -x "`which lha`" ]; then lha v "$1"
|
|
else echo "No lha available"; fi ;;
|
|
|
|
*.tar.lz|*.tlz)
|
|
if [ -x "`which lzip`" ]; then
|
|
lzip -dc "$1" | tar tvvf -
|
|
elif [ -x "`which lunzip`" ]; then
|
|
lunzip -dc "$1" | tar tvvf -
|
|
else echo "No lzip or lunzip available"; fi ;;
|
|
|
|
*.lz)
|
|
if [ -x "`which lzip`" ]; then lzip -dc "$1"
|
|
elif [ -x "`which lunzip`" ]; then lunzip -dc "$1"
|
|
else echo "No lzip or lunzip available"; fi ;;
|
|
|
|
*.tar.lzma)
|
|
if [ -x "`which lzma`" ]; then
|
|
lzma -dc "$1" | tar tfvv -
|
|
else
|
|
echo "No lzma available"
|
|
fi
|
|
;;
|
|
|
|
*.lzma)
|
|
if [ -x "`which lzma`" ]; then
|
|
lzma -dc "$1"
|
|
else
|
|
echo "No lzma available"
|
|
fi
|
|
;;
|
|
|
|
*.pdf)
|
|
if [ -x "`which pdftotext`" ]; then pdftotext -layout "$1" -
|
|
else echo "No pdftotext available"; fi ;;
|
|
|
|
*.rar|*.r[0-9][0-9])
|
|
if [ -x "`which rar`" ]; then rar v "$1"
|
|
elif [ -x "`which unrar`" ]; then unrar v "$1"
|
|
else echo "No rar or unrar available"; fi ;;
|
|
|
|
*.rpm)
|
|
if [ -x "`which rpm`" ]; then
|
|
echo "$1:"; rpm -q -i -p "$1"
|
|
echo
|
|
echo '*** Contents:'
|
|
rpm -q -l -p "$1"
|
|
else echo "rpm isn't available, no query on rpm package possible"; fi ;;
|
|
|
|
*.snap)
|
|
if [ -x "`which snap`" ]; then snap info "$1"; fi
|
|
if [ -x "`which unsquashfs`" ]; then
|
|
echo
|
|
echo '*** Contents:'; unsquashfs -ll -d '' "$1"
|
|
else echo "No unsquashfs available"; fi ;;
|
|
|
|
*.tar.gz|*.tgz|*.tar.z|*.tar.dz)
|
|
tar tzvf "$1" --force-local
|
|
;;
|
|
|
|
*.tar.xz|*.txz)
|
|
if [ -x "`which xz`" ]; then
|
|
xz -dc "$1" | tar tfvv -
|
|
else
|
|
echo "No xz available"
|
|
fi
|
|
;;
|
|
|
|
*.whl)
|
|
if [ -x "`which unzip`" ]; then
|
|
unzip -p "$1" '*.dist-info/METADATA' | sed '/^$/q'
|
|
unzip -v "$1"
|
|
else
|
|
echo "No unzip available"
|
|
fi
|
|
;;
|
|
|
|
*.xz)
|
|
if [ -x "`which xz`" ]; then
|
|
xz -dc "$1"
|
|
else
|
|
echo "No xz available"
|
|
fi
|
|
;;
|
|
|
|
# Note that this is out of alpha order so that we don't catch
|
|
# the gzipped tar files.
|
|
*.gz|*.z|*.dz)
|
|
gzip -dc "$1" ;;
|
|
|
|
*.tar)
|
|
tar tvf "$1" --force-local
|
|
;;
|
|
|
|
*.jar|*.war|*.ear|*.xpi|*.zip)
|
|
if [ -x "`which unzip`" ]; then unzip -v "$1";
|
|
elif [ -x "`which miniunzip`" ]; then miniunzip -l "$1";
|
|
elif [ -x "`which miniunz`" ]; then miniunz -l "$1";
|
|
else echo "No unzip, miniunzip or miniunz available"; fi ;;
|
|
|
|
*.7z)
|
|
if [ -x "`which 7za`" ]; then 7za l "$1";
|
|
elif [ -x "`which 7zr`" ]; then 7zr l "$1";
|
|
else echo "No 7za or 7zr available"; fi ;;
|
|
|
|
*.zoo)
|
|
if [ -x "`which zoo`" ]; then zoo v "$1";
|
|
elif [ -x "`which unzoo`" ]; then unzoo -l "$1";
|
|
else echo "No unzoo or zoo available"; fi ;;
|
|
|
|
esac
|
|
) 2>/dev/null
|
|
|
|
if [ $BASENAME = $LESSFILE ]; then
|
|
if [ -s $TMPFILE ]; then
|
|
echo $TMPFILE
|
|
else
|
|
rm -f $TMPFILE
|
|
fi
|
|
fi
|
|
|
|
elif [ $# -eq 2 ] ; then
|
|
#
|
|
# we were called as LESSCLOSE
|
|
# delete the file created if we were lessfile
|
|
#
|
|
if [ $BASENAME = $LESSFILE ]; then
|
|
if [ -n "$BASH" ]; then
|
|
if [ ! -O "$2" ]; then
|
|
echo "Error in deleting $2" > /dev/tty
|
|
fi
|
|
fi
|
|
|
|
if [ -f "$2" ]; then
|
|
rm -f "$2"
|
|
else
|
|
echo "Error in deleting $2" > /dev/tty
|
|
fi
|
|
fi
|
|
|
|
elif [ $# -eq 0 ] ; then
|
|
#
|
|
# must setup shell to use LESSOPEN/LESSCLOSE
|
|
#
|
|
# I have no idea how some of the more esoteric shells (es, rc) do
|
|
# things. If they don't do things in a Bourne manner, send me a patch
|
|
# and I'll incorporate it.
|
|
#
|
|
|
|
# first determine the full path of lessfile/lesspipe
|
|
# if you can determine a better way to do this, send me a patch, I've
|
|
# not shell-scripted for many a year.
|
|
FULLPATH=`cd \`dirname $0\`;pwd`/$BASENAME
|
|
|
|
case "$SHELL" in
|
|
*csh)
|
|
if [ $BASENAME = $LESSFILE ]; then
|
|
echo "setenv LESSOPEN \"$FULLPATH %s\";"
|
|
echo "setenv LESSCLOSE \"$FULLPATH %s %s\";"
|
|
else
|
|
echo "setenv LESSOPEN \"| $FULLPATH %s\";"
|
|
echo "setenv LESSCLOSE \"$FULLPATH %s %s\";"
|
|
fi
|
|
;;
|
|
*)
|
|
if [ $BASENAME = $LESSFILE ]; then
|
|
echo "export LESSOPEN=\"$FULLPATH %s\";"
|
|
echo "export LESSCLOSE=\"$FULLPATH %s %s\";"
|
|
else
|
|
echo "export LESSOPEN=\"| $FULLPATH %s\";"
|
|
echo "export LESSCLOSE=\"$FULLPATH %s %s\";"
|
|
fi
|
|
;;
|
|
esac
|
|
|
|
#echo "# If you tried to view a file with a name that starts with '#', you"
|
|
#echo "# might see this message instead of the file's contents."
|
|
#echo "# To view the contents, try to put './' ahead of the filename when"
|
|
#echo "# calling less."
|
|
|
|
else
|
|
echo "Usage: eval \`$BASENAME\`"
|
|
exit
|
|
fi
|