Vous êtes sur la page 1sur 13

Sistemas Operativos y Programacin

Grado en Ingeniera Elctrica

Sistemas Operativos y
Programacin
Unidad Temtica 1 - Sistemas Operativos

Boletn Prctica 2
Uso de Shell Scripts
Redirecciones y Tuberas

Departamento de Sistemas Informticos y Computacin


Universitat Politcnica de Valncia
Curso 2014/15

Sistemas Operativos y Programacin

Grado en Ingeniera Elctrica

Sistemas Operativos y Programacin

Grado en Ingeniera Elctrica

1. USO DE SHELL SCRIPTS


1.1. INTRODUCCION
El shell o intrprete de rdenes de los sistemas tipo UNIX (y en los sistemas LINUX),
es un programa ejecutable (como cualquier otro programa de usuario) que se encuentra
disponible en cualquier entorno UNIX y cuyo cometido es leer rdenes para el sistema
operativo, analizarlas y realizar las llamadas al sistema que sean necesarias para
ejecutarlas.
Este intrprete define, al igual que ocurre con cualquier otro intrprete o traductor, un
lenguaje de programacin que posee caractersticas como:

Procedimientos, ms conocidos como shell scripts

Palabras y caracteres reservados (tambin conocidos como metacaracteres)

Variables

Estructuras para el control del flujo tipo if, while, etc.

Manejo de interrupciones

Realmente en un sistema UNIX existen varios intrpretes de rdenes, pudiendo elegir


cada usuario el que prefiera. El intrprete de rdenes ms bsico es el Bourne shell o sh,
que est disponible en cualquier sistema. Otros intrpretes de rdenes usuales son el
Korn shell o ksh, el shell con sintaxis del tipo de lenguaje C o csh y el Bourne-Again
SHell o bash que es totalmente compatible con el sh al tiempo que incorpora
caractersticas del ksh y csh.
Esta prctica introducir las caractersticas y la sintaxis del sh, las cuales resultan
tambin aplicables al ksh y al bash.
1.2. SHELL SCRIPTS
Las rdenes que el shell debe ejecutar pueden ser proporcionadas a travs del teclado o
como un programa contenido en un fichero. Se denomina shell script a un fichero que
contiene rdenes para ser ejecutadas por el shell. Por ejemplo, se puede crear un fichero
denominado contenido con el siguiente contenido:
#!/bin/bash
# contenido
echo El contenido del directorio actual es:
ls
Las lneas que comienzan por el carcter # son comentarios. El resto son sentencias que
ejecutar el shell. En particular, la orden echo sirve para mostrar el mensaje que se le
indica a continuacin. La orden ls sirve para obtener un listado de ficheros, que por
defecto sern los ficheros del directorio actual.
1.2.1. Cmo ejecutar un shell script
La ejecucin de un fichero puede realizarse de varias formas distintas, veamos aqu las
ms habituales y cmo se aplicaran para nuestro ejemplo del fichero contenido.
Creando un shell y pasndole el fichero como argumento:
$ sh contenido
3

Sistemas Operativos y Programacin

Grado en Ingeniera Elctrica

Dando permiso de ejecucin al fichero y ejecutndolo como si fuese otra orden:


