14
ADMINISTRACIÓN DE SISTEMAS OPERATIVOS. UT07: SHELLSCRIPTS CURSO: 2º ASIR 1 7.0.- Recordatorio A.- ¿Qué shell estamos utilizando? Si queremos saber que versión de shell tenemos instalado podemos usar el comando: #echo $SHELL Este comando nos indica que shell estamos usando y en que directorio está instalado. Si queremos conocer la versión de Bash podemos usar el comando: #echo $BASH_VERSION También podemos saber donde está instalado Bash con el comando whereis: $whereis bash Deberíamos obtener,entre otras cosas, /bin/bash Nota: el comando locate lista los archivos que contienen el texto que se pasa como argumento. Por ejemplo, para encontrar archivos que sus nombres contienen la palabra “mkdir”: #locate mkdir Nota: hay que ejecutar updatedb para actualizar las base de datos de búsqueda en la que se basa locate. Otro comando para localizar ficheros es which: $which bash Para conocer todos los shell que disponemos en nuestro equipo: cat /etc/shells Nota: se puede cambiar el shell con el comando chsh Algunas de las características de el Bourne Again Shell son: - Autocompletado de nombres de variables, usuarios, nombres de servidores, comandos y archivos. - Corrección de rutas de archivos en el comando cd. - Soporte a arrays de tamaño ilimitado.

ADMINISTRACIÓN DE SISTEMAS OPERATIVOS. … · una salida estándar (por defecto la consola) y una salida de errores estándar ... ADMINISTRACIÓN DE SISTEMAS OPERATIVOS. UT07: SHELLSCRIPTS

  • Upload
    lykhue

  • View
    217

  • Download
    0

Embed Size (px)

Citation preview

Page 1: ADMINISTRACIÓN DE SISTEMAS OPERATIVOS. … · una salida estándar (por defecto la consola) y una salida de errores estándar ... ADMINISTRACIÓN DE SISTEMAS OPERATIVOS. UT07: SHELLSCRIPTS

ADMINISTRACIÓN DE SISTEMAS OPERATIVOS.

UT07: SHELLSCRIPTS

CURSO:

2º ASIR

1

7.0.- Recordatorio A.- ¿Qué shell estamos utilizando? Si queremos saber que versión de shell tenemos instalado podemos usar el comando: #echo $SHELL Este comando nos indica que shell estamos usando y en que directorio está instalado. Si queremos conocer la versión de Bash podemos usar el comando: #echo $BASH_VERSION

También podemos saber donde está instalado Bash con el comando whereis: $whereis bash Deberíamos obtener,entre otras cosas, /bin/bash Nota: el comando locate lista los archivos que contienen el texto que se pasa como argumento. Por ejemplo, para encontrar archivos que sus nombres contienen la palabra “mkdir”: #locate mkdir Nota: hay que ejecutar updatedb para actualizar las base de datos de búsqueda en la que se basa locate. Otro comando para localizar ficheros es which: $which bash

Para conocer todos los shell que disponemos en nuestro equipo: cat /etc/shells

Nota: se puede cambiar el shell con el comando chsh Algunas de las características de el Bourne Again Shell son: - Autocompletado de nombres de variables, usuarios, nombres de servidores, comandos y archivos. - Corrección de rutas de archivos en el comando cd. - Soporte a arrays de tamaño ilimitado.

Page 2: ADMINISTRACIÓN DE SISTEMAS OPERATIVOS. … · una salida estándar (por defecto la consola) y una salida de errores estándar ... ADMINISTRACIÓN DE SISTEMAS OPERATIVOS. UT07: SHELLSCRIPTS

ADMINISTRACIÓN DE SISTEMAS OPERATIVOS.

UT07: SHELLSCRIPTS

CURSO:

2º ASIR

2

