N
N
N
Sistemas Operativos
Práctica No 4
SHELL BÁSICA
Introducción
La shell es un potente intérprete de órdenes que dispone de un amplio conjunto de herramientas para
caracterizar su comportamiento y el entorno en que esas órdenes se ejecutan; pero también puede ser
considerada como un lenguaje de programación de características avanzadas, que dispone de todas las
estructuras de control existentes en lenguajes modernos como C, Pascal, ...
Histórico de Ordenes
La shell mantiene cada orden que el usuario teclea, sea o no correcta, en una lista en memoria con el fin
de facilitar el trabajo del usuario. Esta lista se almacena en un fichero, conocido como fichero de historia
(history file), para tener la posibilidad de repetirlas de nuevo o modificarlas. Para visualizar un listado histórico
de órdenes utilizaremos la orden:
$ history
Básicamente, la diferencia entre ambas es que la variable local tiene valor únicamente dentro de nuestra
shell, es decir de nuestra sesión. Por el contrario, las variables globales se establecen para todas las shells, las
variables globales se heredarán desde esta shell a las que se creen a partir de ella (sub-shell o proceso hijo
“child” ).
Locales: Pueden ser accedidas solo por la Shell en que se crean, son locales a esa shell y son definidas
por el usuario. Son variables temporales a la Shell.
Ejemplo: $ DIA=Viernes
No deben teclearse espacios en blanco en torno al operador de asignación (=).
Globales (Exportadas): Aquellas variables creadas y exportadas por el usuario pueden ser accedidas
por la Shell en que se crean y cualquier proceso hijo que sea iniciado por esa Shell. Existen variables
globales definidas para definir el entorno de la shell para cada usuario que inicie sesión y su valor solo
es de lectura para el usuario.
Si queremos hacer que una Variable creada por nosotros sea global, debemos ejecutar el
comando export. Por ejemplo si tenemos la variable $nombre, podemos ejecutar “export nombre”. Podemos
verificar que se haya integrado correctamente ejecutando “env | grep nombre”.
1
MSc. Rina Arauz
UNAN-Leon
Sistemas Operativos
Para visualizar una lista de todas las variables ejecute:
$ set | more
Instala xterm:
sudo apt-get install xterm
Imprime el pid
de la shell
Imprime el
valor de “dia”
Operador de sustitución $
Anteponiendo el operador de sustitución ($) inmediatamente delante del nombre de la variable, ésta será
sustituida por su valor. Para imprimir el valor de una variable debe escribirse: echo $variable
Ejemplo:
unset: Mediante esta orden, tanto las variables de entorno como las shell pueden ser eliminadas.
Sintaxis: unset nombre_variable
1) Ejercicios:
- Visualice el historial.
- Mediante la ayuda del “man” encuentre la forma de ejecutar algunos comandos
usando el historial desde la línea de órdenes en Shell.
- Crear las siguientes variables locales: NUM=12, MES=enero, CADENA=hola
- Visualice el valor de las variables NUM, MES y CADENA.
- Elimine la variable CADENA y verifique que se borró.
- Exporte la variable Mes.
- Verifique que se exportó la variable MES.
- Lanzar una Subshell e imprima el valor de NUM y MES. Qué ocurre? Explique.
2
MSc. Rina Arauz
UNAN-Leon
Sistemas Operativos
- Lanzar un Terminal (barra de estado, aplicaciones, accesorios, terminal) e imprima
las variables NUM y MES. Qué ocurre? Explique.
- Visualice y anote el valor de las siguientes variables de entorno: PWD, HOME,
USER, SHELL.
alias
Los alias se suelen utilizar para redefinir órdenes y como método abreviado para ejecutar ordenes tediosas de
teclear.
Sintaxis
alias [nombre_alias]=[comando]
alias sin argumentos visualiza el conjunto de alias definidos actualmente en la shell que atiende al usuario. No
se deben dejar espacios en blanco a los lados del operador =.
Ejemplo:
Unalias:
Elimina los alias especificados por nombre_alias de la lista de alias.
Sintaxis
unalias nombre_alias
2) Ejercicios:
- Existe algún alias definido en su sistema?
- Cree tres alias para algunos comandos que usted elija y verifique que se crearon y
funcionan correctamente.
- Borre cada uno de los alias antes definidos.
Orden sleep
Suspende la ejecución durante los segundos especificados como parámetro. Se usa para ejecutar una orden
después de un cierto tiempo.
Sintaxis: sleep segundos
Ejemplo:
$ sleep 20; echo Han pasado 20 segundos
Han pasado 20 segundos
3
MSc. Rina Arauz
UNAN-Leon
Sistemas Operativos
Ejecución de programas en segundo plano o modo sumergido(&)
Cuando se ejecuta un programa, éste no le devuelve el control al usuario hasta que no termina su ejecución. Esta
forma de trabajo imposibilita que un usuario pueda ejecutar varios programas simultáneamente. Una forma de
ejecutar programas y recobrar el control del terminal inmediatamente, es la ejecución en segundo plano o modo
sumergido.
Sintaxis:
$ nombre_programa&
Ejemplo:
$sleep 60&
[1] 590
$ ps
PID TTY TIME CMD
526 pts/0 00:00:00 bash
590 pts/0 00:00:00 sleep
591 pts/0 00:00:00 ps
Como se observa en los ejemplos anteriores, al ejecutar una orden en modo sumergido, el shell muestra
un número entre corchetes conocido como identificador de trabajo y el PID del proceso de más alta jerarquía de
los que se ponen en marcha de manera asíncrona.
3) Ejercicios:
- Ejecute en una única línea la orden que imprima el pid de la Shell que lo atiende,
que duerma a la shell 5 segundos y que al final imprima el mensaje “Fin”.
- Ejecute ps –ef y averigüe el PPID de la Shell que lo atiende.
- Usando el man ps investigue que opciones debe usarse para imprimir el árbol de
procesos de todo el sistema.
- Que hace la orden ps --forest?
- Usando el man ps investigue que opciones debe usarse para imprimir los procesos
que pertenecen a un usuario en específico.
4
MSc. Rina Arauz
UNAN-Leon
Sistemas Operativos
- Haga dormir el terminal 50 segundos en modo sumergido y averigüe el PID de este
proceso.
\Programas shell (shell scripts)
Un shell script o programa shell es un fichero que contiene un conjunto de órdenes que pueden ser
interpretadas y ejecutadas por la shell. Para que la shell pueda ejecutarlo hay que activar los permisos de
ejecución adecuados. La edición de estos programas shell puede realizarse con cualquier editor de textos ASCII
como nano o vi.
Cualquier línea que comience por el carácter # es considerada por la shell como un comentario. Es
recomendable incluir comentarios en los programas shell para mejorar su legibilidad. Para escribir un programa
Shell debe:
Ejemplo:
Realice un Script que despliegue en pantalla:
- Mensaje “Este es un Script”
- Hora y fecha del sistema
- Un listado de los ficheros que representan los discos del sistema.
- Usuarios conectados al sistema
- Cree una variable e imprima su valora
- Un mensaje “Fin del Script”
$nano shell.sh
5
MSc. Rina Arauz
UNAN-Leon
Sistemas Operativos
Parámetros posicionales
Los programas shell pueden recibir argumentos por la línea de órdenes. Estos parámetros posicionales
están asociados a los nombres de las variables siguientes:
$0: identifica al parámetro 0 o nombre del programa.
$1: identifica al primer argumento pasado al programa por la línea de órdenes
$9: identifica al noveno argumento de la línea de órdenes.
Aunque una línea de órdenes puede tener más de nueve parámetros, un programa shell sólo puede acceder
directamente a los primeros nueve parámetros mediante $1...$9.
.
Las siguientes variables, se encuentran relacionadas con los parámetros posicionales:
$#: contiene el número de parámetros posicionales sin incluir el cero.
$*: cadena de argumentos recibidos por el script sin incluir el cero.
Ejemplo:
$ nano shell2
echo Este script se ejecuta tecleando $0 y una secuencia de parámetros.
echo En este caso se han suministrado $# parámetros
echo La cadena de parametros es: $*
echo 1er parametro: $1
echo 2º parametro: $2
Ejemplos:
Realice un Script que recibe como argumento el nombre de un directorio nuevo. Dicho script deberá realizar lo
siguiente:
- Crear el directorio que se proporciona en el primer argumento dentro del directorio de trabajo.
- Que copie el archivo passwd a este directorio.
- Que despliegue las ultimas 5 líneas del archivo que se copió.
- Contenido de la variable de PATH.
6
MSc. Rina Arauz
UNAN-Leon
Sistemas Operativos
$nano shell3
Ejemplo de if y test:
$nano shell4.sh
7
MSc. Rina Arauz
UNAN-Leon
Sistemas Operativos
Ejemplo del for:
$nano shell5.sh
Ejemplo de Expr:
$nano shell7.sh
8
MSc. Rina Arauz
UNAN-Leon
Sistemas Operativos
4) Ejercicio:
- Escriba cada uno de los Shell script de ejemplo y ejecútelos (haga uso de las
opciones de depuración).
- Realice un script que cree 10 usuarios (user1, user2, user3….user10), que a cada
usuario le copie un archivo (contenido del archivo será “Hola buen día”) y que
cree a cada usuario un directorio “DIR”.
- Escriba un Shell que reciba palabras por parte del usuario hasta que este teclee
"salir", luego debe aparecer en pantalla el número de palabras que se han
introducido y una despedida.
Redirección de salida
Se puede redireccionar la salida de cualquier orden a un determinado archivo en vez de hacerlo por la salida
estándar (pantalla). Para esto se utiliza el carácter mayor que, >. Si el archivo al que redireccionamos no existe,
se creara automáticamente; si por el contrario ya existe entonces se sobrescribirá la información. Si queremos
añadir información al archivo sin destruir su contenido entonces debemos utilizar doble símbolo, >>.
Ejemplo:
$ date > prueba
Los resultados de date se escribirán en el archivo prueba.
Redirección de entrada
Cualquier orden que lea de la entrada estándar (teclado) puede redireccionarse para que tome dicha entrada de
un archivo. Esto se hace utilizando el carácter menor que, <.
Ejemplo:
$ line < texto.txt
5) Ejercicio:
- Ejecuta dos comandos (diferentes al del ejemplo) que realicen una redirección de
salida.
- Ejecuta dos comandos (diferentes al del ejemplo) que realicen una redirección de
entrada.
Tuberías o pipelines
Las tuberías o pipelines son una herramienta de comunicación entre procesos que permiten conectar la
salida estándar de un proceso con la entrada estándar de otro. Así todo lo que el proceso (productor) envíe a su
salida estándar será tomado por el otro proceso (consumidor) como entrada en el mismo orden en que se generó
la información.
La forma de indicar que se quiere emplear una tubería para comunicar dos o más procesos es la
siguiente:
$ productor | consumidor
$ orden_1 | orden_2 |orden_3 | ...
Ejemplo:
$ ls -l | wc -l
9
MSc. Rina Arauz
UNAN-Leon
Sistemas Operativos
Señales
Una señal es un interrupción software que le avisa al proceso de que se ha producido algún evento. Un
proceso puede recibir señales durante su tiempo de ejecución. Algunas señales pueden ser interpretadas como
órdenes que recibe el proceso. La orden para enviarle una señal a un proceso es kill:
kill
Sintaxis: kill [-número_señal] PID
Si no se especifica ningún número de señal, kill envía la número 15.
Algunos números de señal importantes son:
2 Interrupción. Se genera al pulsar Ctrl+c
9 Terminación abrupta del proceso
15 Terminación controlada del proceso
6) Ejercicio:
- Ejecuta dos comandos (diferentes al del ejemplo) para tuberías.
- Ejecute xterm& y sleep 50&, mediante ps averigüe su pid y envíe la señal de
terminar a ambos procesos.
Filtros. algunos filtros básicos
Cualquier proceso que lea de su entrada estándar y escriba en su salida estándar se denomina filtro. Un ejemplo
de lo anterior es cat; sin argumentos, esta orden toma la información del teclado y cuando finaliza su entrada,
escribe su salida en pantalla. En Linux la marca de fin de archivo se representa con el carácter Ctrl+d (^d).
En general, los filtros permiten realizan tareas más sofisticadas sobre la entrada estándar como ordenación de la
entrada; selección , búsqueda y sustitución de patrones, etc. A continuación se estudian algunos de los filtros
más básicos como son wc, sort, cut, y grep.
Orden wc
10
MSc. Rina Arauz
UNAN-Leon
Sistemas Operativos
7) Ejercicio:
- Utiliza el nano para crear un archivo con 10 nombres de personas (uno
por cada línea), utiliza sort para ordenarlos y envía dicha salida a un
archivo ordenado.txt (utiliza el operador de redirección).
- Modifica el archivo anterior anteponiendo un número al nombre (sin
orden consecutivo), utiliza sort para ordenarlos y agrega la salida a
ordenado.txt.
- Utiliza la orden wc para contar las caracteres, palabras y líneas, del
archivo ordenado.txt.
Orden cut
cut extrae uno o varios campos para cada línea de un archivo. Los campos a extraer se especifican en lista y
pueden ser de longitud variable o fija. En el primer caso es necesario especificar un carácter delimitador de
campo. Si no se especifican archivo1 ... se utiliza la entrada estándar.
Ejemplo:
$ who | cut -c 1-4
chan
trac
root
$ cat agenda
Dick Tracy:tracy@pareatis.lightwind.es
Sharleen Spiteri:sharleen@texas.com
archie:archie@quiche.cs.mcgill.ca
11
MSc. Rina Arauz
UNAN-Leon
Sistemas Operativos
Orden grep
grep busca los patrones de texto especificados por patron1, patron2, ... en los archivos archivo1, ...
Normalmente cada línea emparejada se envía a la salida estándar, precedida por el nombre del archivo
en que se encontró, si se especificaron varios. Si no se especifica ningún archivo busca los patrones en la
entrada estándar.
Sintaxis: grep [-iln] patron1 archivo
Ejemplo:
$ cat agenda
Dick Tracy:tracy@pareatis.lightwind.es
Sharleen Spiteri:sharleen@texas.com
8) Ejercicio:
- Crear un script que extraiga todos los usuarios del sistema (/etc/passwd) y los
guarde en un archivo.
12
MSc. Rina Arauz