Consola Virtual de Linux (4): Bash io redirección bajo el capó

1. Bash io redirección sintaxis

Una de las principales funciones de Bash es el control del proceso. Bash puede iniciar procesos, suspenderlos, traerlos de nuevo a primer plano de tierra, y matar a los procesos. Antes de iniciar un proceso, Bash necesita preparar un entorno de ejecución de procesos. Descriptor del archivo 0/1/2 (stdin, stdout, estándar de error) son una parte de este entorno.

Bash tiene diferentes maneras de iniciar un proceso. Cuando ingresa un comando, Bash primera bifurcación a un niño. Este proceso hijo hereda todos los descriptores de fichero abiertos, variables de entorno y otras cosas. Este proceso hijo y luego hacer «execve» para reemplazar la imagen del proceso original con el ejecutable suministrado a través de comandos. Bash «esperar» a que este proceso hijo para salir. Después de las salidas de comandos ejecutables, proceso hijo terminado. Si el comando es un comando del Bash comando como «cd, pushd, popd» etc, Bash ejecutará en proceso de Bash sin bifurcar un nuevo proceso. Si el comando es un script de Bash, entonces se iniciará un nuevo bash para ejecutar este script. Si utiliza «comando exec», después del golpe no se generan nueva prensa para «execve» este comando, pero se ejecutará en proceso Bash sí mismo. Así que cuando este comando se inicia, la imagen del proceso de bash es reemplazada por la imagen de este comando. Al comando se interrumpe, Bash ya no existe más.

En la línea de comandos, puede especificar los parámetros de redirección io. Bash preparará la redirección io necesario que el nuevo proceso antes de que se inicie. En realidad, Bash puede ajustarse de descriptor de archivo también. Vamos a ilustrar esto con algunos ejemplos:

luke luke @ debian: ~ / t $ ps
PID TTY ; TIEMPO CMD
10.486 pts / 2 00:00:00 ps
12.113 pts / 2 00:00:00 fiesta
luke luke @ debian: ~ / t $ lsof-p $ $
COMANDO PID TIPO FD usuario del dispositivo TAMAÑO / OFF ; nombre de nodo
fiesta 12113 lucas cwd ; DIR 8,3 4096 1385370 / home / luke / t
fiesta 12113 lucas rtd DIR 8,3 4096 2 /
fiesta 12113 lucas txt REG 8,3 975.488 3.670.018 / bin / bash
………… …………

fiesta 12113 lucas 0r CHR 136,2 0T0 5 / dev/pts/2
fiesta 12113 lucas 1w CHR 136,2 0T0 5 / dev / pts / 2
fiesta 12113 lucas 2w CHR 136,2 0T0 5 / dev/pts/2
fiesta 12113 lucas 255u CHR 136,2 0T0 5 / dev/pts/2

Así que este es un archivo estándar Bash Descriptores situación. Vía «ejecutivo», podemos ajustar fds de Bash. En primer lugar, vamos a redirigir el stderr a «stderr.txt». Después de la redirección, el intérprete de comandos y el comando se escribe después del símbolo del sistema se dará salida a «stderr.txt». En otro terminal, podemos ver el contenido de stderr.txt. La salida del comando que escriba aún en stdout, por lo que aún se puede ver el resultado

luke luke @ debian: ~ / t exec $ 2> stderr . txt
stderr.txt
dom 26 de enero 2014 23:18:01 CST
Lucas
COMANDO PID USUARIO FD TIPO DISPOSITIVO TAMAÑO / OFF nombre de nodo
fiesta 24038 rtd luke DIR 8,3 ; 4096 2 /
fiesta 24038 luke txt REG 8,3 975488 3670018 / bin / bash
fiesta 24038 lucas mem REG 8,3 47616 2360083 / lib/x86_64-linux-gnu/libnss_files-2.13.so
fiesta 24038 lucas mem REG ; 8,3 43552 2360087 / lib/x86_64-linux-gnu/libnss_nis-2.13.so
fiesta 24038 lucas mem REG 8,3 89056 2360077 / lib/x86_64-linux-gnu/libnsl-2.13 . así
fiesta 24038 lucas mem REG 8,3 31584 2360079 / lib/x86_64-linux-gnu/libnss_compat-2.13.so
fiesta 24038 lucas mem REG 8,3 5.748.608 3.935.511 / usr / lib / locale / locale-archive
fiesta 24038 lucas mem REG ; 8,3 1.595.408 2.360.011 / lib/x86_64-linux-gnu/libc-2.13.so
fiesta 24038 lucas mem REG 8,3 14768 2360025 / lib/x86_64-linux-gnu/libdl-2.13.so
fiesta 24038 lucas mem REG ; 8,3 167.952 2.360.135 / lib/x86_64-linux-gnu/libtinfo.so.5.9
fiesta 24038 lucas mem REG 8,3 136936 2359989 / lib/x86_64-linux-gnu/ld-2.13.so
fiesta 24038 lucas mem REG 8 , 3 26066 4067425 / usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache
fiesta 24038 lucas 0r CHR 136,1 0T0 4 / dev / pts / 1
fiesta 24038 luke 1w CHR 136,1 0T0 4 / dev/pts/1
fiesta 24038 lucas 2w REG 8,3 ; 228 1319639 / home / luke / t / stderr.txt
fiesta 24038 lucas 255u CHR 136,1 0T0 4 / dev/pts/1