B.- Los comodines. Para referirnos a varios ficheros es muy típico usar los comodines. Los más utilizados hasta ahora han sido: ?, que sustituye a un sólo carácter. *, que sustitute a 0 ó más caracteres. [conjunto], que sustituye a uno de los caracteres del conjunto (admite rangos). [!conjunto], uno de los caracteres que no esté en el conjunto. Es importante tener en cuenta que los comandos cuando se ejecutan no ven los comodines sino el resultado de la expansión. Nota: para realizar los ejemplos vamos a crear los archivos a1.html a4.html, f1.java f3.java, f1.js f3.js, t1.css t3.css y tema1.c tema3.c en el directorio prueba.

Ejemplos de aplicación 1.- ¿Qué mostrarían los siguientes comandos? a) $ls *.html → Todos los ficheros terminados en .html. En nuestro caso: a1.html, a2.html, a3.html y a4.html b) $ls tema?.* → Todos los ficheros que comiencen por tema, después un carácter y terminen en . Pueden, además, tener después del punto cualquier carácter. En nuestro caso: tema1.c, tema2.c y tema3.c c) $ls t[1-3,e]* → Todos los ficheros que empiecen por t1, t2, t3 y te y a continuación cualquier cosa. En nuestro caso: t1.css, t2.css, t3.css, tema1.c, tema2.c y tema3.c Nota: el último comando sería equivalente a ls t[1-3e]*, es decir, sin coma. d) #cp g* /tmp → En principio, como en todos los ejemplos anteriores, se produce la expansión del comodín, en este caso del *. Como no existe ningún archivo que comience por g, al comando cp se le pasa el parámetro g* y al no existir ningún archivo con el nombre g* es cuando se produce el error “cp: cannot stat 'g*': No such or directory. A continuación se muestra una imagen con la ejecución de todos los ejemplos anteriores

Page 3: ADMINISTRACIÓN DE SISTEMAS OPERATIVOS. … · una salida estándar (por defecto la consola) y una salida de errores estándar ... ADMINISTRACIÓN DE SISTEMAS OPERATIVOS. UT07: SHELLSCRIPTS

ADMINISTRACIÓN DE SISTEMAS OPERATIVOS.

UT07: SHELLSCRIPTS

CURSO:

2º ASIR

3

Nota: algunos “shells” no ejecutan el comando si no se produce la expansión (tcsh) y no se produce el error. Nota: podemos ver si la ejecución de un comando ha tenido éxito o no tecleando, después de la ejecución de dicho comando, echo $? (examinando el valor de la variable ?). Si el resultado es 0 éxito. En caso contrario, fracaso. Posibles valores: 1, 2, 127, … Ejemplos pwd es un comando que existe éxito (0). pwdd es un comando que no existe error (127)

Ahora, el comando existe y es correcta su sintaxis, pero no se copia nada error (1)

Ahora, el comando existe pero no se visualiza nada porque no existe el fichero de nombre q* error (1)

Page 4: ADMINISTRACIÓN DE SISTEMAS OPERATIVOS. … · una salida estándar (por defecto la consola) y una salida de errores estándar ... ADMINISTRACIÓN DE SISTEMAS OPERATIVOS. UT07: SHELLSCRIPTS

ADMINISTRACIÓN DE SISTEMAS OPERATIVOS.

UT07: SHELLSCRIPTS

CURSO:

2º ASIR

4

Comodín tilde o dash (~) Con Shift+F4, (o Alt+F5, depende de la versión instalada) obtenemos el comodín tilde, el cual se refiere al directorio home de los usuarios. Por ejemplo, con cd ~antonio nos vamos a /home/antonio (si hemos iniciado sesión con antonio bastaría con poner cd ~).

Nota: recordar que tecleando cd [INTRO], nos lleva a nuestro directorio de conexión. Comodín llaves El comodín llaves expande una palabra por cada una de las cadenas de caracteres que contiene. Dentro de la llave debe haber, al menos, dos cadenas de caracteres. Ejemplos: 1) $ls t*.{c, js, css, html, java} → Muestra, tras la expansión archivos y directorios que comiencen por t, cualquier carácter y tengan extensión c, js, css, html o java o errores. En nuestro caso:

2) Salida en pantalla de $ls t{{2,3},4}.{css,js,java} (aciertos y errores)

