Script: man2ps, man2pdf, man2evince

Usage:

  • $ man2ps command will generate a PostScript (.ps) file from command's manpage
  • Symlink or copy this script as "man2pdf" to create a PDF from a manpage.
  • Symlink or copy this script as "man2evince" to call evince on a temporary PDF of the manpage
#!/bin/bash

# man2ps, (c) 2004,2005,2006,2009 Toni Corvera, published under a BSD license
#
# Saves a man page as either a PostScript (PS) or as a PDF file.
#
# This script is also used as a testbed for some experiments,
# as of now only rudimentary in-file localisation is kept, in the past
# the script could also be sourced and work as a function but it led to
# unwanted pollution of the environment.
#
# $Rev: 242 $
#
# Changelog:
# 0.11.0 (2009-03-09):
#     - Added man2evince
#     - Check for man page existence
# 0.10.0 (2006-06-27):
#     - First version with a changelog
#     - Explicit usage of bash
#     - Better use of bashisms
#     - Usage of /usr/include/sysexits.h -compatible exit codes
#     - Dropped support to be used as a function (sourced)
#     - Dropped support for long options
#     - Complete help message
#     - Wrapped localized strings into functions, may help parsing speed. Or maybe not.
#     - Added set -e
#
# 0.9.2 (2005)

set -e

# Current version
VER=0.11.0
# Command name for information messages
CMD=`basename $0`

### Simple localisation support ###

# Language codes
declare -ir _EN=0 _ES=1 _CA=2
declare -a LANGS=( en es ca ) # Languages un the same order as their index
declare -i _L

# Error messages
error_nops2pdf() {
    local nopdf_strs=( "ps2pdf wasn't found, can't export to PDF"
                       "No se ha encontrado ps2pdf, no se puede exportar a PDF"
                       "No s'ha trobat ps2pdf, no es pot exportar a PDF" )
    echo ${nopdf_strs[$_L]} >&2
}

error_bad_cmdline() {
    local badcmdline_strs=( "Use -h to get usage instructions"
                            "Usa -h para obtener ayuda"
                            "Utilitza -h per obtenir ajuda" )
    echo ${badcmdline_strs[$_L]} >&2
}

error_notvalid_ver() {
    local allowedvers_strs=( "Only versions 2, 3 and 4 of ps2pdf are allowed"
                             "Sólo las versiones 2, 3 y 4 de ps2pdf están permitidas"
                             "Només les versions 2, 3 i 4 de ps2pdf estan permeses" )
    echo ${allowedvers_strs[$_L]} >&2
}

# Information messages
declare -r VERSION_STRING="${CMD} v${VER}, (c) 2004,2005,2006 Toni Corvera"

show_help() {
    # Localised functions
    en() {
        echo "$VERSION_STRING"
        echo "   saves a man page as a PostScript or PDF file"
        echo "Options:"
        echo "   -h         Show this help message"
        echo "   -p         Force PDF mode for output"
        echo "   -V VER     Use ps2pdf version 1.VER (VER must be one of 2, 3 or 4), "
        echo "              by default the newest available version is used"
    }

    es() {
        echo "$VERSION_STRING"
        echo "   guarda una página de manual como archivo PostScript o PDF"
        echo "Opciones:"
        echo "   -h         Muestra este mensaje de ayuda"
        echo "   -p         Fuerza la salida a un archivo pdf"
        echo "   -V VER     Usa la versión 1.VER de ps2pdf (VER puede ser 2, 3 o 4), "
        echo "              por defecto se usa la versión más reciente disponible"
    }

    ca() {
        echo "$VERSION_STRING"
        echo "   desa una pàgina de manual com arxiu PostScript o PDF"
        echo "Opcions:"
        echo "   -h         Mostra aquest missatge d'ajuda"
        echo "   -p         Força la sortida a un fitxer PDF"
        echo "   -V VER     Utilitza la versió 1.VER de ps2pdf (VER pot ser 2, 3 o 4), "
        echo "              per defecte s'utilitza la versió disponible més nova"
    }

    ${LANGS[$_L]}
}

show_usage() {
    local usage_strs=(
                        "Usage: ${CMD} [options] <manual page>"
                        "Uso: ${CMD} [opciones] <página del manual>"
                        "Ús: ${CMD} [opcions] <pàgina del manual>"
                     )

    echo "${usage_strs[$_L]}"
}

# $1 => ps2pdf program name
show_ps2pdf_version() {
    local pdfver_strs=( "Using ps2pdf version:"
                        "Usando ps2pdf en su variante:"
                        "Fent servir ps2pdf en sa versió:" )
    echo "${pdfver_strs[$_L]} $1" >&2
}

