Shell Linux
Transcripción
Shell Linux
Shell Linux Luis Alberto Vargas Añamaco 25 de julio de 2008 El SHELL es un programa que permite usar comandos que son interpretados o ejecutados para controlar el sistema. Linux incluye los mas populares shell Unix: Nombre ASH shell BASH shell C shell Korn shell Z shell Programa /bin/ash /bin/bash /bin/csh /bin/ksh /bin/zsh Descripción Shell usado por el Unix System V de AT&T’s El shell estándar de Linux, basado en el shell original de Unix, Bourne Shell El shell secundario de Unix. Su sintaxis de programación se asemeja al lenguaje C Añade muchas características del C shell al original Bourne Shell Un shell más pequeño basado en el shell Kornl. Si bien el shell es un método de interacción del pasado es mas sofisticado para solucionar operaciones que reúnen gran complejidad. Los GUIs en cambio son mas fáciles de usar para tareas relativamente sencillas. 1. Usando el Shell Cuando se digitan los comandos del shell, se tiene acceso a un mini-editor. Se mantiene una lista denominada historical list. Para reejecutar un comando, presione flecha arriba varias veces hasta localizar el comando y luego presionar Enter para ejecutar el comando. Up Retrocede un comando en la history list. Down Adelanta un comando en la history list. Left Mueve el Cursor un carácter atrás. Right Mueve el Cursor un carácter adelante. Esc f Mueve el Cursor una palabra adelante. Esc b Mueve el Cursor una palabra atrás. Ctrl-a Mueve el Cursor el principio de la línea. Ctrl-e Mueve el Cursor al final de la línea. Ctrl-d Elimina el Carácter actual. Backspace Elimina el Carácter anterior. Esc d Elimina la palabra actual. Ctrl-u Elimina desde el inicio de línea. Ctrl k Elimina hasta el fin de línea. Ctrl-y Deshace la última modificación. Esc . Inserta la última palabra del comando anterior. Ctrl-L Limpia el terminal. Tab Intenta completar la actual palabra, interpretando como fichero, nombre de usuario, nombre de variable o comando el cual es determinado por el contexto. Esc ? Lista los posibles compleciones. Adicionalmente los shell interpretan la siguiente secuencia: Ctrl-C Envía una señal de interrupción al proceso actual en ejecución, el cual concluye con la finalización de la aplicación. 1 Ctrl-D Envía una finalización de flujos. Ctrl-Z Suspende la ejecución del proceso actual. Otros caracteres especiales: # Marca el comando como comentario, es ignorado por el shell. ; Separa comandos, permite ingresar comandos en una sola linea. & Colocado después de una comando, envía el proceso a una ejecución en segundo plano. 2. Comandos y Argumentos La forma general de un comando de shell tiene la forma: command options arguments Donde command determina que operación realizará el shell, las options y arguments añaden preferencias. Muchas veces el command especifica el nombre de archivo de un programa, el cual debe ser iniciado, comando externo. Los ejecutables se guardan en las carpetas /bin, /usr/bin o /usr/local/bin. Las aplicaciones de administración de sistema en /sbin o /usr/sbin. El shell puede interpretar los siguientes meta caracteres para que designan a nombres de archivos y conjunto de ellos. Carácter * ? [ abc ... ] [a-z] [ ! abc ... ] [ ! a - z] ~ ~userID ~+ ~- 3. Significado Empareja una cadena de cero o mas caracteres Empareja exactamente un carácter Empareja uno de los caracteres especificados Empareja los caracteres en el rango especificado Empareja caracteres que no concuerdan con los especificados Empareja caracteres que no concuerdan con el rango especificado El nombre del usuario actual El nombre del usuario especificado El directorio de trabajo actual El directorio de trabajo anterior Alias Facilita el uso de comandos permitiendo nombres abreviados para los comandos y sus argumentos comúnmente usados. alias name=’commando options arguments’ Donde command especifica el comando para el cual se desea crear un alias. name especifica el alias. alias dir=’ls -l’ alias fm=’mount -t vfat /dev/fd0 /mnt/floppy’ alias fu=’umount /mnt/floppy’ Su configuración por defecto probablemente define varios alias, para listarlos: alias Si inicio sesión como administrador su lista puede ser: alias alias alias alias alias alias cp=’cp -i’ dir=’ls -l’ cp=’cp -i’ ls=’ls --color’ mv=’mv -i’ rm=’rm -i’ Para remover los alias use el comando unalias. unalias name 2 4. Scripts Un script de shell es simplemente un archivo que contiene comandos, para posteriormente ser ejecutados una y otra vez. Por ejemplo considere un archivo denominado deleter, que contiene las siguientes lineas: echo -n Eliminando archivos temporales ... rm -fr /tmp/* echo Done. Para ejecutar este script: sh deleter Si se invoca el comando sh sin argumento que nombre a un script, se lanza una instancia del sesión anterior use el comando exit. Para facilitar la ejecución del script cambie el acceso de ejecución: SHELL para retornar a la chmod ugo+x deleter ./deteler Para ejecutar desde el directorio de trabajo. PATH/deleter Para ejecutar siguiendo su ruta absoluta o relativa. deleter Para ejecutar siguiendo la ruta de búsqueda. Linux incluye varios script estándares que pueden ser ejecutados dependiendo del momento. /etc/profile Ejecutado cuando el usuario inicia sesión ~/.profile Ejecutado cuando el usuario inicia sesión. ~/.bashrc Ejecutado cuando el BASH es lanzado. ~/.bash_logout Ejecutado cuando el usuario abandona la sesión. 5. Redireccionamiento El SHELL proporciona tres flujos estándares: stdin El flujo estándar de entrada stdout El flujo estándar de salida stderr El flujo estándar de errores Por defecto, los programas leen su entrada desde el flujo stdin y escribe su salida al flujo stdout. Porque ambos flujos son normalmente asociados a las consolas (teclado y pantalla de consola respectivamente). El flujo stderr es asociado a la pantalla de la consola. Aunque el SHELL asocia por defecto los tres flujos de entrada/salida con la consola, se pueden especificar redirectores de entrada/salida que por ejemplo asocie una entrada o una salida con un archivo. > file Redirecciona el flujo de salida estándar al archivo especificado. 2> file Redirecciona el flujo de error estándar al archivo especificado. > > file Redirecciona el flujo de salida estándar al archivo especificado, añadiendo salida al archivo si el archivo existe. 2> > file Redirecciona el flujo de error estándar al archivo especificado, añadiendo salida al archivo si el archivo existe. &> file Redirecciona el flujo de salida y error estándar al archivo especificado. < file Redirecciona el flujo de entrada estándar al archivo especificado. < < text Lee el flujo de entrada estándar hasta encontrar el patrón text, en cuyo es interpreta como el final del flujo. cmd1 | cmd2 Se toma la entrada estándar del cmd2 desde la salida estándar de cmd1 (también conocido como canal de redirección) Que hacen los comandos: 3 wc /etc/passwd wc /etc/passwd > total cat total wc wc < /etc/passwd Muchos programas son escritos de modo que ignoren la redirección. Por ejemplo el comando passwd. espera leer la contraseña únicamente desde la consola, no desde un archivo. Muchos programas Linux leen su entrada desde el flujo stdin y escriben su salida al flujo stdout, estos programas son denominados filtros. Estros programas pueden ser usados en conjunto para realizar complejas operaciones. La herramienta para combinar los filtros es el pipe, el cual conecta la salida de un programa a la entrada de otro. ls -l ~ | wc -l 6. Variables Shell El SHELL es un lenguaje de programación en sus propios teminos, permitiendo referirse a sus variables conocidas como variables shell o variables de entorno. Para asignar un valor a una variable shell use el siguiente esquema. Variable=valor Asigna el valor valor al la variable Variable. Las variables shell son ampliamente usadas dentro de Linux, porque proporciona una via para transferir datos de una comando a otro. Para listas todas las variables de entorno invoque al comando set. Los valores de esas variables son establecidas por scripts de inicio. #!/bin/bash Nombre=’Linux user..’ echo "Hello:" echo $Nombre echo Algunas variables de entorno: DISPLAY La vista X a ser usada: por ej. localhost:0 HOME La ruta absoluta del home del usuario. HOSTNAME El nombre del equipo. LOGNAME El alias del usuario. MAIL La ruta absoluta del buzón de correo del usuario. PATH La ruta de búsqueda. SHELL La ruta absoluta del actual SHELL. TERM El nombre del terminal. USER El nombre del usuario; difiere del login si se ejecuto el comando su. Se puede usar el valor de la variable shell precediéndola por el signo $. cd $HOME cd ${HOME} Par imprimir el valor de una variable use la variable como argumento del comando echo. echo $HOSTNAME Para hacer disponible una variable de shell a otros programas invocados por el shell deben ser exportadas. export Variable export VariableX=ValorY Variable= Para remover el valor asociado con la variable: unset Variable Para eliminar la varible: 4 7. La ruta de Búsqueda La variable de entorno PATH contiene una serie de rutas separadas por “:” conocida como ruta de búsqueda. Cuando se invoca a un comando externo el SHELL usa la ruta de búsqueda para hallar el nombre de archivo que corresponde al comando. Los scripts de inicio establecen los valores iniciales para PATH, para modificar su valor redefina la añadiendo al valor anterior las nuevas rutas: PATH=${PATH}:/home/user El comando which verifica la ruta de búsqueda para el argumento indicado e imprime la ruta del nombre encontrado si existe. which wc 8. Entrecomillado Permiten la correcta interpretación para el SHELL. ’ Caracteres incluidos dentro de un par de simple comillas son interpretados literalmente. “” Caracteres incluidos dentro de un par de doble comillas son interpretados literalmente. Además se reemplazan las variables de entorno con el valor referenciado. “ Caracteres incluidos dentro de un par de comillas invertidas son interpretados como un comando el cual es ejecutado antes de ejecutar el resto de comandos de la linea. La salida del comando remplaza la cadena original. \ El siguiente carácter es interpretado literalmente. Se ignora los metacaracteres. Interprete cada linea: echo echo echo echo $PATH ’$PATH’ “$PATH” Mi directorio personal contiene ‘ls ~ | wc -l‘ Archivos. Ejecute el siguiente programa #!/bin/bash DIR=/tmp Cadena1="ls -l Cadena2=’ls -l Cadena3=\$DIR Cadena4=‘ls -l echo echo "Cadena1: echo "Cadena2: echo "Cadena3: echo "Cadena4: $DIR" $DIR’ $DIR‘ "$Cadena1 "$Cadena2 "$Cadena3 "$Cadena4 Ahora puede apreciar el poder del SHELL de Linux: Incluyendo sus alias en el script de inicio .bashrc, usando el auto completado de comandos, usando la lista histórica. Pero el SHELL tiene características que extienden sus capacidades como la de incluir un lenguaje de programación que proporciona el procesamiento de argumentos, condiciones, lógicas, bucles, subprogramas y recursividad. 9. Procesando Argumentos Cuando se llama a un programa (comando) se añade información adicional por ejemplo: ls -l /tmp este comando tiene dos parámetros: 1) -l 2) /tmp Los parámetros dentro de un script se recuperar con las variables especiales: $1, $2, ..., $9. Además: $# Indica el numero de parámetros pasados al script. 5 $0 El nombre del script. $1,$2,...,$9 Cada uno de los argumentos. $* Cadena con todos los parámetros, tratado como una palabra simple. $@ Cadena con todos los parámetros, tratado como una serie de palabras. $? Código de salida del comando previo. Un valor 0 señala que termino sin errores. $$ El identificador de proceso. Advierta que el shell le proporciona variables para acceder solo a nueve argumentos. Para acceder al resto de parámetros use el comando shift que descarta el primer parámetro y desplaza la lista hacia la izquierda. La variable $? contiene un código de salida numérico del anterior comando. Por convención un código de 0 denota un termino sin errores; en cambio otros valores indican condiciones de error. Un script puede terminar indicando un código de finalización con el comando: exit status donde status es un entero no negativo que indica el código de salida. Invoque el siguiente script con dos parámetros #!/bin/bash echo echo "El primer parametro: "$1 echo "El segundo parametro: "$2 echo "Numero de parametros es: "$# echo "El nombre del script es: "$0 echo "Los parametros son: "$* echo "Los parametros son: "$@ echo 10. Comparación de Expresiones La comparación lógica de dos operadores (numéricos o cadenas) tiene la sintaxis: test expresion [ expresion ] Comparación de cadenas: s1 = s2 Para comparar si dos cadenas son iguales. s1 != s2 Para comparar si dos cadenas no son iguales. -n s1 Para evaluar si la longitud de la cadena es mayor que cero. -z s1 Para evaluar si la longitud de la cadena es cero. Comparación numérica: n1 -eq n2 igual que n1 -ge n2 mayor o igual que n1 -le n2 menor o igual que n1 -ne n2 no es igual que n1 -gt n2 mayor que n1 -lt n2 menor que 6 Operadores de archivos: -e file existe -d file existe y es directorio -f file existe y es archivo -c file existe y es un archivo de dispositivo de caracteres -b file existe y es un archivo de dispositivo de bloques -r file existe y tiene permiso de lectura -s file existe y tiene longitud mayor a cero -w file existe y tiene permiso de escritura -x file existe y tiene permiso de ejecución -h file existe y es un enlace f1 -nt f2 el archivo f1 es mas reciente que f2 f1 -ot f2 el archivo f1 es mas antiguo que f2 Operadores lógicos: ! el operador NOT, invierte el valor de la siguiente condición . -a el operador lógico AND -o el operador lógico OR 11. Evaluación Aritmética Las variables SHELL pueden contener números, pero en general todos son tratados como cadenas de caracteres. La aritmética entera se puede manejar con el comando interno let o con el comando externo expr. #!/bin/bash NUM=1024 let X=$NUM/16 Y=‘expr $NUM / 256‘ echo “Calculo con let: ”$X echo “Calculo con expr: ”$Y El comando interno let exige que no se incluyan espacios entre los operandos y operadores; en cambio el comando externo expr exige espacios. Operadores matemáticos let +- incremento y decremento + - * /% suma, resta, multiplicación división y resto < <= > >= == != comparaciones: menor que, menor o igual que, mayor que, mayor o igual que, igual, diferente &^|~ AND, XOR, OR y NOT a nivel de bits << > desplazamiento a la izquierda y desplazamiento a la derecha a nivel de bits && || ! operadores lógicos AND, OR y NOT = *= /= %= += -= < <= >= &= ^= |= asignaciones Operadores matemáticos expr + - * /% suma, resta, multiplicación división y resto < <= > >= = != comparaciones: menor que, menor o igual que, mayor que, mayor o igual que, igual, diferente &| operadores lógicos AND y OR 7 12. Sentencia if: if [ expresion ] then fi if [ expresion ] then else fi if [ expresion ] then elif [ expresion ] else fi Codifique e invoque con los parámetros apropiados los siguientes scripts: #!/bin/bash if [ $1 -ge 0 ] ; then echo "El numero es positivo o nulo" fi #!/bin/bash if [ $1 -ge 0 ] ; then echo "El numero es positivo o nulo" else echo "El numero es negativo" fi #!/bin/bash if [ $1 -gt 0 ] ; then echo "El numero es positivo" elif [ $1 -eq 0 ] ; then echo "El numero es nulo" else echo "El numero es negativo" fi 13. Sentencia case Es una sentencia de selección múltiple case str in str1) sentencias;; str2) sentencias;; *) sentencias;; esac Codifique e invoque con un parámetro numérico: #!/bin/bash case $1 in 1 | 01) echo 2 | 02) echo 3 | 03) echo 4 | 04) echo 5 | 05) echo 6 | 06) echo 7 | 07) echo 8 | 08) echo 9 | 09) echo 10) echo 11) echo 12) echo *) echo esac "Mes de Enero";; "Mes de Febrero";; "Mes de Marzo";; "Mes de Abril";; "Mes de Mayo";; "Mes de Junio";; "Mes de Julio";; "Mes de Agosto";; "Mes de Septiembre";; "Mes de Octubre";; "Mes de Noviembre";; "Mes de Diciembre";; "Parametro invalido";; 8 14. Sentencia for La sentencia for itera sobre los elementos de una lista: for var in lista do sentencias done #!/bin/bash for Mes in 1 2 3 4 5 6 7 8 9 10 11 12 do cal $Mes 2004 done Ejecute este script añadiendo una lista de parámetros #!/bin/bash for Mes in "$@" do cal $Mes 2004 done 15. Sentencia while Se ejecuta las sentencias mientras la expresión resulte verdadera while expresion do sentencias done #!/bin/bash num=1 sum=0 while [ $num -le 5 ] do sum=‘expr $sum + $num‘ num=‘expr $num + 1‘ done echo "La suma es: $sum" 16. La sentencia until Se ejecuta las sentencias hasta que se cumpla la condición until expresion do sentencias done #!/bin/bash num=1 sum=0 until [ $num -gt 5 ] do sum=‘expr $sum + $num‘ num=‘expr $num + 1‘ done echo "La suma es: $sum" 17. Otras sentencias Sentencia break Se usa para salir de un bucle: for until o while Sentencia continue Sentencia exit Se usa para iniciar el siguiente ciclo de un bucle: for until o while Se utiliza para salir de un script, puede tener ser acompañado de un parámetro de salida. 9 18. Funciones Cuando se invoca a un subprograma: func param1 param2 param 3 un subprograma puede analizar los parámetros pasados de forma idéntica a alas de un guión. func () { #sentencias } Ejemplo de subprograma: #!/bin/bash MuestraMes() { case $1 in 1 | 01) echo 2 | 02) echo 3 | 03) echo 4 | 04) echo 5 | 05) echo 6 | 06) echo 7 | 07) echo 8 | 08) echo 9 | 09) echo 10) echo 11) echo 12) echo *) echo esac } MuestraMes 8 "Mes de Enero";; "Mes de Febrero";; "Mes de Marzo";; "Mes de Abril";; "Mes de Febrero";; "Mes de Mayo";; "Mes de Junio";; "Mes de Agosto";; "Mes de Septiembre";; "Mes de Octubre";; "Mes de Noviembre";; "Mes de Diciembre";; "Parametro invalido";; Imprime una pagina que indiza las paginas html de cada subdirectorio. #!/bin/bash echo ’<html>’ echo ’<head>’ echo ’<title> My Index </title>’ echo ’</head>’ echo ’<body>’ echo ’<h1>Index of HTML files </h1>’ for i in * do if [ -d $i ] ; then echo "<h2>$i</h2>" echo ’<ul>’ for j in $i/*.htm* do if [ -f $j ] ; then tline=‘grep ’<TITLE>’ $j‘ if [ $? -eq 1 ] then ntitle=‘basename $j | cut -f1 -d"."‘ else ntitle=‘echo $tline | sed ’s/^.*<title>//’ | sed ’s/<\/title>.*$//’‘ fi echo "<li><a href=$j>$ntitle</a>" fi done echo ’</ul>’ fi done echo ’</body>’ echo ’</html>’ Programa que muenta un cdrom: #!/bin/ash PM=’/dev/hda’ PS=’/dev/hdb’ SM=’/dev/hdc’ SS=’/dev/hdd’ DEVICES="$PM $PS $SM $SS /dev/sr0" DEVCD= #Montar el CDROM if [ ! -d /cdrom ] ; then 10 mkdir /cdrom fi for DEV in $DEVICES do echo $DEV mount -t iso9660 $DEV /cdrom 2> /dev/null if [ $? -eq 0 ] ; then DEVCD=$DEV ln -s $DEV /dev/cdrom 2>/dev/null break fi done if [ -z $DEVCD ] ; then echo "CDrom no Encontrado ..." exit 1 fi Programa que carga al PostgreSQL #! /bin/sh PG_SYSCONFIG=/etc/sysconfig/postgresql if [ -f $PG_SYSCONFIG ]; then # SuSE Linux 8.0 and above . $PG_SYSCONFIG else # SuSE Linux up to 7.3 . /etc/rc.config base=${0##*/} link=${base#*[SK][0-9][0-9]} test $link = $base && START_POSTGRES=yes test "$START_POSTGRES" = yes || exit 0 fi # Shell functions sourced from /etc/rc.status: # rc_check check and set local and overall rc status # rc_status check and set local and overall rc status # rc_status -v ditto but be verbose in local rc status # rc_status -v -r ditto and clear the local rc status # rc_failed set local and overall rc status to failed # rc_reset clear local rc status (overall remains) # rc_exit exit appropriate to overall rc status . /etc/rc.status H=/usr/bin/postmaster test -x $H || exit 5 LOGFILE=/var/log/postgresql eval DATADIR=${POSTGRES_DATADIR:-~postgres/data} OPTIONS=${POSTGRES_OPTIONS} # The echo return value for success (defined in /etc/rc.config). rc_reset # Return values acc. to LSB for all commands but status: # 0 - success # 1 - generic or unspecified error # 2 - invalid or excess argument(s) # 3 - unimplemented feature (e.g. "reload") # 4 - insufficient privilege # 5 - program is not installed # 6 - program is not configured # 7 - program is not running # # Note that starting an already running service, stopping or restarting a not-running # service as well as the restart with force-reload (in case signalling is not supported) # are considered a success. case "$1" in start) if [ ! -f $DATADIR/PG_VERSION ]; then echo -n "Initializing the PostgreSQL database at location ${DATADIR}" install -d -o postgres -g daemon -m 700 ${DATADIR} && su - postgres -c "env -i initdb $DATADIR &> initlog" || rc_failed rc_status -v rc_status || { echo "You can find a log of the initialisation in ~postgres/initlog." rc_exit } fi echo -n "Starting PostgreSQL" BIN_VERSION=$(/usr/bin/postgres --version|sed ’s/.* \([0-9]\+\.[0-9]\+\).*/\1/’) DATA_VERSION=$(cat $DATADIR/PG_VERSION) if [ "$BIN_VERSION" != "$DATA_VERSION" ]; then echo "" echo " Installed binaries and database files don’t match." echo " Manual work is needed to upgrade your database." echo " See /usr/share/doc/packages/postgresql/README.SuSE for details." echo -n "Starting PostgreSQL " 11 rc_failed rc_status -v rc_exit else ## remove old socket, if it exists and no daemon is running. checkproc $H || rm -f /tmp/.s.PGSQL.5432 ## Start daemon with startproc(8). If this fails ## the echo return value is set appropriate. /sbin/startproc -e -t 1 -u postgres -l $LOGFILE $H $OPTIONS -D$DATADIR rc_status -v fi ;; stop) echo -n "Shutting down PostgreSQL" ## Stop daemon with killproc(8) and if this fails ## set the echo return value. killproc -INT $H rc_status -v ;; try-restart) ## Stop the service and if this succeeds (i.e. the ## service was running before), start it again. ## Note: try-restart is not (yet) part of LSB (as of 0.7.5) $0 status && $0 restart ;; restart) ## Stop the service and regardless of whether it was ## running or not, start it again. $0 stop $0 start rc_status ;; force-reload | reload) echo -n "Reloading configuration for PostgreSQL" killproc -HUP $H rc_status -v ;; status) echo -n "Checking for PostgreSQL: " ## Check status with checkproc(8), if process is running ## checkproc will return with exit status 0. # Status has a slightly different for the status command: # 0 - service running # 1 - service dead, but /var/run/ pid file exists # 2 - service dead, but /var/lock/ lock file exists # 3 - service not running # NOTE: checkproc returns LSB compliant status values. checkproc $H rc_status -v ;; probe) rc_failed 3 rc_status -v ;; *) echo "Usage: $0 {start|stop|status|try-restart|restart|force-reload|reload|probe}" exit 1 ;; esac # Inform the caller not only verbosely and set an exit status. rc_exit 12