Otro parecido: $ls t{1,2,3,4,5}*.{css,js,java,html} 3) Salida en pantalla de $ls a{1}.* → En este bash, este comando produciría un error a no ser que existiera un fichero con el nombre a{1}.* (cosa poco probable porque no es razonable utilizar como parte de un nombre de fichero los caracteres { y *). Entre las llaves deben aparecer al menos dos opciones. Lo comprobamos:

Page 5: ADMINISTRACIÓN DE SISTEMAS OPERATIVOS. … · una salida estándar (por defecto la consola) y una salida de errores estándar ... ADMINISTRACIÓN DE SISTEMAS OPERATIVOS. UT07: SHELLSCRIPTS

ADMINISTRACIÓN DE SISTEMAS OPERATIVOS.

UT07: SHELLSCRIPTS

CURSO:

2º ASIR

5

C.- Redirecciones y tuberías. C.1.- Redirecciones Cada programa va a tener asociadas siempre una entrada estándar (por defecto el teclado), una salida estándar (por defecto la consola) y una salida de errores estándar (por defecto también la consola). Si queremos, podemos cambiar la entrada estándar para que el programa reciba datos de un fichero usando el operador de redirección <. Por ejemplo el comando cat, si no recibe argumentos, lee del teclado por la entrada estándar y lo pasa a la salida estándar: $ cat Hola queridos alumnos [intro] Hola queridos alumnos [intro] ^D Podemos cambiar la entrada estándar de cat para que lea de un fichero con: $cat < alumnosASO En el caso concreto del comando cat, también puede recibir como argumento el nombre del fichero a pasar a la salida estándar, con lo que en el caso del comando cat nos podríamos haber ahorrado el operador <. Linux/UNIX dispone de un gran número de comandos que leen de la entrada estándar, realizan una operación con el texto, y escriben en la salida estándar (o en la salida de errores si se produce un error): cat, grep, cut,... El operador de redirección de salida > permite cambiar la salida estándar de un comando, por ejemplo: $ date > ahora Envía el día y hora actuales al fichero ahora. También podemos cambiar a la vez la entrada y salida estándar de un programa usando ambos operadores de redirección. Por ejemplo: $ cat < ficheroa > ficherob También podemos cambiar la salida de errores estándar con el operador de redirección 2>. Por ejemplo: $ cat < ficheroa > ficherob 2> errores Copia el ficheroa en el ficherob y si se produce algún error lo escribe en el fichero errores. Si no queremos sobrescribir un fichero de salida sino añadir el contenido al final podemos usar el operador de redirección >> para la salida estándar o 2>> para los errores estándar. Por ejemplo: $ls p* >> ficheros 2>> errores Añadiría los ficheros que lista ls al fichero ficheros, y si se produjesen errores los añadiría al fichero errores. El operador de redirección 2>> es especialmente útil para almacenar los conocidos logs de errores. Muchas veces no se quiere que un programa muestre mensajes de error en la consola del usuario ni llevarlos a un fichero. En este caso es muy común redirigir su salida de errores estándar al fichero especial /dev/null: $ls *.{c,exe,java} 2> /dev/null Especialmente útil es /dev/null en comandos que, si los ejecuta un usuario normal, acceden a directorios a los que no podemos y comienzan a mostrarse errores que sabemos que son por la falta de privilegios. Como no los queremos ver, redirigimos la salida estándar de errores a este “sumidero”.

Page 6: ADMINISTRACIÓN DE SISTEMAS OPERATIVOS. … · una salida estándar (por defecto la consola) y una salida de errores estándar ... ADMINISTRACIÓN DE SISTEMAS OPERATIVOS. UT07: SHELLSCRIPTS

ADMINISTRACIÓN DE SISTEMAS OPERATIVOS.

UT07: SHELLSCRIPTS

CURSO:

2º ASIR

6

Observar la diferencia: $find / -name *.sh $find / -name *.sh 2> /dev/null C.2.- Tuberías Es posible redirigir la salida estándar de un programa a la entrada estándar de otro usando el operador | (pipeline). Vamos a ver un ejemplo utilizando un comando muy útil: cut. $cut -d: -f1 < /etc/passwd | sort (en este ejemplo podemos ahorrarnos el <). En este caso obtenemos los nombres de los usuarios del equipo ordenados alfabéticamente. En primer lugar, cut busca el delimitador : que lo hace con -d. De los campos que existan separados por : obtiene el primero (-f1, f de field o campo). Nota: si queremos obtener más campos, vamos separando por comas los que queramos, por ejemplo, -f1,3,5. Comando relacionado: tee. Este comando guarda la salida estándar intermedia en un fichero y continúa ejecutando la línea de comandos. Por ejemplo, queremos llevar el contenido de un fichero a otro contando las líneas del mismo: # cat f1 > nuevo # wc -l nuevo Solución: #cat f1 | tee nuevo | wc -l Nota: si el archivo existe y queremos añadir la información, entonces tee -a f: #cat f1 | tee -a nuevo | wc -l

Page 7: ADMINISTRACIÓN DE SISTEMAS OPERATIVOS. … · una salida estándar (por defecto la consola) y una salida de errores estándar ... ADMINISTRACIÓN DE SISTEMAS OPERATIVOS. UT07: SHELLSCRIPTS

ADMINISTRACIÓN DE SISTEMAS OPERATIVOS.

UT07: SHELLSCRIPTS

CURSO:

2º ASIR

7

D.- Ejecución de comandos. Historial de comandos Los comandos que vamos ejecutando se van almacenando en el fichero .bash_history, situado dentro del directorio home de cada usuario. Podemos usar history para obtener un listado completo de los comandos que hemos ejecutado. Si queremos ver los n últimos, podemos teclear history n, por ejemlplo, history 10. El número de comandos almacenados está en la variable HISTSIZE. ¿Cómo podemos saber su valor? Tecleando echo $HISTSIZE. Podemos cambiar este valor en el fichero de configuración .bashrc. Otro comando parecido, aunque menos útil, a history es fc -l. Relacionados con “bang”: - Para ejecutar el último comando: $!!. - Para ejecutar el comando n: $!n (hay que saber el n ejecutando antes history). - Para ejecutar el último comando que empiece por …: $!cadena, por ejemplo $!gr Ejecución secuencial de comandos: separados por el carácter; $ls -l; echo Hola. Además podemos agrupar los comandos en paréntesis y ser tratado como si fuera un sólo comando, es decir, un solo PID: $ (ls-l ; echo Hola) También podemos ejecutar estos comandos en 2º plano: & $ (ls-l ; echo Hola) &

E.- Medida del tiempo total de ejecución de un programa El comando time de Linux permite obtener el tiempo total de ejecución de un programa. Su sintaxis es muy sencilla: time seguido del comando cuya ejecución queremos medir (con los parámetros correspondientes). El valor real indica el tiempo total transcurrido en ejecutar el comando. Por ejemplo, si hay otros procesos en el sistema, se contará también el tiempo de los mismos. El valor user se refiere al tiempo de CPU del proceso en cuestión; por lo tanto, se excluye el tiempo de otros procesos o de los retardos del disco. El valor sys es el tiempo de CPU en las llamadas al sistema del proceso. Idealmente, si no hubieran otros procesos y la lectura de disco fuera inmediata, tendríamos que: user + sys = real.

Page 8: ADMINISTRACIÓN DE SISTEMAS OPERATIVOS. … · una salida estándar (por defecto la consola) y una salida de errores estándar ... ADMINISTRACIÓN DE SISTEMAS OPERATIVOS. UT07: SHELLSCRIPTS

ADMINISTRACIÓN DE SISTEMAS OPERATIVOS.

UT07: SHELLSCRIPTS

CURSO:

2º ASIR

8

7.1.- Comandos externos y comandos internos (bash). La mayoría de los comandos de Linux están ubicados en /bin. Pero hay otros directorios que pueden contener otro tipo de comandos, utilidades, herramientas, etc. (por ejemplo apt-get, tail, cron , etc) y que los podemos ejecutar sin problemas porque están contenidos en la variable PATH. Podemos ver estos directorios tecleando echo $PATH (para ver el contenido de una variable en Linux hay que anteponerle el carácter $. Linux nombra a las variables del sistema en mayúsculas).

Podemos ver el contenido de una variable en el terminal tecleando echo $variable, por ejemplo,

echo $HOSTNAME. Además existen una serie de comandos que no están almacenados en ningún directorio, es decir, son internos al intérprete, en este caso, a bash. Ejemplos: cd, fc, set, alias, etc. Obtenemos ayuda de estos comandos con help comando y no con man comando. Para saber de qué tipo es un comando teclear type comando.

Podemos buscar la ubicación de los comandos con la utilidad whereis comando:

Como tail es comando externo, aparece, entre otra información, su ruta. Por otra parte, fc es comando interno al shell y por tanto no está en ningún directorio.

Page 9: ADMINISTRACIÓN DE SISTEMAS OPERATIVOS. … · una salida estándar (por defecto la consola) y una salida de errores estándar ... ADMINISTRACIÓN DE SISTEMAS OPERATIVOS. UT07: SHELLSCRIPTS

ADMINISTRACIÓN DE SISTEMAS OPERATIVOS.

UT07: SHELLSCRIPTS

CURSO:

2º ASIR

9

7.2.- Variables. Variables Los valores de las variables se asignan y se visualizan de la siguiente forma:

Variables del sistema: comando set $set | more Buscar una variable:

Otras formas de ver variables del sistema: env 7.3.- Comandos. Recordemos que para obtener información sobre la sintaxis de los comandos podemos teclear help, man o info. Además, también podemos obtener información del directorio /usr/share/doc, que contiene artículos sobre cómo hacer determinadas cosas dentro de nuestro sistema.

7.4.- Shellscripts. Ficheros de texto, cuyo contenido son comandos y otras instrucciones propias del shell que estemos utilizando. Su función es crear aplicaciones, que realizan de forma automatizada, tareas administrativas. - Si son creados por un usuario que no sea root, los podemos ejecutar de varias formas: a) $bash nombre-script. b) $. nombre-script (punto nombre-script) c) Creamos en nuestro directorio de conexión el directorio bin y allí nuestros scripts con permisos de ejecución para los usuarios que queramos, por ejemplo permisos 755 (el .profile , que es un scritpt, de ese usuario, cuando se ejecuta, comprueba que existe el directorio bin y lo añade al path).