# Language detection
# FIXME: is the precedence order correct?
for i in LC_ALL LC_MESSAGES LANG ; do
    # Indirect variable reference, see http://www.tldp.org/LDP/abs/html/ivr.html#IVRREF
    eval val=$$i

    if [ "$val" ]; then
        case $val in
            es*) _L=$_ES ;;
            ca*) _L=$_CA ;;
            *)   _L=$_EN ;;
        esac
        break
    fi
done
if [ -z $_L ]; then _L=$_EN; fi

### Core functionality ###

declare -i PDF=0 EVINCE=0
ps2pdf=
PS2PDF_VER=

if [ $(basename "$0") == "man2pdf" ]; then
    PDF=1
elif [ $(basename "$0") == "man2evince" ]; then
    PDF=1
    EVINCE=1
fi

# Command line parsing
while getopts "hpV:" options ; do
    case $options in
        h) show_help && exit 0 ;;
        p) PDF=1 ;;
        V)
            if ! echo -n "$OPTARG" | egrep '^[234]$' >/dev/null 2>/dev/null ; then
                error_notvalid_ver
                error_bad_cmdline
                exit 64
            fi
            PS2PDF_VER=$OPTARG
        ;;
        ?)
            error_bad_cmdline
            exit 64
        ;;
    esac
done
shift $(($OPTIND - 1))

if [ -z "$1" ]; then
    show_usage
    exit 64
fi

if [ $PDF -eq 0 ]; then
    man -t "$1" > "${1}.ps"
else
    # Use the newest ps2pdf
    if [ -z "$PS2PDF_VER" ]; then
        for prog in ps2pdf14 ps2pdf13 ps2pdf12 ps2pdf ; do
            ps2pdf=`which $prog` && break
        done
    else
        ps2pdf=`which ps2pdf1$PS2PDF_VER` || true
    fi

    if [ -z "$ps2pdf" ]; then
        error_nops2pdf
        exit 69
    fi

    show_ps2pdf_version $(basename "${ps2pdf}")
    OUTPUT="${1}.pdf"
    if [ $EVINCE -eq 1 ]; then
        OUTPUT="$(tempfile --suffix=.pdf)"
    fi
    # Check if the command has a manpage...
    if ! whatis "$1" >/dev/null ; then
        man "$1" # Display man's error...
        exit $?
    fi
    man -t "$1" | ${ps2pdf} - > "$OUTPUT"
    if [ $? -eq 0 ] && [ $EVINCE -eq 1 ]; then
        evince "$OUTPUT"
        rm -f "$OUTPUT"
    fi
fi # PDF -eq 0

# vim:set ts=4 et ai: #

Downloadable file: http://p.outlyer.net/graveyard/man2ps.

Script: video identification (Bash)

This script displays mplayer's information/identification lines of a multimedia file. Nowadays I prefer to use an undocumented feature of vcs (see below)

#!/bin/bash

# This script displays mplayer's information/identification lines of a multimedia file
# Put in the public domain. <http://w.corvera.eu/2007/11/shell-vidid/>

vididf() {
        mplayer -identify -frames 0 -ao null -vo null "$1" 2>/dev/null | grep ID_ | sort
}

for F in "$@"; do vididf "$F" ; done

Example:

$ vidid file.avi

ID_AUDIO_BITRATE=160000
ID_AUDIO_BITRATE=160000
ID_AUDIO_CODEC=mp3
ID_AUDIO_FORMAT=85
ID_AUDIO_ID=1
ID_AUDIO_NCH=0
ID_AUDIO_NCH=2
ID_AUDIO_RATE=0
ID_AUDIO_RATE=48000
ID_DEMUXER=avi
ID_FILENAME=file.avi
ID_LENGTH=2569.52
ID_VIDEO_ASPECT=0.0000
ID_VIDEO_BITRATE=1223960
ID_VIDEO_CODEC=ffodivx
ID_VIDEO_FORMAT=XVID
ID_VIDEO_FPS=25.000
ID_VIDEO_HEIGHT=360
ID_VIDEO_ID=0
ID_VIDEO_WIDTH=640
VCS version:
$ vcs -Z idonly somefile.avi
[...]
=========== Mplayer Identification ===========
Length: 42:39.52
Video
    Codec: XVID (Xvid (MPEG-4))
    Dimensions: 704x396
    FPS: 23.976
    Aspect:
Audio
    Codec: 85 (MPEG Layer III (MP3))
    Channels: 2
==============================================

=========== FFmpeg Identification ===========
Length: 42:39.51
Video
    Codec: mpeg4 (MPEG-4)
    Dimensions: 704x396
    FPS: 23.98
    Aspect: 16/9
Audio
    Codec: mp3 (MPEG Layer III (MP3))
    Channels: 2
=============================================

=========== Combined Identification ===========
Length: 42:38.01
Video
    Codec: XVID (Xvid (MPEG-4))
    Dimensions: 704x396
    FPS: 23.976
    Aspect: 16/9 (1.7778)
Audio
    Codec: 85 (MPEG Layer III (MP3))
    Channels: 2