luke luke @ debian: ~ / t $ tail-f stderr.txt
luke luke @ debian: ~ / t $ ls
luke luke @ debian- : ~ / t $ fecha
luke luke @ debian: ~ / t $ whoami
luke luke @ debian: ~ / t $ lsof-p $ $
luke luke @ debian: ~ / t $

Ahora vamos a redirigir stderr nuestro regreso a / dev/pts/1:
luke luke @ debian: ~ / t exec $ 2> / dev/pts/1

luke luke @ debian: ~ / t $ lsof-p $ $

COMANDO PID USUARIO FD TIPO DISPOSITIVO TAMAÑO / OFF Nombre de nodo


fiesta 24038 lucas txt REG 8,3 975488 3670018 / bin / fiesta

fiesta 24038 lucas mem REG 8,3 47616 2360083 / lib/x86_64-linux- ……. …………………
fiesta 24038 lucas 0r CHR 136, 1 0T0 4 / dev/pts/1
fiesta 24038 lucas 1w CHR 136,1 0T0 4 / dev/pts/1
fiesta 24038 lucas 2w CHR 136,1 0T0 4 / dev/pts/1
fiesta 24038 lucas 255u CHR 136,1 0T0 4 / dev/pts/1
luke luke @ debian: ~ / t $

Entonces usted tendrá el indicador bash y el comando haciendo eco de nuevo a la consola original de nuevo. A continuación, vamos a redirigir stdout a «stdout.txt». Después de la redirección, no se puede ver la salida de su mecanografiada al mando ya en el terminal inicial. Usted puede «tail-f stdout.txt» en otro terminal para ver la salida del comando:
luke luke @ debian: ~ / t exec $ 1> stdout.txt
luke luke @ debian: ~ / t $ ls
luke luke @ debian: ~ / t $ fecha
luke luke @ debian: ~ / t $ lsof-p $ $
luke luke @ debian: ~ / t $


luke luke @ debian: ~ / t $ tail-f stdout.txt
stderr.txt
stdout.txt

Courier New, Courier, monospace; font-size: x-small;»> COMANDO PID NOMBRE nodo de usuario FD TIPO DISPOSITIVO TAMAÑO / OFF

fiesta 24038 lucas cwd DIR 8,3 4096 1385370 / home / luke / t
fiesta 24038 rtd luke DIR 8,3 ; 4096 2 /

……………………………..

fiesta 24038 lucas 1w REG 8,3 51 1319992 / home / luke / t / stdout.txt

fiesta 24038 lucas 255u CHR 136,1 0T0 ; 4 / dev/pts/1

Ahora vamos a redirigir stdout de nuevo a «/ dev / pts / 1 «, entonces usted tendrá una terminal llena de bash funcional de nuevo:
luke luke @ debian: ~ / t exec $ 1> / dev/pts/1

A continuación vamos a redirigir nuestra stdin. Vamos a crear un «stdin.txt» file
luke luke @ debian: ~ / t $ cat stdin.txt
ps
lsof-p $ BASHPID

luke luke @ debian: ~ / t $ ejecutivo 0

PID TTY TIEMPO CMD

Courier New, Courier, monospace; font-size: x-small;»> 14.827 pts / 1 00:00 : 00 ps

Courier New, Courier, monospace; font-size: x-small;»> COMANDO PID USUARIO FD Nombre de nodo TIPO DISPOSITIVO TAMAÑO / OFF