Nota: comentar aquí que podemos añadir alguna opción para personalizar nuestro entorno, como por ejemplo, cambiara la máscara a archivos y directorios, añadir al PATH alguna ruta nueva, crear alias, etc.

Page 10: ADMINISTRACIÓN DE SISTEMAS OPERATIVOS. … · una salida estándar (por defecto la consola) y una salida de errores estándar ... ADMINISTRACIÓN DE SISTEMAS OPERATIVOS. UT07: SHELLSCRIPTS

ADMINISTRACIÓN DE SISTEMAS OPERATIVOS.

UT07: SHELLSCRIPTS

CURSO:

2º ASIR

10

- Si es root el que quiere poner a disposición de todo el mundo estos programas puede ubicarlos, por ejemplo, en /share/doc/bin o en /usr/local/bin. En cualquier caso, todo script comenzará por la línea especial sha-bang /bin/bash: #!/bin/bash Vamos a crear el directorio bin en nuestro directorio de conexión. Nota: voy a trabajar en el terminal pero el equipo ha iniciado con un entorno gráfico. Ejemplo 1: Crea, sin ser root, en el directorio bin de tu directorio de conexión, el siguiente script, llamado shell-1.

Se pide: 1) ¿Qué permisos tiene el fichero?

Vemos que tiene asignado los que el sistema asigna por defecto. Comprobamos que no tiene permisos de ejecución (x). 2) Ejecuta el shell de las formas comentadas anteriormente (a), b) y c)) a) bash shell-1: observamos, que a pesar de no tener permisos, se ejecuta.

