Redireccionamiento

Ver el tema anterior Ver el tema siguiente Ir abajo

Redireccionamiento

Mensaje por VictorH el Jue Feb 18, 2016 12:44 pm

A la hora de redireccionar trabajamos con 3 descriptores de archivo básicos:
0  - Es el stdin o standard input, la entrada de datos
1  - Es el stdout o standard error, la salida estándar de datos
2  - Es el stderr  o standard error, la salida de errores

Aparte de eso el usuario puede crear descriptores propios (numerados a partir del 3) donde definiríamos como procesar esa salida de datos. Gracias a esto podríamos hacer que a las líneas que sacase dicho descriptor se les aplicase un formato determinado o que las precediésemos de la hora en la que fueron procesadas, por ejemplo.

Lo importante a entender de la salida de datos es la sintaxis que usamos para operar con ella
">" Es el equivalente a "1>" y por tanto sólo redireccionará la salida estándar de datos, prescindiendo de los errores
"2>" Redireccionará sólo errores
">>" Agregará la salida que le asignemos (por defecto 1 si no ponemos nada) en lugar de sobreescribir.
">&" Hace casi lo mismo que >> pero permitiendo definir tras el & la salida a la que vamos a agregar la nueva salida

Una forma mas clara de explicarlo es esta. Suponiendo que estamos copiando una serie de archivos y un directorio que contiene algo esperamos obtener un mensaje de error al intentar dicha copia sin usar -r

cp "misarchivos" "midirectorio" > "info"
No almacenaría nada en "info" ya que cp está trabajando sin mostrar salida de datos estándar y solo veríamos los errores en la pantalla
cp -v "misarchivos" "midirectorio" > "info"
Almacenaría las operaciones exitosas en "info" ya que cp ahora muestra la salida de datos estándar, pero como la redireccionamos solo vemos los errores en la pantalla
cp -v "misarchivos" "midirectorio" 2> "info"
Solo almacenaría los errores en "info" y solo veríamos la salida de datos standard (aciertos) en la pantalla
cp -v "misarchivos" "midirectorio" >"info" 2> "info"
Solo almacenaría los errores en info ya que sobreescribiría la salida de datos estandard. No veríamos nada en pantalla
cp -v "misarchivos" "midirectorio" >"info" 2>> "info"
Almacenaría tanto el stdout como el stderr en el mismo archivo pero debido a como trabaja el ">>" primero almacenaría todo el resultado de stdout y luego todo el resultado de sterr.
cp -v "misarchivos" "midirectorio" >"info" 2>&1
Almacenaría tanto el stdout como el stderr en el mismo archivo pero en este caso las líneas de error o aciertos se irían almacenando según van siendo procesadas.

Es decir, la diferencia entre ">>" y ">&" es que con ">>" el resultado sería este:
ACIERTO
ACIERTO
ACIERTO
ERROR
ERROR
ERROR

Y con ">&" podríamos tener algo así
ACIERTO
ERROR
ERROR
ACIERTO
ERROR
ACIERTO

Por tanto la única forma de almacenar toda la salida de una operación, incluyendo tanto "errores" como "aciertos", sería a través de ">>" o ">&", existiendo diferencias sin embargo en como procesará esos datos. Una forma alternativa sería escribiendo nuestro propio descriptor que almacene datos estandar y errores de forma conjunta pero por ahora no debemos saber como hacerlo.

Para una información mas detallada (y correcta) echad un vistazo a este artículo. Trata temas mucho mas complejos y no son necesarios para el examen, así que entrad bajo propio riesgo
http://wiki.bash-hackers.org/howto/redirection_tutorial
avatar
VictorH
Admin

Posts : 45
Join date : 01/10/2015

Ver perfil de usuario http://daw15.boardlog.com

Volver arriba Ir abajo

Re: Redireccionamiento

Mensaje por VictorH el Jue Feb 18, 2016 1:07 pm

La entrada de datos en principio es menos compleja ya que para poder llevarla a cabo solo necesitaremos
"-" El operador que especifica que empezaremos a introducir datos por teclado
"<" El operador que indicará a donde se redireccionará esa entrada de datos

La combinación estandar de ambos suele ser esta, por ejemplo
cat - <fichero Donde fichero contiene "hola"
Resultaría en imprimir por pantalla "hola"

Para introducir datos sin redireccionar su entrada desde un archivo, sin embargo, debemos de completar la introducción de dichos datos haciendo "Control+D" ya que comandos de interrupción como "Control+Z" simplemente detendría toda la orden sin llegar a almacenar nuestra entrada.

Ahora bien, una opción del redireccionamiento de entrada también es especificar que palabra queremos que signifique el fin de dicha entrada. Así, por ejemplo:
cat fichero - <<END
Nos permitiría introducir datos hasta que le pusiésemos en una línea "END" y entonces nos mostraría el contenido del fichero, mas el contenido de nuestra introducción, omitiendo por supuesto la palabra clave de fin de introducción.

Por último cuando en la redirección, tanto de entrada como de salida, usamos /dev/null estaremos trabajando con un dato nulo.
>/dev/null Implica que estamos eliminando la salida
</dev/null Implica que no cogemos nada en la entrada

Así, si intentásemos hacer cat fichero - </dev/null sería exactamente igual que cat fichero ya que ignoraría por completo la entrada.
avatar
VictorH
Admin

Posts : 45
Join date : 01/10/2015

Ver perfil de usuario http://daw15.boardlog.com

Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba

- Temas similares

 
Permisos de este foro:
No puedes responder a temas en este foro.