fiesta 12256 rtd luke DIR 8,3 4096 2 /

………………………….

fiesta 12256 lucas 0r REG 8,3 29 1379938 / home / luke / t / stdin.txt
fiesta 12256 lucas 1w CHR 136,1 0T0 4 / dev / pts / 1

fiesta 12256 lucas 255u CHR 136,1 0T0 4 / dev / pts / 1

luke luke @ debian: ~ / t $ echo «hola fd 3″> 3.in

Courier New, Courier, monospace; font-size: x-small;»> luke luke @ debian: ~ / t exec $ 4> 4.out

Courier New, Courier, monospace; font-size: x-small;»> luke luke @ debian- : ~ / t $ lsof-p $ $

fiesta 28985 lucas cwd DIR 8,3 4096 1385370 / home / luke / t

fiesta 28985 lucas IDT DIR 8,3 4096 2 /

………………………..

fiesta 28985 lucas 1w CHR 136,1 0T0 4 / dev/pts/1

fiesta 28985 lucas 3u REG 8,3 11 1379948 / home / luke / t/3.in

Courier New, Courier, monospace; font-size: x-small;»> fiesta 28985 lucas 5u REG 8,3 0 1.379.622 / home/luke/t/5.inout

de bash 28985 255u luke CHR 136,1 0T0 4 / dev/pts/1

Courier New, Courier, monospace; font-size: x-small;»> luke luke @ debian: ~ / t $ cat <3 y
hola fd 3

Courier New, Courier, monospace; font-size: x-small;»> luke @ mediocre debian: ~ / t $ cat 4.out

Courier New, Courier, monospace; font-size: x-small;»> luke luke @ debian: ~ / t $ echo hola fd 5> & 5

Courier New, Courier, monospace; font-size: x-small;»> hola fd 5

luke luke @ debian: ~ / t $ lsof-p $ $
COMANDO PID USUARIO FD TIPO DISPOSITIVO TAMAÑO / OFF Nombre de nodo
fiesta 28985 lucas cwd DIR 8,3 4096 1.385.370 / home / luke / t

fiesta 28985 lucas txt REG 8,3 975488 3670018 / bin / bash

fiesta 28985 lucas 0r CHR 136,1 0T0 4 / dev/pts/1

fiesta 28985 lucas 2w CHR 136,1 0T0 4 / dev/pts/1

fiesta 28985 lucas 4u REG 8,3 11 1324010 / home/luke/t/4.out

fiesta 28985 lucas 5u REG 8,3 11 1379622 / home/luke/t/5.inout

Courier New, Courier, monospace; font-size: x-small;»> luke luke @ debian: ~ / t $ cat

Courier New, Courier, monospace; font-size: x-small;»> luke luke @ debian: ~ / t $ cat

más hola a fd 5

Puesto que no hay una» utilidad lseek «en Bash para ajustar el offset fd, en general, no vamos a utilizar un archivo normal de entrada y salida en Bash

Si desea cerrar la fd ya abierto en bash, puede hacer lo siguiente:.

Courier New, Courier, monospace; font-size: x-small;»> luke luke @ debian- : ~ $ ejecutivo 4> & –

Courier New, Courier, monospace; font-size: x-small;»> luke luke @ -debian: ~ $ lsof-p $ $

fiesta 22860 lucas cwd DIR 8,3 4096 1318208 / home / luke

fiesta 22860 rtd luke DIR 8,3 4096 2 /

…………..

fiesta 22860 lucas 0r CHR 136,2 0T0 5 / dev/pts/2

Courier New, Courier, monospace; font-size: x-small;»> fiesta 22860 lucas 2w CHR x-small;»>init(1)───wmiirc(28966,luke)───gnome-terminal(28967)───bash(28985)─┬─cat(22736)

init(1)───wmiirc(4493,luke)───gnome-terminal(4494)───bash(29591)───fdshow(22453)───sh(22454)───pstree(22455)
init(1)—wmiirc(4493,luke)—gnome-terminal(4494)—bash(6296)—bash(9398)—fdshow(9400)—sh(9401)—pstree(9402)
init(1)───wmiirc(4493,luke)───gnome-terminal(4494)───bash(6296)─┬─bash(9398)───fdshow(9400)

Deja un comentario

Tu dirección de correo electrónico no será publicada.