Principios de los shells (redirección)
Operación de los shell y conceptos básicos de sintaxis
El shell es un programa que nos permite interactuar con el sistema operativo. La “línea de comandos” es la entrada del usuario para el shell. El shell examina la línea de comandos, verifica que lo que se ha escrito es correcto, determina si se ha digitado el nombre de un programa (un programa binario o compilado), y de ser así envia dicho programa al núcleo (kernel) para su ejecución.
Todos los comandos shell utilizan el siguiente formato:
comando opcion1 opcion2 opcion3 ... opcionN argumento1 argumento2 ... argumentoN
Esta línea se conoce como línea de comandos; que consiste en un comando y una o más opciones (y/o argumentos). Por lo general el espacio en blanco se ignora. En Linux los comandos son sensibles al uso de mayúsculas y minúsculas, cosa que no pasa en Windows. El comando se termina pulsando la tecla Enter; aunque se puede continuar el comando en una nueva línea usando backslash (\).
comando-largisisisisisisisimo opcion1 opcion2 opcion3 ... opcionN \
argumento1 argumento2 ... argumentoN
Además es posible concatenar varios comandos, separándolos con punto y coma (;), por ejemplo:
clear; pwd; ls
Redirección de E/S
Cuando se ejecuta un programa en Linux se abre automáticamente tres archivos (flujos) de E/S para ellos. Estos son: la entrada estándar, la salida estándar y el error estándar. Aunque parezca confuso todos los sistemas UNIX utilizan este sistema, basado en el manejo de archivos. Por ejemplo, si desea enviar datos a su disco extraible debe enviar los datos al archivo de su pendrive, por lo general /dev/sda1.
Por defecto la salida estándar está conectada a la pantalla, la entrada de estándar al teclado, y el error estándar a la pantalla. Es posible reasignar estos destinos antes de ejecutar el programa, en lo que se conoce como redirección de E/S.
Supongamos que queremos crear una lista de archivos del directorio /usr/include, pero que dichos archivos contengan la palabra “#include”. Una forma sencilla de hacer esto sería:
grep -l “#include” /usr/include/*.h > ListaArchivos
grep comprobará los archivos de la carpeta /usr/lib cuya extensión sea *.h y determinará cuales de ellos contienen la palabra “#include”. El carácter > es el que indica la redirección de salida; esto ocasiona que el shell redireccione la salida estándar a el archivo ListaArchivos. Los nombres que están en el archivo se verán así:
/usr/include/GUI.h
/usr/include/Float.h
/usr/include/Redirect.h
/usr/include/nvu.h
/usr/include/bluefish.h
Para reemplazar, por ejemplo, la cadena /usr/include al principio de cada archivo puedes utilizar el comando sed:
sed 's#^/usr/include/##' < ListaArchivos > ListaArchivoss
El comando sed opera sobre los datos de entrada estándar, así que en este caso utilizamos el carácter < para redireccionar la entrada. En lugar de leer del teclado, esta vez leerá de un archivo. Después, la salida del comando sed se redirige hacia el archivo ListaArchivoss.
Pero, ¿cómo se redirige el error estándar? Para redirigir el error estándar se utiliza >&, por ejemplo:
sed 's#^/usr/include/##' < ListaArchivos >& ErrorSed > SalidaSed
O se puede redirigir tanto el error estándar, como la salida estándar así:
sed 's#^/usr/include/##' < ListaArchivos >& Salida
Tuberías
Una forma relacionada con la redirección se conoce como tubería. Partamos del ejemplo anterior; ya no solo quiero los archivos sino además los quiero ordenados alfabéticamente. Podriamos utilizar la redirección así:
grep -l “#include” /usr/include/*.h > ListaArchivos
sort ListaArchivos > ListaOrdenada
Importante!!!
El comando sort ListaArchivos > ListaOrdenada en ningún momento utiliza redirección de entrada. Algunos comandos como sort reciben directamente el nombre de un archivo como argumento, que es distinto a redireccionar la entrada; esto se conoce como filtro.
Obviamente debe haber una manera más eficiente de hacer ésta operación, es decir, sin usar dos comandos ni un archivo temporal. Por ejemplo:
grep -l “#include” /usr/include/*.h | sort > ListaOrdenada
El carácter de tubería (|) encadena dos comandos y conecta (redirecciona) la salida estándar del primero, a la entrada del segundo. Una sola línea de comandos puede tener cualquier número de tuberías:
grep -l “#include” /usr/include/*.h | sort | sed 's#^/usr/include/##' > ListaModificadaOrdenada
No hay etiquetas para esta entrada.







gemba dice:
Julio 11th, 2007 a las 3:24 pm
buena info