BULMA Bulma amb el projecta Defective by Desing
Bergantells Usuaris de GNU/Linux de Mallorca i Afegitons   |   Bisoños Usuarios de GNU/Linux de Mallorca y Alrededores
CONTENIDOS
. Jornadas de software libre
. Version para PDA
. Enlaces breves
. La asociacion
. Los mas leidos
. Autores [Actividad]
. Ultimos Comentarios
. Todos los titulares!
. Estadisticas
. Guia de estilo
. ¿Sugerencias?
. Wiki
. XML [Ayuda]
Listas de correo
. Archivos bulmailing
. Archivos BulmaGes
Radio libre :-)
. Des de la Xarxa (Archivos)
. Mallorca en Xarxa
Busquedas

+ Enlaces Linux
Ultimos kernels
(02/09/2010 20:12:57)
    
Google


En bulma.net
En internet
Dale potencia a tus bourne-shell scripts (24947 lectures)
Por Domingo Fiesta Segura
C2H5OH (http://www.krenel.net)
Creado el 18/08/2004 04:35 modificado el 18/08/2004 04:35

Pagina2/3

3. Manejo de descriptores de fichero

Una de las primeras cosas que se aprende a hacer con el shell (tanto interactivamente como en script) es utilizar las redirecciones de la entrada/salida estándar a ficheros alternativos.

Imagino que sabéis lo que es un descriptor de fichero. Para los que no lo sepan basta con decir que es un índice de una tabla de información sobre ficheros abiertos que gestiona el sistema operativo para cada proceso; por eso el descriptor de fichero es un entero.

3.1. Introducción a redirecciones

Las redirecciones no son más que operaciones sencillas sobre ficheros que podemos realizar desde el shell. Podemos abrir ficheros para lectura, para escritura desctructiva[1] (primero trunca y luego escribe), para escritura constructiva (abre y empieza a escribir desde el final) y para lectura/escritura.

Normalmente es más fácil de entender cuando uno piensa en términos de entrada y salida de texto, pero en algunos casos resulta más cómodo imaginar las llamadas a sistema que se ejecutarán al interpretar la redirección.

Si no se indican los descriptores de ficheros de forma explícita por defecto se asume 0 (entrada estándar) para las redirecciones de entrada (apertura de ficheros para lectura) y 1 (salida estándar) para las redirecciones de salida (apertura de ficheros para escritura). También se toma 0 por defecto para lectura/escritura.

3.2. Operaciones de redirección

Las que todos conocemos. Abriendo ficheros y asociándolos a descriptores. Recordemos que si no se indica el descriptor se toma 0 para entrada o entrada/salida y 1 para salida y append.

  • Entrada o lectura: num < fichero
  • Salida o escritura: num > fichero
  • Append: num >> fichero
  • Lectura escritura: num <> fichero (¿Esto lo usa alguien?)

También podemos duplicar, cerrar y mover descriptores de ficheros que ya estén abiertos.

  • Copia descriptor de entrada: copia < &original)
  • Copia descriptor de salida: copia > &original
  • Cerrar descriptor de entrada: descriptor < &-
  • Cerrar descriptor de salida: descriptor > &-
  • Mover descriptor de entrada: nuevo < &original- (original es cerrado)
  • Mover descriptor de salida: nuevo > &original- (original es cerrado)

Tanto copia, original, nuevo como descriptor deben de ser (o deben expandirse a) un número entero que se corresponda con un descriptor abierto. Nuevamente insistir en que si el número antes del operador de redirección (<, >) no está presente se tomarán los valores por defecto 0 ó 1.

3.3. Modo de uso

A niveles prácticos, los operadores para copiar, cerrar y mover descriptores no tienen en cuenta que el fichero sea de lectura y/o escritura. Es decir, si tenemos el descriptor 5 abierto y lo queremos copiar al 7 da igual que hagamos 7<&5 o 7>&5 . Sólo resulta útil diferenciar < de > cuando el parámetro de la izquierda es la entrada o la salida estándar[2].

ACLARACIÓN