Page 11: ADMINISTRACIÓN DE SISTEMAS OPERATIVOS. … · una salida estándar (por defecto la consola) y una salida de errores estándar ... ADMINISTRACIÓN DE SISTEMAS OPERATIVOS. UT07: SHELLSCRIPTS

ADMINISTRACIÓN DE SISTEMAS OPERATIVOS.

UT07: SHELLSCRIPTS

CURSO:

2º ASIR

11

b) . shell-1

c) shell-1: antes, le asigno permisos 755 (chmod 755 shell-1) y lo ejecito tecleando su nombre (puede ser que debas cerrar sesión y entrar de nuevo para actualizar la variable PATH).

Hay otras formas de ejecutar un script, siempre que éste tenga permisos de ejecución: a) ./nombre-script (punto barra nombre-script)

b) Con el comando exec script. ¿Qué sucede en este último caso) Sol.: tras la ejecución hace un exit (si hubiéramos arrancado sin X, hace un logout). En resumen, tenemos: a) No necesita tener permisos de ejecución: bash script y . script (no conserva el entorno, es decir, se ejecuta en el shell actual). b) Si necesita permisos: script, ./script y exec script Ejercicio: crear un script llamado b que cuando se ejecute borre la pantalla. #!/bin/bash clear Nota: el comando que nos permite realizar el seguimiento detallado de la ejecución de un shellscript es set. Nos puede venir muy bien para depurar programas.

