Teoría

De Documentacion NexuN

Contenido

[editar] ¿Qué es un shell?

El shell es el intérprete de comandos de UNIX. Para empezar, no hay un shell, sino muchos shells. El más simple es sh, o Bourne shell, que es tan simple que practicamente nadie utiliza, sin embargo, es el más comun a todos los sistemas, y además, ciertos programas lo usan, sobre todo los programas de instalación (precisamente por eso, por ser el minimo comun denominador de los shells). Algunos shells se derivan de este, como el bash (Bourne again shell, el oficial de la GNU), y el Korh shell, ksh

El mas utilizado es el C shell y sus variantes, sobre todo el tcsh, (que es precisamente el que usa el ordenador de la escuela de informática). El tcsh tiene mas facilidades para edición de la línea de comandos, completa los nombres de los ficheros, y muchas más cosas. A partir de ahora, por defecto, trataremos con el csh, que es el mas usado

El shell es un entorno de trabajo, con una serie de comandos internos. La mayoría de los comandos que se usan en UNIX son externos, como ls, pero algunos son internos. Tambien tiene una serie de propiedades, que permiten controlar el entorno de trabajo y los programas que se ejecutan desde él.

Suelen incorporar características como:

  • control de procesos
  • redirección de ficheros
  • lenguaje para escribir pequeños programas

Hay muchos:

  • command.com cmd.exe - DOS y derivados
  • ksh - korn shell de UNIX
  • chs - C shell, similar en sitaxis al lenguaje de programación C
  • bsh - Bourne shell
  • tcsh, zsh, ash, ...
  • bash - Bourne Again shell, el shell mayoritario de sistemas Linux

/bin/sh es un enlace a un intérprete de órdenes dado. Para ver donde apunta en nuesto sistema:

$ ls -l /bin/sh

Para ver las distintas "shells" disponibles en nuestro sistema:

$ cat /etc/shells

[editar] Manejo básico del shell

Introduzcamos cuatro comandos básicos para ver esta parte: • echo : repite los argumentos en la salida estándar (ej. pantalla) • ls : lista el contenido de un directorio • cat : muestra el contenido de un fichero • more : muestra el contenido de un fichero haciendo pausas entre pantallas si el fichero es muy largo

[editar] La linea de comandos

Escribimos: $ ls

Pulsamos ENTER. En la linea de comandos podemos usar las siguientes (combinaciones de) teclas: IZQUIERDA Se mueve a la izquierda ) DERECHA Se mueve a la derecha ARRIBA Vamos hacia atrás en el historial de comandos ABAJO Volvemos hacia adelante en el historial de comandos FIN CTRL + e Vamos al final de la linea INICIO CRTL + a Vamos al principio de la linea CRTL + d Fin de fichero CRTL + l Borra la pantalla Mayúsculas + RePag Hace scroll hacia arriba en la pantalla Mayúsculas + AvPag Hace scroll hacia abajo en la pantalla

Supongamos que se necesita ejecutar un comando e inmediatamente después otro. En la forma común lo que haríamos seria ejecutar el primer comando y una vez que este haya finalizado, ejecutaríamos el segundo. Existe una segunda forma de hacerlo y es utilizando el carácter ";" inmediatamente después del primer comando y a continuación poner el segundo comando. Con esto lograríamos que se ejecutara el primer comando y al terminar se ejecutará el segundo.

ls
hola heart texto.form manti.form
date
mié jul 14 15:15:25 ART 2004

Utilizando el carácter ";" haremos

ls;date
hola heart texto.form manti.form
mié jul 14 15:15:25 ART 2004

[editar] Patrones de sustitución

Hay ciertos caracteres que el shell sustituirá por otro contenido en base a unas reglas.

cualquier cadena de texto Ejemplo:

