Un poco de redirección de shell

10 de mayo 2009 por prashant · Comentarios
Filed under: la tecnología

Así es como lo hacemos normalmente la redirección de shell
$ ./pgm.sh args >out.txt 2>err.txt
Yo quería que modificar un poco y ejecutar de la siguiente manera
$ ./pgm.sh args
con el requisito de que la producción y el error debe ir a un nombre de fichero en el interior pgm.sh calcula sobre la base de argumentos. Un caso ilustrativo podría ser cuando la fecha es parte de args. Así que le gustaría stdout para ir a decir / su / directorio / pgm_out_YYYYMMDD.txt 1

El problema con la forma estándar de reorientar N>file.txt es decir, la asociación de descriptor de fichero n al archivo.txt, es que funciona sólo para el proceso de nueva forma de horquilla y no para el proceso actual.
tan
$ echo hi 1>out.txt ; echo hii . enviará hola a out.txt, pero se imprimirá hii a la salida estándar 2

Aquí es donde exec viene a nuestro rescate. Si a esto añadimos exec 1>somefile.txt entonces la salida del resto de la secuencia de comandos ir a algun_archivo.txt

$ cat test.sh
#!/usr/bin/env bash
exec 1>out.txt
echo hi
echo hii
$. / Test.sh redirigirá alta, así como a la hii out.txt

Al igual que redirigir stdout stderr, así como vamos a hacer algo como esto
cat test2.sh
exec 1>out.txt
exec 2>err.txt
echo out text
echo 1>&2 err text
somenoneexitent command
ls -ld /tmp

Ahora que se acerca de nuevo al punto original de volver a dirigir a algún archivo desde el interior de la concha, digamos que el programa calcula el nombre del archivo en algunos OUTFILE variable, podríamos haber hecho exec 1>$OUTFILE

Eso resuelve el problema actual. Pero usted puede tener gusto de ir a través del ejemplo siguiente, que logra el "acceso aleatorio" del archivo de script de shell. Ejemplo es de aquí
echo 1234567890 > File # Write string to "File".
exec 3<> File # Open "File" and assign fd 3 to it.
read -n 4 <&3 # Read only 4 characters.
echo -n . >&3 # Write a decimal point there.
exec 3>&- # Close fd 3.
cat File # ==> 1234.67890

Con los comentarios, este código es autoexplicativo.
-
1 También se puede hacer por $ ./pgm.sh args >pgm_out`date +%Y%m%d` pero la idea es generar este nombre de archivo basado en una lógica en el programa en sí.
2 1 1> out.txt es redundante, pero aclara que aquí estamos redirigiendo FD 1