On Thu, Jul 10, 2003 at 01:45:41PM +0200, Marcelo E. Magallon wrote:
> On Thu, Jul 10, 2003 at 12:45:41PM +0200, Javier Fern�ndez-Sanguino Pe�a 
> wrote:
> 
>  > justo despu�s del bucle que define el valor que tendr�.. �O te
>  > refieres a otra cosa?
> 
>  A eso me refiero, s�.  La soluci�n que propones no es at�mica tampoco.
> 
>     [ -e /tmp/archivo ] || > /tmp/archivo

S�, ya se que no es atom�tica, pero mejora respecto al anterior. Adem�s ten
en cuenta que s�lo es necesario cuando tempfile no est� presente (ya que lo 
crea) o sea, en el caso de utilizar drae.$$... Mira tempfile(1)
Con lo que tendr�as, una creaci�n _segura_ si tienes tempfile instalado 
(que est� en debianutils que es 'Essential' en Debian) y  una creaci�n no 
tan segura (pero con un margen de condici�n de carrera muy ajustado) en 
otros S.O.


>  > PS: Tampoco es que sea muy recomendable utilizar una zona com�n
>  > (/tmp) para crear ficheros temporales
> 
>  De hecho ese es el problema.  Dado que esto es un archivo temporal de
>  un usuario, se deber�a crear el archivo en un directorio al cual solo
>  el usuario tenga acceso de escritura en situaciones normales (por
>  ejemplo $HOME).

Totalmente de acuerdo. Pero habr�a que considerar que a veces el $HOME no 
est� definido �Qu� tal (para rizar el rizo) el que adjunto? :-)

Javi
#!/bin/bash
# Programa para acceder al diccionario de la RAE
# (c) 2003 Javier Fernandez-Sanguino Pe�a
# Distribuido bajo los t�rminos de la licencia GNU GPL
# ver http://www.gnu.org

error () {
# Salir con error
        echo "ERROR: $1"
        exit 1
}

setup () {
# Definir el entorno inicial

[ -z "$PAGER" ] && PAGER=more

DIR="$HOME"
# Si no hay $HOME lamentablemente tenemos que utilizar otro
# directorio... aunque aqu� se podr�a abortar
[ -z "$DIR" ] && DIR="/tmp/"
[ ! -d "$DIR" ] && error "No existe el directorio $DIR para almacenamiento 
temporal"

# Determine how to set the tempfile
if [ -n "`which tempfile`" ]; then
        draetmp=`tempfile -d $DIR --prefix=.`
        [ -e "$draetmp" ] || error "Tempfile no ha podido crear el fichero 
temporal $draetmp!"
else
        draetmp=$DIR/drae.$$
        if [ ! -e "$draetmp" ] ; then
                >$draetmp
        else
                error "Alguien ha creado ya el fichero temporal $draetmp!"
        fi
fi
trap "rm -rf $draetmp" 1 2 3 9 15

if [ -n "`which lynx`" ]; then
        DOWNLOAD="lynx --dump --nolist";
elif [ -n "`which links`" ]; then
        DOWNLOAD="links -dump";
elif [ -n "`which w3ma`" ]; then
        DOWNLOAD="w3m -dump -T text/html -s";
else
        error "No se encuentra un programa que pueda ser utilizado para acceder 
al diccionario";
fi

}

# Inicio del programa

# TODO si se busca m�s de una iterar por ellas
[ -z "$1" ] && error "Modo de uso: $0 palabra"
setup

$DOWNLOAD "http://buscon.rae.es/draeI/SrvltGUIBusUsual?TIPO_HTML=2&LEMA=$1"; > 
$draetmp
[ $? -ne 0 ] && error "Error al acceder a buscon.rae.es"


if [ -f "$draetmp" ] 
then
        cat $draetmp 2> /dev/null | tail -n $((`wc -l $draetmp 2> /dev/null | 
awk '{ print $1 ;}'`-2)) | $PAGER
        echo
        rm $draetmp
else
        error "Error al acceder al fichero temporal $draetmp (no creado)"
fi

exit 0

Attachment: pgpNgIWUBBdZd.pgp
Description: PGP signature

Responder a