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:
pgpnw_fYKwQSa.pgp
Description: PGP signature