$ chmod +x contenido
$ ./contenido
En este ltimo caso, el shell detecta que se trata de un shell script y al igual que en el
caso anterior crea otro shell para que lo ejecute. La primera lnea (#!/bin/bash) indica el
tipo de shell que debe crearse para ejecutar la orden.
Observe que el nombre del fichero shell script que se ha utilizado en la orden anterior es
./contenido y no simplemente contenido. Es decir, se le ha indicado al shell que el
fichero a ejecutar se encuentra en el directorio actual de trabajo (directorio .). Para no
tener que indicar cada vez dnde se encuentra el fichero a ejecutar (indicando la ruta
completa), el shell utiliza la variable de entorno denominada PATH. Esta variable
contiene la lista de nombres de directorios (separados por el carcter :) donde el shell
buscar los ficheros ejecutables.
Podemos consultar el valor de esta variable ejecutando la orden:
$ echo $PATH
Compruebe, en su caso, si el valor de la variable de entorno PATH que est utilizando
el shell contiene el directorio actual de trabajo, es decir, el directorio . (representado
con un punto).
Para incluir el directorio actual de trabajo en el PATH debemos ejecutar la orden:
$ PATH=$PATH:.
Este cambio slo durar hasta que finalice la ejecucin del shell (o sea, se cierre la
terminal). Si se desea que el cambio sea permanente, se debe editar el fichero de
configuracin $HOME/.bashrc y aadir al final la orden anterior. Para que el cambio
surja efecto, se deber cerrar el shell y abrirlo de nuevo.
IMPORTANTE: Como ya se coment en la prctica anterior, en estas prcticas se est
utilizando el programa Cygwin, que permite simular un intrprete de rdenes Unix
dentro de un sistema operativo Windows.
Debido a que los sistemas Windows y Unix representan de forma diferente algunos
caracteres especiales (como el retorno de carro, las tabulaciones, etc.), si hacemos uso
de editores de texto de Windows (como Notepad o el Bloc de Notas), en ocasiones
podremos tener problemas al ejecutar shell scripts.
Para evitar este tipo de problemas, es conveniente traducir todos los ficheros que
generemos con editores de Windows a ficheros entendibles por sistemas Unix. Para
ello, emplearemos la orden dos2unix (explicada en la Prctica 1). Ejemplo:
$ dos2unix contenido

Sistemas Operativos y Programacin

Grado en Ingeniera Elctrica

EJERCICIO: Cree el fichero contenido (descrito anteriormente) usando un editor de


textos. Ejectelo a continuacin con los dos mtodos indicados de ejecucin de un shell
script. Anote a continuacin las rdenes empleadas y los resultados obtenidos:
1

1.2.2. Argumentos en shell scripts


Un shell script puede invocarse con argumentos, los cuales pueden ser referenciados
como $0, $1, $2, $3, etc.
La variable $0 referencia al propio nombre del programa.
La variable $1 referencia al primer argumento pasado; la variable $2 al segundo

argumento, etc.
La variable $@ referencia a todos los argumentos (en conjunto), excluyendo el

nombre del programa.


La variable $# indica el nmero de argumentos.

Esto se ilustra con el siguiente programa, llamado argumentos:


#!/bin/bash
# Programa argumentos.
echo Orden tecleada: $0 "$@"
echo Nmero de argumentos: $#
echo Nombre de la orden: $0
echo Argumento 1: $1
echo Argumento 2: $2
echo Argumento 3: $3
echo Argumento 4: $4
echo Argumento 5: $5
echo Argumento 6: $6
que, despus de darle permisos de ejecucin, puede invocarse como:
$ argumentos pera uva limon
EJERCICIO: Implemente el programa argumentos usando un editor de texto y
ejectelo tal y como se muestra en la lnea anterior. Anote el resultado obtenido:
2

Sistemas Operativos y Programacin

Grado en Ingeniera Elctrica

EJERCICIO: Ejecute de nuevo el programa argumentos, esta vez invocndolo con


distintos listados de frutas. Pruebe desde pocas frutas (por ejemplo, solamente una o
dos) a ms de 6 frutas. Anote a continuacin las rdenes realizadas y los resultados
obtenidos. Indique tambin los comentarios que considere oportunos sobre el programa
argumentos que se ha implementado.
3

2. REDIRECCIONES Y TUBERAS
2.1. REDIRECCIONES
Cuando desde el shell ejecutamos un programa, ste dispone de tres canales de
comunicacin que permiten que el programa lea o escriba datos a travs de ellos. Estos
canales son:
-

Salida estndar: canal por el cual el programa escribir su salida. Por defecto,
lo que se escribe en este canal se vuelca sobre la ventana del shell, de manera
que cuando ejecutamos una orden como ls, su salida aparece en la misma
ventana.

Salida de error o de diagnstico: canal que el programa utilizar para escribir


mensajes de error. Por defecto, este canal tambin se vuelca sobre la ventana del
shell.

Entrada estndar: canal por el cual el programa puede leer datos de entrada.
Por defecto, este canal recoge lo que se teclee sobre la ventana del shell,
permitiendo que el programa lo pueda leer.
Entrada estndar
$ programa

programa

Salida estndar

Ventana shell

Salida de error

Cada uno de los tres canales puede ser redirigido para que acte sobre un fichero en vez
de hacerlo sobre la ventana de shell. A continuacin veremos cmo podemos hacerlo.

Sistemas Operativos y Programacin

Grado en Ingeniera Elctrica

2.1.1. Redireccin de la salida estndar


Para redirigir la salida estndar de un programa, la sintaxis es:
$ programa > fichero
Con ello haremos que la salida estndar del programa no se vuelque sobre la ventana,
sino que se guarde en el fichero que le indicamos, tal como vemos en la figura.
Entrada estndar
$ programa >fichero

programa

Salida
estndar

Ventana shell

Salida de error

fichero

Para comprobar el uso de este mecanismo, empezaremos ejecutando la orden:


$ ls -l
El argumento -l de la orden ls indica que queremos un listado detallado de los
ficheros.
Ahora ejecutaremos la orden redirigiendo su salida :
$ ls -l > dir.dat
La salida de la orden no se ha mostrado en la ventana, sino que se ha almacenado en el
fichero dir.dat. Para comprobarlo, podemos mostrar el contenido del fichero con la
orden cat:
$ cat dir.dat
...
Si el fichero usado para la redireccin no exista antes de la orden, se crea, y si ya
exista, se reemplazar su contenido. Esto se puede comprobar con las siguientes
rdenes :
$ ls -l > salida.dat
$ cat salida.dat
$ ps > salida.dat
$ cat salida.dat
...
Segn esto, podemos usar este mtodo para crear un fichero vaco. As:
$ > vacio

Sistemas Operativos y Programacin

Grado en Ingeniera Elctrica

Si queremos que la salida de un programa se aada al contenido actual de un fichero,


usaremos el smbolo >>. Por ejemplo:
$ ls -l > salida.dat
$ cat salida.dat
$ echo Ultima linea >> salida.dat
EJERCICIO: Ejecute todas las rdenes anteriores. En qu ha cambiado el contenido
del fichero salida.dat tras ejecutar la ltima orden echo?
4

Si queremos que la salida de un programa se pierda, es decir, no aparezca ni en la


pantalla ni se almacene en ningn fichero, podemos usar el dispositivo /dev/null, as:
$ ls -l > /dev/null

2.1.2. Redireccin de la salida de error


De la misma manera que podemos redirigir la salida estndar, es posible almacenar la
salida de error en un fichero, usando 2>.
$ programa 2> fichero
Entrada estndar
$ programa 2>fichero

programa

Salida
de error

Ventana shell

Salida estndar

fichero

Por ejemplo, consideremos la orden:


$ cat noexisto.dat salida.dat
Esta orden debe mostrar el contenido de los ficheros noexisto.dat y
salida.dat. Dado que el primer fichero no existe, en su lugar aparecer un mensaje
de error. Ejecute la orden y observe el resultado. En particular, observe que aparece el
mensaje de error.
Compruebe ahora lo que ocurre al ejecutar:
$ cat noexisto.dat salida.dat 2> err.dat

Sistemas Operativos y Programacin

Grado en Ingeniera Elctrica

EJERCICIO: Ejecute las dos rdenes anteriores. Qu se muestra por pantalla? Qu


diferencias se observan entre los resultados de las dos rdenes? Qu contiene el fichero
err.dat?
5

EJERCICIO: Vuelva ahora a ejecutar la ltima orden anterior, pero redirija esta vez la
salida estndar en vez de la de error (por ejemplo, al fichero sal.dat). Qu se
muestra por pantalla?. Indique la orden introducida y su resultado:
6

Se puede redirigir simultneamente las dos salidas (la estndar y la de error) de un


programa, de la forma:
$ programa > fichero1 2> fichero2
Entrada estndar
$ programa >fichero1 2>fichero2

programa

Salida
estndar

Ventana shell

Salida
de error

fichero1

fichero2

EJERCICIO: Vuelva a ejecutar la orden anterior redirigiendo tanto la salida estndar


como la de error (cada una a un fichero diferente). Qu se muestra por pantalla?
Compruebe que efectivamente se han redirigido las salidas, mostrando el contenido de
los ficheros que se hayan creado con dicha orden.
7

Sistemas Operativos y Programacin

Grado en Ingeniera Elctrica

En UNIX (y en LINUX), la salida estndar y la de error estn numeradas como 1 y 2


respectivamente. Por esa razn, para redirigir la salida de error se utiliza 2>. Si no se
especifica ningn nmero delante de > se toma 1 por omisin. As pues, las siguientes
rdenes son equivalentes
$ cat noexisto.dat salida.dat > sal.dat 2> err.dat
$ cat noexisto.dat salida.dat 1> sal.dat 2> err.dat

Si se quiere lanzar la salida de error hacia el mismo fichero que se lanza la salida
estndar, se usa la nomenclatura 2>&1. Tambin se puede usar 1>&2 para aadir la
salida estndar a la salida de error. Por ejemplo, si en el ejemplo anterior queremos que
tanto la salida estndar como la salida de error se lancen hacia el mismo el fichero
podremos utilizar:
$ cat noexisto.dat dir.dat 1> sal.dat 2>&1
2.1.3. Redireccin de la entrada estndar
Al igual que se puede redirigir la salida estndar, se puede hacer lo propio con la
entrada estndar.
Para ello usaremos el smbolo <
$ programa < fichero

fichero

Entrada estndar
$ programa <fichero

programa

Salida estndar

Ventana shell

Salida de error

Por ejemplo:
$ tail -3 < salida.dat
La orden tail (explicada en la Prctica 1) filtra su entrada, dejando pasar nicamente las
ltimas lneas (en este ejemplo las tres ltimas lneas).
EJERCICIO: Utilizando la orden head (explicada en la Prctica 1) y la redireccin de
entrada, muestre las primeras 5 lneas de: (a) un fichero que exista; (b) un fichero que
no exista. Qu mensajes se muestran por pantalla en ambos casos?
8

10

Sistemas Operativos y Programacin

Grado en Ingeniera Elctrica

2.1.4. Tuberas
En UNIX y en Linux se permite usar la salida estndar de un proceso como la entrada
estndar de otro, tal y como si colocramos una tubera que los uniera. A una secuencia
de rdenes enlazadas de este modo se le llama tubera (pipeline). Para conectar dos
procesos con una tubera, usaremos el smbolo | de la siguiente forma:
$ programa1 | programa2
La idea se muestra en el siguiente esquema (por claridad se han omitido los canales que
no se ven afectados por la tubera).

A modo de ejemplo, ejecute las siguientes rdenes:


$ ls l
$ ls l | tail -3
En la segunda orden, la salida estndar de ls se usa como entrada estndar de tail, que
como hemos mencionado es un filtro que deja pasar las ltima lneas. Es intuitivo
pensar que las tuberas nos permiten construir procesos que operen en un flujo de
datos. Con el estudio de los filtros de Unix (y de Linux) esta posibilidad se convierte
en un recurso muy apreciado, pues se pueden conectar varios procesos en una misma
orden. En la prctica 4 trabajaremos el uso de los filtros.
EJERCICIO: Ejecute las siguientes rdenes:
$ ls l
$ ls l | grep rwx
$ ls l | grep rwx

| wc

Qu resultados obtiene? Indique las diferencias ms relevantes entre los resultados


proporcionados por cada orden. Explique tambin, segn los resultados obtenidos, qu
piensa que realizan las rdenes grep y wc.
9

EJERCICIO: Escriba un shell script de nombre ultimasLineas que reciba dos


parmetros: el nmero de lneas (N) a mostrar y el fichero del cual mostrarlas. El
resultado sera mostrar las N ltimas lneas del fichero, como se indica en este ejemplo:
11

Sistemas Operativos y Programacin

$ ultimasLineas 2 salida.dat
Las 2 ultimas lineas del fichero
son:
Penultima linea
Ultima linea

Grado en Ingeniera Elctrica

salida.dat

NOTA: En el ejemplo se ha mostrado la ejecucin del fichero, NO EL CONTENIDO


del mismo. Adems, este ejemplo asume que en las 2 ltimas lneas del fichero
salida.dat tenemos el siguiente texto:
Penultima Linea
Ultima Linea
A continuacin debe indicar cul debe ser el contenido del fichero ultimasLineas, para
que al ejecutarlo tal y como se ve en el ejemplo, nos muestre el resultado indicado.
10

EJERCICIO: Ejecute el shell script ultimasLineas que ha implementado, esta vez


pasndole otro fichero y un nmero distinto de lneas. Muestre los resultados obtenidos:
11

EJERCICIO: a)Cmo habra que lanzar el shell script anterior para que el resultado
no saliera por pantalla, sino que se almacenara en un fichero? b)y para que si se
produjese un error, no se viera ni se almacenase en ningn sitio?
12