En una línea de comandos las redirecciones se evalúan de izquierda a derecha. Pongamos por ejemplo el típico caso en que queremos guardar la salida de un programa que da un error para mandarlo a algún desarrollador. Si ejecutamos programa >fichero.log los errores no se guardarán porque salen por un descriptor distinto (nº 2 o STDERR).

Como queremos mandar tanto STDOUT como STDERR a fichero.log probamos con programa 2>&1 >fichero.log. Esto haría que lo que sale por STDOUT fuera a fichero.log pero lo que sale por STDERR saldrá por la terminal, es decir, lo que era STDOUT antes de redireccionarlo a fichero.log.

¿Cómo solucionamos el problema? Pues primero haciendo que STDERR apunte a STDOUT y luego redirigir STDOUT, es decir: programa >fichero.log 2>&1. Si usamos bash, existe una abreviatura para redirigir STDOUT y STDERR a la misma vez: programa &>fichero.log; ojo que esta abreviatura NO es estándar de bourne shell, sólo la implementa bash. Si todavía os quedan dudas leed la página man del bash(1) en la sección REDIRECTION.

Veamos ahora cómo utilizar los descriptores de ficheros con un ejemplo:

#! /bin/sh
# copia2.sh: Crea DOS copias de un fichero de texto.
# Sintaxis:
#
#   copia2 origen nombre_copia1 nombre_copia2

escribe2()
{
    echo $@ >&5  # Salida estándar al descriptor 5
    echo $@ >&6  # Salida estándar al descriptor 6
}

test $# -lt 3 && exit 1

# Así es como abrimos o cerramos descriptores de forma permanente en un 
# script. Las redirecciones se ejecutan de izquierda a derecha. Así
# pues no es lo mismo hacer:
#    exec >test.log 2<&1
# que hacer:
#    exec 2<&1 >test.log
# Más explicaciones en la página man del sh(1) sección REDIRECTION.

# desc. 5: copia1 (salida)
# desc. 6: copia2 (salida)
# desc. 7: origen (entrada)
exec 5>$2 6>$3 7<$1

IFS=""  # Esto es para que el "read" coja toda la línea en una sola variable.
while read linea <&7; do
    escribe2 $linea
done

Otro ejemplo de propina:

#! /bin/sh
# cat2.sh: Implementación cutre del cat en un script.

if test -r ${1:-""}; then
    exec <$1
fi

IFS=""
while read l; do
    echo "$l"
done

Podéis encontrar más ejemplos sencillos y demostraciones prácticas que ilustran las ventajas en tiempo de ejecución que existen al utilizar descriptores, aqui.

3.4. Otras redirecciones

Quizá muchos se pregunten: Si hay un operador >>, ¿también hay un <<?. Pues, efectivamente, lo hay. Pero su uso tiene poco que ver con lo hasta ahora mencionado. El operador << se utiliza para crear lo que se conoce como here document que no es más que incrustar un fichero de texto (para ser utilizado como entrada estándar) dentro de un script. Por ejemplo:

#! /bin/sh

cat <<MARCA_FIN_TEXTO
En un lugar de la mancha, de cuyo nombre no quiero acordarme...
...
  ...
    ...y vivieron felices y comieron perdices.
MARCA_FIN_TEXTO

[1] Sé que no es un adjetivo muy apropiado.
[2] Para aquellos que necesiten una explicación más técnica, pueden empezar por man dup2.

Paginas: <<Abreviatura Anterior  1  2  3  Abreviatura Siguiente>>

Imprimir
Version para
imprimir

Imprimir
Version
PDF
GRACIAS
Distribuciones Universal
Por el servidor
Dpto. de Matematicas e Informatica
Calificacion
***0
Vots: 31
Danos tu opinion:
**** Excelente
***0 Muy Bueno
**00 Bueno
*000 Regular
0000 Malo
SECCIONES
Noticia
Breve
Truco
Enlace
Participa
Proyecto
Articulo
Webbulma
Manoletada :-)
Seguridad
Modificado: 23/1/2008 19:57:44 | Tiempo Total: 0.015 segs | Kernel: Linux - i686 - 2.6.26-1-686 | Last boot: 02/09/2010 20:21 CEST
Powered by Apache    MySQL    PHP    Gimp