Page 12: ADMINISTRACIÓN DE SISTEMAS OPERATIVOS. … · una salida estándar (por defecto la consola) y una salida de errores estándar ... ADMINISTRACIÓN DE SISTEMAS OPERATIVOS. UT07: SHELLSCRIPTS

ADMINISTRACIÓN DE SISTEMAS OPERATIVOS.

UT07: SHELLSCRIPTS

CURSO:

2º ASIR

12

7.5.- Comando test. El comando test realiza una evaluación lógica de expresiones. Actúa sobre: a) Tipos de ficheros. b) Comparación de cadenas. c) Comparación de enteros. Si el valor es 0 → cierto. En caso contrario, es falso (1,2,3,127, etc.) Este código de retorno está en $?. Ejemplos sobre ficheros 1) #test -x usuarios (¿tiene usuarios permisos de ejecución?) #echo $? 0 (si) 2) #test -x empleados (¿tiene empleados permisos de ejecución?) #echo $? 1 (no) Otras opciones: -d → directorio -f → fichero de datos -r → permiso de lectura -s → tamaño mayor a 0 bytes -w → permiso de escritura -x → permiso de ejecución Ejemplos sobre cadenas Opciones: -n cadena → cierto si la longitud de la cadena es distinta de 0 -z cadena → cierto se la longitud de la cadena es 0 cadena1 = cadena2 → cierto de las cadenas son iguales cadena1 != cadena2 → cierto si las cadenas son diferentes cadena → cierto si la cadena de caracteres no es nula #cadena1=”rojo” #cadena2=”verde” #test “$cadena1” = “$cadena2” #echo $? 1 #test “$cadena1” = “rojo” #echo $? 0 Ejemplos sobre enteros Operadores: -eq → igual -ne → distinto -lt → menor que

Page 13: ADMINISTRACIÓN DE SISTEMAS OPERATIVOS. … · una salida estándar (por defecto la consola) y una salida de errores estándar ... ADMINISTRACIÓN DE SISTEMAS OPERATIVOS. UT07: SHELLSCRIPTS

ADMINISTRACIÓN DE SISTEMAS OPERATIVOS.

UT07: SHELLSCRIPTS

CURSO:

2º ASIR

13

-le → menor o igual -gt → mayor que -ge → mayor o igual a Ejemplo: #var=2 #test “$var” -eq “2” (también sin comillas dobles: test “$var” -eq 2) #echo $? 0 Operadores relacionales con valores numéricos

Page 14: ADMINISTRACIÓN DE SISTEMAS OPERATIVOS. … · una salida estándar (por defecto la consola) y una salida de errores estándar ... ADMINISTRACIÓN DE SISTEMAS OPERATIVOS. UT07: SHELLSCRIPTS

ADMINISTRACIÓN DE SISTEMAS OPERATIVOS.

UT07: SHELLSCRIPTS

CURSO:

2º ASIR

14

Comprobación de atributos de ficheros