a)

b)

12

Sistemas Operativos y Programacin

Grado en Ingeniera Elctrica

TABLAS RESUMEN USO


TUBERAS.
Orden

DE SHELL SCRIPTS.

REDIRECCIONES

Descripcin

Ejemplos
($ es el prompt del sistema)

sh

Ejecucin de un fichero shell script, que


contiene un listado de rdenes.

chmod +x

Proporcionar permisos de ejecucin al


fichero. Permite as ejecutar un shell script
como si fuera otra orden.

Argumentos de
un shell script

$ sh contenido
$ chmod +x contenido
$ ./contenido

Ejemplo:

Descripcin

$ argumentos a b c

$0

Propio nombre del shell script.

$1

Primer argumento suministrado al shell script.

$2

Segundo argumento suministrado al shell script.

$@

Todos los argumentos (en conjunto)

$#

Nmero de argumentos

Redirecciones y
Tuberas
>

Descripcin
Redireccin de la salida estndar.

>>

Redireccin acumulada de la salida


estndar. La salida se aade al
contenido actual del fichero.

2>

Redireccin de la salida de error.

<

Redireccin de la entrada estndar.

Tubera. La salida estndar de una


orden se utiliza como entrada
estndar de otra orden.

$0 argumentos
$1 a
$2 b
$@ a b c
$# 3

Ejemplos
$ ls l > dir.txt
$ echo Mas info >> dir.txt
$ cat noexisto 2> error.txt
$ tail -3 < salida.dat
$ ls l

tail -3

13

Vous aimerez peut-être aussi