Capítulo I. Introducción y repaso (Sistemas Operativos I)
1. Introducción
En este punto vamos a ver los comandos vistos en 1er curso de Ingeniería Informática de Sistemas que van a ser usados en programación en shell.
1.1. Comandos básicos
mkdir: Creación de un directorio
rmdir: Eliminado de un directorio (solo si está vacio)
cd: Cambiamos de directorio
pwd: Nos indica el directorio actual.
ls: Muestra el contenido del directorio local. Opciones:
- -l: muestra los detalles.
- -a: muestra los archivos ocultos.
- -al: -a y -l simultáneamente
1.2. Comandos para el uso de archivos
cp ruta_origen ruta_destino: comando para copiar ficheros.
mv nombre_inicial nombre_final: comando para renombrar un fichero.
rm nombre_fichero: elimina el fichero.
rm -r directorio: permite eliminar un directorio aunque no esté vacío.
1.3. Tipos de ficheros en unix
En unix tenemos dos tipos de ficheros, los ordinarios (ficheros de datos, texto, …) y los directorios, que son un tipo especial de fichero que puede contener mas directorios y ficheros ordinarios.
2. Operadores de redirección
El operador > redirige la salida del comando que está a su izquierda hacia el fichero que está a su derecha. A la izquierda tendremos un comando y a la derecha un fichero.
Ej: ls > fichero1
Si el fichero no existe lo creará y si existe lo “machaca”.
El operador >> redirige la salida del comando que está a su izquierda al final del fichero que está a su derecha, de tal manera que si el fichero ya existe pues simplemente añade líneas al final del mismo y si no existe, lo creará.
En el operador <, la entrada del operador a la izquierda la toma del fichero de la derecha.
Ej: mail destinatario < fichero_mensaje
Las tuberías (pipes) provocan que la salida del comando a la izquierda sea la entrada del comando a la derecha.
Ej: cat fichero | sort (muestra el fichero y además muestra sus líneas ordenadas)
3. Filtros
3.1. cut
Es un filtro que nos permite cortar un fichero y obtener alguna serie de sus campos, los cuales han de estar diferenciados o delimitados por algún tipo de carácter. Ejemplo: nombre_login:contraseña:PID:GID:
Sintaxis: cut -d(carácter separador de campo) -fx nombre_fichero
X=nº de la columna que queremos cortar
Ejemplo: cut -d: -f1 prueba
cut -d: -f1,2 prueba (obtendríamos el campo 1 y el campo 2)
3.2. head
Muestra las n primeras lineas de un fichero:
head -n fichero
En este caso la entrada es el fichero “fichero” pero también podemos escribir head -n “a secas”, entonces la entrada sería la entrada estándar (teclado), hasta que pulsáramos CTRL + D.
3.3. tail
Muestra las n últimas líneas:
- tail -n fichero: Muestra las n últimas líneas de un fichero.
- tail +n fichero: Muestra de la n en adelante líneas.
3.4. cat
Toma una entrada y la muestra por la salida. Es como un filtro nulo. Si ponemos solo cat, lo que escriba por teclado, saldrá por pantalla.
3.5. uniq
Elimina las líneas que se repiten. Para trabajar con este filtro tenemos que tener todas las líneas que se repiten consecutivamente almacenadas, es decir, que tendremos que utilizar el comando sort que veremos más adelante.
uniq [opciones] entrada salida
Opciones:
- – u: Saca sólo las líneas que no se repiten.
- -d: Saca sólo las líneas que se repiten, pero sólo saca una copia de las mismas.
- -c: Saca en la columna de la izquierda el número de veces que se repite y en la columna de la derecha la línea propiamente dicha.
3.6. tr
Traduce caracteres de un archivo de una forma a otra.
tr [opciones] de_cadena a_cadena fichero
3.7. tee
Permite dividir la salida de un comando para que por un lado quede almacenada en un fichero y por otro vaya a la pantalla. Ejemplo: ls | tee fichero ? Saldría por pantalla y se grabaría en el fichero llamado “fichero”.
3.8. sort
Permite ordenar ficheros de texto.
sort [opciones] archivo
Podemos ordenar por campos lógicos o por columnas. Ahora las columnas las empezamos a numerar desde 0 y no desde 1 como hacíamos en el filtro cut. Opciones:
- -t: donde los dos puntos es el carácter separador de campo.
- -r hace una clasificación descendente.
- -n permite ordenar números
- -b para que no tenga en cuenta los espacios en blanco
- -o permite especificar un fichero de salida en el cual quedarán grabados los datos ordenados. Ej: sort fichero1 –o fichero2 ó sort fichero1 –o fichero1 (quedaría el resultado almacenado en el mismo fichero)
sort –t: +1 practica3 ? ordenaríamos el fichero “practica3” que tendrá como caracteres separadores de campo los “dos puntos” y lo ordenaremos teniendo en cuenta la segunda columna (ya que empezamos a numerar 0, 1, 2, …)
3.9. find
Permite buscar ficheros que cumplan determinadas características. No tenemos en cuenta el contenido del fichero.
- – name nombre ? Nos busca los ficheros que coincidan con un determinado nombre o patrón de búsqueda
- – type d ó f: nos dice si es un fichero normal o un directorio
- – user nombre_login ? Nos busca los ficheros de un determinado propietario
- – exec nos permite ejecutar un comando por cada uno de los ficheros encontrados
3.10. paste
Es lo contrario al cut. Permite producir una salida en forma de columnas desde uno o más ficheros.
paste fichero1 fichero2 ? hace una línea por cada pareja de líneas de los ficheros fuente.
Si no ponemos nada hace una fabulación como carácter separador, pero si ponemos –d: pues pone los “dos puntos” de carácter separador de campo.
3.11. egrep
Sirve para buscar cadenas o patrones dentro de un fichero. El sistema devuelve la línea o líneas que contiene el patrón de búsqueda.
Ej: grep pepe fichero
Expresiones regulares mas usadas:
- ^cadena: la cadena aparece al principio de la línea
- cadena$: la cadena aparece al final de la línea
egrep -v patron fichero: Saca las líneas que no contienen un patrón determinado.
3.12. sed
Comando que sirve para sustituir palabras o patrones dentro de un fichero.
sed “s/cadena_original/cadena_nueva/g”
Para eliminar una cadena:
sed “s/cadena_a_borrar//g”
3.13. wc
wc [opciones] fichero
El comando wc realiza un recuento de un fichero de texto, puede contar líneas, caracteres o palabras, dependiendo de la opción que utilicemos.
Opciones:
- -w ? Cuenta palabras
- – c ? Cuenta caracteres
- – l ? Cuenta líneas
[publicidad_anunciod]
Capítulo II. Programación en shell de UNIX
1. Introducción
La programación en shell de unix surgió como respuesta a las tareas que se realizaban secuencial mente para conseguir hacer algo con el sistema. Como esas tareas se realizaban muchas veces y prácticamente en el mismo orden, pues surgió esto, que lo que hace es ejecutar secuencial mente ordenes en el intérprete de comandos sin tener que escribirlos “a mano”. Es algo parecido a los antiguos ficheros .bat de MS-DOS.
Nosotros usaremos Bourne Shell (sh) puesto que hay muchas modalidades de shell en unix. Para que el sistema siempre interprete que utilizaremos Bourne Shell tendríamos que añadir al principio de nuestro script la línea #!/bin/sh
2. Variables
Las variables en la shell de unix no necesitan ser declaradas previamente para su posterior utilización. Las variables tienen un nombre y para acceder a su contenido tenemos que anteponer el ‘$’ al nombre de la variable. Ejemplos:
- variable1=2
- echo variable1: Sacará por pantalla la cadena variable1
- echo $variable1: Como hace referencia a su contenido, sacará un 2
Hay un tipo de variables que se denominan variables de entorno que son definidas por el sistema al iniciar la sesión y algunas serán diferentes para cada usuario (PATH, LOGNAME, …).
3. Paso de argumentos a un script
El paso de parámetros se realiza escribiéndolos en la línea de comandos detrás del nombre del script. Dentro del mismo podremos acceder a los parámetros con las variables $1, $2, $3, … hasta $9.
Ej: sh script1 hola que tal adiós
Dentro del script:
- $1 = hola
- $2 = que
- $3 = tal
- $4 = adiós
Con el comando shift dentro de un script logramos un desplazamiento de los parámetros, entonces en este caso quedaría así:
- $1 = que
- $2 = tal
- $3 = adiós
Podemos observar que ‘hola’ se habría perdido. El comando shift es el que me permite pasarle más de 9 parámetros a un script, puesto que el $10 nunca lo podremos utilizar.
Las variables $# y $* usadas dentro de un script tienen un significado especial:
- $#: Contiene el número de parámetros pasados al script.
- $*: Contiene todos los parámetros pasados al script.
4. Lectura de una variable desde teclado. Read
Utilizamos read nombre_variable. Tambien podemos leer más de una variable a la vez. Ejemplo:
read var1 var2. Entonces la entrada si es, 1 2, pues tendremos:
$var1 = 1
$var2 = 2
5. Expresiones. Comando expr
expr permite evaluar una expresión:
- +
- –
- *
- /
- %
ejemplo: c=`expr $a + $b`
En c se almacenaría el valor de evaluar la expresión a + b, es decir, su suma.
6. Condiciones
test permite realizar comparaciones lógicas.
– comparaciones numéricas:
- = -eq
- < -lt
- <= -le
- <> -ne
- > -gt
- >= -ge
test $a –ne $b
– cadenas
= (con espacios) es para distinguirlas de la asignación.
test $cad1 = $cad2
!= verdadero si son distintas.
-z verdadero si cadena es nula
-n verdadero si la cadena es no nula
– ficheros.
- -a verdadero si el fichero existe (directorios o ficheros)
- – f verdadero si el fichero existe y es un fichero ordinario.
- – d verdadero si existe y es un directorio.
- – h verdadero si es un enlace simbólico.
- – r verdadero si tiene permisos de lectura
- – x verdadero si tiene permisos de ejecución
- – w verdadero si tiene permisos de escritura
- – s verdadero si el fichero existe y no está vacío
- and: -a
- or: -o
- not: !
7. Ejecución condicional
Lo primero que necesitamos es definir la variable $? que contendrá el código de salida del último comando ejecutado en el sistema. Tomará el valor 0 si el ultimo comando se ha ejecutado con éxito y <> 0 si no ha sido así. Esto nos servirá para comandos como el egrep que si se ha encontrado el patrón con éxito, pues devolverá un código de salida igual a 0.
* Operador grave: Se utiliza para realizar la ejecución de un comando y poder trabajar o bien con su código de salida o con su salida.
7.1. Bucle if
if
…
…
#parte opcional
else
…
…
#fin de la parte opcional
fi
7.2. Bucles for
do
…
…
…
done
7.3. Bucles while
do
…
…
done
7.4. Bucles until
do
…
…
done
7.5. Sentencia case
valor1) …
…
…;;
valor2) …
…
…;;
…
…
#opcional el otherwise
*) …
…
…;
esac
[publicidad_anunciod]
7.6. Break, continue y exit
Break: termina la ejecución del bucle.
Continue: Vuelve a la sentencia inmediatamente anterior al bucle.
Break x: Termina la ejecución de x bucles anidados.
Exit nos permite la terminación del script.
Exit x permite especificar el código de salida del script.
8. Funciones y procedimientos
function nombre()
{
…
…
$1 ? primer parámetro que le hemos pasado
…
…
}
#resto del script.
Una función devolverá un valor, siempre que haga una única “salida por pantalla” que será la almacenada en la variable a la que está asignada la llamada de la función.
Ejemplo:
function cuadrado()
{
cuad=`expr $1 * $2`
echo $cuad
}
read num
a=`cuadrado $num`
echo el cuadrado de $num es $a
Desde dentro de una función accedemos a los argumentos pasados al igual que desde dentro de un script, es decir con $1 $2 $3, …
Podemos escribir todas las funciones en un archivo de texto y luego cargarlas para que el sistema las tenga en memoria.
Para cargarlas en memoria: . nombre_fichero
9. Operadores && y ||
9.1. &&
9.2. ||
Capítulo III. Sistema de arranque y parada del Sistema Operativo en Unix
1. Arranque
Cuando el sistema inicia su funcionamiento crea el proceso INIT que será el padre de todos los procesos. Su PID será el 1. A partir del estado INIT, el sistema ejecutará una serie de procesos. La información sobre los ficheros y procesos que tiene que ejecutar durante el arranque estará en /etc/inittab.
2. Estado INIT: o nivel de ejecución
Es una configuración software del sistema que indica que procesos pueden existir durante y después del arranque del sistema operativo. El número de servicios disponibles en el sistema dependerá del estado en el que se encuentre el mismo. En un instante determinado un sistema solo puede encontrarse en uno de los estados INIT.
Hay dos grupos:
- Monousuario: El sistema sólo es accesible desde la consola y únicamente puede acceder al mismo el súper usuario.
- Multiusuario. El sistema puede ser accedido desde cualquier terminal o desde la red y cualquier usuario puede acceder al mismo.
Estados:
- Estado 0: Significa desconexión o estado de apagado. Equivale a apagar la máquina de forma ordenada.
- Estado 1 o estado de administración. Sólo root puede acceder al sistema. Se puede acceder a todo el sistema de ficheros multiusuario. Es usado para administración y mantenimiento.
- Estado S: Estado monousuario. Sólo root puede acceder pero solo se puede acceder al sistema de ficheros raiz.
- Estado 2: Estado multiusuario sin NFS( network file sistem ). Cualquier usuario puede acceder al sistema pero no a través de la red.
- Estado 3: Estado multiusuario con NFS.
- Estado 5: Modo X11. La consola del sistema arranca con las X (modo gráfico).
- Estado 6: Parada y reinicio del sistema. Se para la máquina y se inicia de nuevo.
Para pasar de un estado a otro escribimos:
init
3. /etc/inittab
Identificador: Secuencia de 2 o más caracteres que identifica la linea. Para líneas que contienen procesos getty contendrá el numero del terminal donde se ejecutará el proceso.
Runlevel: Nivel de ejecución. Especifica el estado INIT en el que deben ejecutarse los procesos indicados.
Action: Especifica como tratar el proceso, es decir, cuando y como se ejecuta el proceso correspondiente. Acciones:
– INIT default: Especifica el nivel de ejecución por defecto.
– respawn: el proceso una vez que finalice va a ser ejecutado de nuevo.
– wait: indica al proceso INIT que espere hasta su terminación antes de continuar con la siguiente entrada.
– once: el proceso se ejecuta una sola vez.
– boot: se ejecuta durante el arranque del sistema operativo, ignorándose el nivel de ejecución.
– sysinit: Durante el arranque del SO pero antes que cualquier otro proceso y además el sistema espera hasta su finalización.
– ctrlaltdel: se ejecuta cuando se pulsa esa combinación.
– powerwait: cuando hay un fallo de corriente.
Process o script: Suelen ser scripts que se encargan de arrancar o de parar una serie de servicios.
/etc/inittab
Capítulo 4. Usuarios y grupos. Procesos
1. Usuarios y grupos
1.1 Usuarios
login:contraseña:uid:gid:inf_user:dir_home:shell
La contraseña encriptada se encuentra en el fichero:
/etc/shadow
login:contraseña:::::::
Para crear un usuario hay que hacer lo siguiente:
– Incluir una linea con sus datos en los fichero anteriormente descritos.
– Crear su directorio home y darle permisos y propiedad.
– Copiar los ficheros de esqueleto (/etc/skel/) en el directorio home del usuario.
usermod: Comando que modifica la información del usuario.
– u uid
– g gid
– h dir_home
finger: comando que proporciona información acerca de los usuarios conectados al sistema.
1.2. Grupos
nombre:contraseña:gid:user1,user2,…
Cada usuario pertenece a un grupo por defecto y en la lista de usuarios del grupo al que pertenece por defecto, no aparecerá dicho usuario.
2. Comandos varios
2.1. Fichero /etc/fstab
dispositivo_a_montar punto_de_montaje tipo_del_distema_de_ficheros opciones_sobre_montaje
2.1. Montaje de sistemas de ficheros
-t especifica el tipo de sistema de ficheros que queremos montar.
VFAT NTFS ISO9660
HPFS NFS SMBFS
Ej: mount –t vfat /dev/fd0 /mnt/floppy
umount fichero_de_dispositivo punto_de_montaje
2.2. Comandos de sistemas de ficheros
-p?permite comprobar el formato del sistema de ficheros que queremos crear.
fsck: Permite comprobar, revisar y reparar un sistema de ficheros.
mknod: Permite crear un fichero de dispositivo.
mkdev: permite crear automáticamente todos los ficheros asociados a una familia de dispositivos. Un fichero de dispositivos apunta a una serie de rutinas que permiten manejarse con ese dispositivo.
df: Nos informa del espacio libre en un sistema de ficheros.
2.3. Enlaces
Duros: ln fichero_existente nuevo_fichero Simbólicos: ln –l fichero_existente nuevo_fichero
2.4. Modos de ejecución
comando&
b) Ejecución continuada:
nohup ? Ejecuta un comando aunque cierre la sesión.
La salida del comando se almacenará en nohup.out
c) Unión de ambos: Se puede conseguir ejecutar un proceso en segundo plano y que además continúe ejecutándose aunque se finalice la sesión en la maquina:
nohup comando&
jobs: Muestra los trabajos interrumpidos o que se están ejecutando en 2º plano.
bg mando un trabajo interrumpido a background.
fg mando un trabajo a primer plano
2.5. Ejecución programada de procesos
2.6. Prioridades de procesos
renice: Altera la prioridad de un proceso que ya está ejecutándose
2.7. Comando ps (información de proceso)
Opciones:
-l ? listado completo de todos los procesos.
UID ? Número identificador del usuario.
PID ? Número identificador del proceso.
PPID ? Identificador del proceso padre.
C ? Índice de utilización reciente del procesador.
STIME ? Tiempo de inicio del proceso.
TTY ? Id del terminal.
TIME ? Tiempo de CPU consumido por el proceso.
COMMAND ? Nombre del comando que ejecuta.
S ? Estado del proceso.
O: ejecución.
S: durmiendo.
Z: zombie.
X: En espera de más memoria.
-a ? Lista de todos los procesos en ejecución.
[publicidad_anuncio1]
3. Copias de seguridad
3.1. tar
c: permite crear un fichero de salida que guarda un grupo de ficheros.
x: opción inversa.
t: listar el contenido de un fichero tar.
r: permite reemplazar un fichero existente por una nueva versión.
u: permite añadir un fichero que no existe al fichero tar.
Opciones:
-v: Va mostrando información.
-z: permite comprimir o descomprimir.
-f: para poder usar un fichero de salida
Ejemplo: tar –cvf fichero.tar dir_backup
El tar es recursivo por defecto. Hay que incluir la extensión .tar en el fichero destino.
3.2. Zip / unzip
Le añade la extension .zip automáticamente.
Ej: zip –r fichero_destino directorio
unzip fichero.zip ? descomprimir.
4. Funciones del shell
Alias: Determinar o sustituir alias. alias dir=’ls –l’ (derecha del 0) unalias dir (lo deshace)
Redirección comando > fichero (antes de la ejecución del comando, el shell mira permisos, existencia del fichero, …) Sustitución de variables y sustitución de comandos. Expansión de ficheros (comodines, *?) Ejecución del comando.