$ echo /usr/*
?
un solo caracter cualquiera
Ejemplo:
$ echo /usr/?bin
$ echo /usr/????
[...]

cualquiera de los caracteres entre corchetes Ejemplo:

$ echo /usr/[aeiou]*

[editar] Redirección de ficheros

Definición clásica: Un fichero informático es una entidad lógica compuesta por una secuencia de bits, almacenada en un sistema de archivos ubicada en la memoria de un ordenador. En UNIX todo es un fichero. Es decir, se pueden aplicar a todos los objetos las acciones que soporta un fichero en su definición clásica: abrir, cerrar, leer, escribir, etc. Ficheros estándar que están abiertos para todo programa en ejecución:

• Entrada estándar /dev/stdin (ej. Teclado) • Salida estándar /dev/stdout (ej. Pantalla) • Salida de error /dev/stderr (ej. Pantalla)

Otros ficheros especiales: • /dev/null -> "la nada de UNIX" • /dev/zero -> fuente infinita de ceros • /dev/random -> datos aleatorios ¿Qué pasa cuando ejecutamos ls?

[editar] Redirección stdout a fichero

$ ls > salida
$ cat salida

[editar] Redirección stderr a fichero

$ ls pirulotropical 2> error
$ cat error

[editar] Redirección stdin a fichero

$ cat < /dev/stdin

[editar] Añadir redirección a fichero

$ echo añadir datos >> salida
$ cat salida
$ ls uh 2>> error
$ cat error

[editar] Redirección "documentos empotrados"

$ cat << FINDOCUMENTO Esto es un documento empotrado. El comando cat va a tomar un fichero desde stdin que acaba cuando encuentra el delimitador... FINDOCUMENTO

[editar] tuberías

Una tubería es un fichero especial con dos extremos de, forma que lo que escribimos en un lado de la tubería va a parar al otro. En inglés: pipe.

$ ls /usr/bin | more

La salida del comando ls /usr/bin va a parar a la entrada del comando more. Las tuberías permiten combinar la funcionalidad de distintos comandos. Para ello la mayor parte de los programas permiten acceder a sus funcionalidades desde la linea de comandos.

[editar] Control de procesos

Un proceso es un programa en ejecución con características propias (memoria, pila, puntero de programa, número identificador único, etc.). En UNIX todo proceso es 'hijo' de otro, es decir, es creado por otro proceso, considerado como el proceso 'padre'. Todos los procesos descienden de un proceso principal llamado 'Init', que al iniciar el sistema tiene el numero de proceso 1. El proceso 'init' es el único que no tiene 'padre'. Existe la posibilidad que un proceso 'padre' termine de manera inesperada y errónea (debido a un fallo de programación, por ejemplo), este proceso 'padre' terminaría, pero podría dejar procesos 'hijo' en ejecución. Cuando un proceso 'hijo' queda descolgado del proceso 'padre', se dice que entra en un estado 'zombie' porque su padre no está esperando cuando acaba.Cuando ejecutamos un comando en el shell se crea un proceso que es hijo de ese shell y el shell espera a que el proceso termine para volver a tomar el control.También es importante destacar que cada nuevo proceso creado hereda ciertas características de su padre, como: las variables de entorno y los ficheros abiertos.

[ shell ] - ejecuta ls -> [ ls : shell espera ] - fin ls -> [ shell ]

Desde el shell podemos, a parte de crear procesos, manipular a los hijos creados por ese shell. Control de procesos del shell:

CRTL + c
finaliza el proceso
comando &
permite ejecutar un comando en segundo plano
Ejemplo:
$ ls &
bin/ doc/ mail/ src/ tmp/
[1] 23704
[1] + Done ls -F
CTRL + z
parar un proceso en primer plano el shell toma el control y 'duerme'
al proceso que estaba en ejecución
Ejemplo:
$ ls /bin/ | more
CTRL + z
[1] + Done ls -F /bin/ |
Stopped more
jobs

muestra información sobre los procesos parados dependientes de este shell Ejemplo:

$ jobs
[1] + Done ls -F /bin/ |
Stopped more

fg continua un proceso parado, en primer plano. Si existen varios procesos parados, podemos ponerle como argumento el índice que el comando jobs nos mostró. bg continua un proceso parado, en segundo plano. Si existen varios procesos parados, podemos ponerle como argumento el índice que el comando jobs nos mostró.