miércoles, 8 de septiembre de 2010

Curso Básico de Unix (VII)

LA SHELL

La shell es la encargada de intermediar entre el sistema operativo, el ordenador, los programas y los usuarios.
Al iniciar la sesión se nos asigna una shell, que esta definida en /etc/passwd. Cuando esta shell esta dispuesta para aceptar nuestras ordenes, nos lo indica mostrándonos el prompt.

Cuando recibe una petición, crea un proceso hijo. Si se trata de un comando compuesto, crea diferentes hijos para cada parte de este. 


Luego, cuando un hijo acaba su tarea, devuelve el resultado y la shell se encarga de mostrar el resultado final. Mientras que se hace esto, no se aceptan nuevas peticiones a la shell.

La shell más veterana, y más básica es SH, y de ella derivan las demás. Por esta razón, los scripts suelen hacerse para SH, asegurando así la compatibilidad. La más popular, hoy, es BASH, que trata de reunir lo mejor de todas las shell y es la más común en los sistemas Linux.

Otra shell importante es CSH, orientada a desarrolladores, que añade a las funciones de SH los alias, el histórico de operaciones… Sus ficheros de configuración son .login .logout y .cshrc y otra shell popular es KSH, que se configura en los ficheros .profile y .kshrc

BASH (GNU Bourne Again Shell) está basada en la shell de Unix y es 100% compatible posix y SH.

Ahora vamos a ver un poco más en detalle que hace cada shell al iniciarse:

SH y KSH primero buscan la configuración general en /etc/profile, de donde se cargan las variables de entorno. Después, si existe, carga la configuración especifica del usuario del fichero .login de la home del usuario.

CSH primero carga el fichero el fichero /etc/login o /etc/.login, para la configuración general, y luego, si existe, carga la configuración especifica del usuario del fichero .login de la home del usuario. Cuando se cierra la sesión, si existe, se ejecuta el fichero .logout

Por su parte, BASH, al entrar lee el fichero /etc/profile, y luego, en la home del usuario, lee .bash_profile. Si no existe, prueba con .bash_login y si tampoco esta, prueba con .profile. Al cerrar sesión, ejecuta .bash_logout, si existe.

Por otra parte, los ficheros .shrc, .cshrc, .kshrc y .bashrc se utilizan cuando se inicia una shell de forma indirecta, es decir, a petición del usuario, desde el entorno gráfico…

Antes decíamos que mientras que se atiende una petición, no se atienden otras. Esto es así con las peticiones “síncronas”, que son las que empleamos normalmente. Pero también podemos lanzar una petición en segundo plano, añadiendo al final del comando el carácter &. Al hacerlo, aparece un número, el PID, que identifica al proceso mandado al segundo plano, y se nos mostrara cuando el proceso finalice. Entre tanto, la shell admite nuevas peticiones.

Si la orden que vamos a dar a la shell es muy larga, podemos dividirla en varias líneas para que nos sea más cómoda usando el carácter \. Si por el contrario, queremos ejecutar en una sola línea varias ordenes, lo podemos hacer separando una de otra por el carácter ; Por último, si lo que queremos es que la salida de un comando sirva de entrada para otro, los separaremos por el carácter |

Unix maneja lo que se llaman ficheros estándar para recibir y enviar información. La información entra por la llamada entrada estándar, conocida como fichero stdin (identificada con un 0). La información la devuelve en la salida estándar, fichero stdout (identificado con un 1). Se utiliza un control de errores, la salida de errores stderr (identificado con un 2). Pero esto lo veremos mejor con un ejemplo.
find / -name fichero –print 2 > /dev/null
Nos realiza la búsqueda, pero los errores (salida 2, stderr) los manda a /dev/null, algo así como mandarlo al olvido.

Esto nos sirve para hacer algunas redirecciones:

Si queremos guardar el resultado de alguna operación, podemos redireccionar la salida a un fichero donde guardar los resultados con >
Por ejemplo, ls > ficherito no mostrara nada en pantalla, creara un fichero llamado ficherito con el resultado. Si en lugar de machacar el fichero de destino, queremos añadir el contenido, sustituimos el > por >>.

También podemos usar un fichero como entrada de datos para un comando.
Por ejemplo cd < fichero manda como  parámetros al comando cd el contenido de fichero.

Si lo que necesitamos es que el resultado de un comando actúe como entrada para otro, los tenemos que separar con |. Por ejemplo ls | more donde ls manda los datos a more para que este los tome como entrada y los pagine.

Y aquí acaba la lección de hoy.

No hay comentarios:

Publicar un comentario

prekes sodui