=============================================

Valor de retorno en el prompt

Este código sirve para indicar si el último comando ha tenido éxito o no, de manera que siempre esté visible en el propio prompt, es ideal para depurar código entre otras cosas.

Versión rápida (aunque no muy legible :P):
export PS1='$( [ "$?" -eq 0 ] && M=")" || M="("; echo -n :$M ) '$PS1

Incluyendo este fragmento en ~/.bashrc siempre estará activo:

# Indicacion de si el ultimo comando ha tenido exito
#    inspirada por http://mendel.livejournal.com/128965.html
#export PS1='`test "$?" -eq 0 && echo -n ":)" || echo -n ":(" ` '$PS1
# Version con funcion sacada de http://linuxgazette.net/122/lg_tips.html
#Alternativamente: "More-or-less undocumented Bash-ism - a C-style trinary operator":
#smiley () { echo -e ":\$(($??50:51))"; }
_smiley() {
   if [ $? -eq 0 ]; then echo ':)'
      else echo ':('
   fi
}
#...
export PS1='$(_smiley) '$PS1

Ejemplo:

:) toni@host:~$ false
:( toni@host:~$ true
:) toni@host:~$ 

Revisado y corregido por última vez el 2013-10-22

Desactivación del altavoz (kernel 2.6)

Nota: usar hotplug y su lista de modulos prohibidos (/etc/hotplug/blacklist)
puede parecer más elegante pero en realidad no funciona, al menos que yo sepa.

  • En sistemas actuales:

    Crear un archivo en /etc/modprobe.d, en mi caso lo llamaré local-pcspkr

    (lo de local lo uso para diferenciar los que he ido añadiendo yo
    de los que instala el sistema), y añadirle una de estas líneas:

      alias pcspkr off
    o
      install pcpskr /bin/true
    por ejemplo:
    # echo alias pcspkr off >> /etc/modprobe.d/local-pcspkr

  • En sistemas más antiguos:

    Añadir una de las lineas a /etc/modprobe.conf, por ejemplo:
    # echo alias pcspkr off >> /etc/modprobe.conf

Fuente: http://www.debianforum.de/forum/viewtopic.php?p=158760

Instalación de la máquina virtual Java de Sun en Debian

La información de esta página no es necesaria en sistemas actuales, basta con instalar los paquetes sun-java-*.

Debian incluye varias máquinas virtuales Java que funcionan bastante bien pero puede interesar usar la de Sun, por ejemplo en estudios de informática en que se de por hecho que se va a usar esa máquina.
Éste es el método más elegante: de una forma simple crea un archivo deb instalable (y desinstable) como cualquier otro.
Además puede crear tanto archivos para la SDK como para el JRE.

El encargado de la magia es java-package, que desde hace algún tiempo forma parte de Debian Sid.

http://z42.de/debian/ aunque es más recomendable incluirlo como una fuente para apt e instalarlo con apt-get:

Para instalarlo:
# apt-get install java-package

Para crear el deb hay que bajar el binario adecuado de la web de Sun, y una vez descargado ejecutar, por ejemplo para J2SDK 1.4.2_05:

$ make-jpkg /ruta/j2sdk-1_4_2_07-linux-i586.bin

Finalmente tendremos el deb que podremos instalar normalmente, el archivo creado en el ejemplo se llamará sun-j2sdk1.4_1.4.2+07_i386.deb:
# dpkg -i sun-j2sdk1.4_1.4.2+07_i386.deb

Conversión de páginas del manual a PostScript (o pdf)

La idea es crear un archivo PostScript (ps) o PDF con las páginas del manual
de un comando, de modo que se puedan hacer impresiones de alta calidad o verlo
en pantalla también en alta calidad. Se requiere Ghostscript para hacer la conversión.

Substituye $COMANDO por el comando en cuestión.

  • PostScript
    $ man -t $COMANDO > $COMANDO.ps

  • PDF
    $ man -t $COMANDO | ps2pdf - > $COMANDO.pdf

    Usando ps2pdf14 en vez de ps2pdf el PDF resultante tendrá fuentes suavizadas.

Mini-script (disponible como descarga):

#!/bin/sh
# man2ps v1.0 - Dominio Público

if [ -z $1 ];
then
   echo "Uso: `basename $0` comando [archivo.ps|archivo.pdf]"
   exit 2
fi

if [ -z $2 ];
then
   ARCHIVO=$1.ps
else
   ARCHIVO=$2
fi;

echo Creando $ARCHIVO...
case $ARCHIVO in
    *.pdf)  man -t $1 | ps2pdf - > $ARCHIVO ;;
    *)      man -t $1 > $ARCHIVO ;;
esac

Comentarios importados desde outlyer.net:

  1.  Comentario de Walter el 06.04.2010
     Que buen ejemplo, Gracias

  2.  Comentario de Toni el 06.04.2010
     De nada hombre ;)