Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Linux Shell
Linux Shell
Si bien el shell es un mtodo de interaccin del pasado es mas sosticado para solucionar operaciones que renen gran complejidad. Los GUIs en cambio son mas fciles 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 echa arriba varias veces hasta localizar el comando y luego presionar Enter para ejecutar el comando. Up Down Left Right Esc f Esc b Ctrl-a Ctrl-e Ctrl-d Retrocede un comando en la history list. Adelanta un comando en la history list. Mueve el Cursor un carcter atrs. Mueve el Cursor un carcter adelante. Mueve el Cursor una palabra adelante. Mueve el Cursor una palabra atrs. Mueve el Cursor el principio de la lnea. Mueve el Cursor al nal de la lnea. Elimina el Carcter actual.
Backspace Elimina el Carcter anterior. Esc d Ctrl-u Ctrl k Ctrl-y Esc . Ctrl-L Tab Esc ? Elimina la palabra actual. Elimina desde el inicio de lnea. Elimina hasta el n de lnea. Deshace la ltima modicacin. Inserta la ltima palabra del comando anterior. Limpia el terminal. Intenta completar la actual palabra, interpretando como chero, nombre de usuario, nombre de variable o comando el cual es determinado por el contexto. Lista los posibles compleciones.
Adicionalmente los shell interpretan la siguiente secuencia: Ctrl-C Enva una seal de interrupcin al proceso actual en ejecucin, el cual concluye con la nalizacin de la aplicacin. 1
Ctrl-D Enva una nalizacin de ujos. Ctrl-Z Suspende la ejecucin 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 despus de una comando, enva el proceso a una ejecucin 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 operacin realizar el shell, las options y arguments aaden preferencias. Muchas veces el command especica 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 administracin 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. Carcter * ? [ abc ... ] [a-z] [ ! abc ... ] [ ! a - z] ~ ~userID ~+ ~Signicado Empareja una cadena de cero o mas caracteres Empareja exactamente un carcter Empareja uno de los caracteres especicados Empareja los caracteres en el rango especicado Empareja caracteres que no concuerdan con los especicados Empareja caracteres que no concuerdan con el rango especicado El nombre del usuario actual El nombre del usuario especicado El directorio de trabajo actual El directorio de trabajo anterior
3.
Alias
Facilita el uso de comandos permitiendo nombres abreviados para los comandos y sus argumentos comnmente usados.
alias name=commando options arguments
Donde command especica el comando para el cual se desea crear un alias. name especica el alias.
alias dir=ls -l alias fm=mount -t vfat /dev/fd0 /mnt/floppy alias fu=umount /mnt/floppy
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.
Si se invoca el comando sh sin argumento que nombre a un script, se lanza una instancia del sesin anterior use el comando exit. Para facilitar la ejecucin del script cambie el acceso de ejecucin:
chmod ugo+x deleter ./deteler PATH/deleter deleter
SHELL
para retornar a la
Para ejecutar desde el directorio de trabajo. Para ejecutar siguiendo su ruta absoluta o relativa. Para ejecutar siguiendo la ruta de bsqueda.
Linux incluye varios script estndares que pueden ser ejecutados dependiendo del momento. /etc/prole ~/.prole ~/.bashrc Ejecutado cuando el usuario inicia sesin Ejecutado cuando el usuario inicia sesin. Ejecutado cuando el BASH es lanzado.
5.
Redireccionamiento
El SHELL proporciona tres ujos estndares: El ujo estndar de entrada El ujo estndar de salida El ujo estndar de errores
Por defecto, los programas leen su entrada desde el ujo stdin y escribe su salida al ujo stdout. Porque ambos ujos son normalmente asociados a las consolas (teclado y pantalla de consola respectivamente). El ujo stderr es asociado a la pantalla de la consola. Aunque el SHELL asocia por defecto los tres ujos de entrada/salida con la consola, se pueden especicar redirectores de entrada/salida que por ejemplo asocie una entrada o una salida con un archivo. > le 2> le > > le 2> > le &> le < le < < text Redirecciona el ujo de salida estndar al archivo especicado. Redirecciona el ujo de error estndar al archivo especicado. Redirecciona el ujo de salida estndar al archivo especicado, aadiendo salida al archivo si el archivo existe. Redirecciona el ujo de error estndar al archivo especicado, aadiendo salida al archivo si el archivo existe. Redirecciona el ujo de salida y error estndar al archivo especicado. Redirecciona el ujo de entrada estndar al archivo especicado. Lee el ujo de entrada estndar hasta encontrar el patrn text, en cuyo es interpreta como el nal del ujo.
cmd1 | cmd2 Se toma la entrada estndar del cmd2 desde la salida estndar de cmd1 (tambin conocido como canal de redireccin) Que hacen los comandos: 3
Muchos programas son escritos de modo que ignoren la redireccin. Por ejemplo el comando passwd. espera leer la contrasea nicamente desde la consola, no desde un archivo. Muchos programas Linux leen su entrada desde el ujo stdin y escriben su salida al ujo stdout, estos programas son denominados ltros. Estros programas pueden ser usados en conjunto para realizar complejas operaciones. La herramienta para combinar los ltros 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 programacin 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 HOME
La vista X a ser usada: por ej. localhost:0 La ruta absoluta del home del usuario.
HOSTNAME El nombre del equipo. LOGNAME MAIL PATH SHELL TERM USER El alias del usuario. La ruta absoluta del buzn de correo del usuario. La ruta de bsqueda. La ruta absoluta del actual SHELL. El nombre del terminal. El nombre del usuario; diere del login si se ejecuto el comando su.
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= unset Variable
7.
La ruta de Bsqueda
La variable de entorno PATH contiene una serie de rutas separadas por : conocida como ruta de bsqueda. Cuando se invoca a un comando externo el SHELL usa la ruta de bsqueda para hallar el nombre de archivo que corresponde al comando. Los scripts de inicio establecen los valores iniciales para PATH, para modicar su valor redena la aadiendo al valor anterior las nuevas rutas:
PATH=${PATH}:/home/user
El comando which verica la ruta de bsqueda para el argumento indicado e imprime la ruta del nombre encontrado si existe.
which wc
8.
Entrecomillado
Permiten la correcta interpretacin 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. Adems 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 carcter es interpretado literalmente. Se ignora los metacaracteres.
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 histrica. Pero el SHELL tiene caractersticas que extienden sus capacidades como la de incluir un lenguaje de programacin que proporciona el procesamiento de argumentos, condiciones, lgicas, bucles, subprogramas y recursividad.
9.
Procesando Argumentos
Cuando se llama a un programa (comando) se aade informacin adicional por ejemplo:
ls -l /tmp
este comando tiene dos parmetros: 1) -l 2) /tmp Los parmetros dentro de un script se recuperar con las variables especiales: $1, $2, ..., $9. Adems: $# Indica el numero de parmetros pasados al script. 5
$0
$1,$2,...,$9 Cada uno de los argumentos. $* $@ $? $$ Cadena con todos los parmetros, tratado como una palabra simple. Cadena con todos los parmetros, tratado como una serie de palabras. Cdigo de salida del comando previo. Un valor 0 seala que termino sin errores. El identicador de proceso.
Advierta que el shell le proporciona variables para acceder solo a nueve argumentos. Para acceder al resto de parmetros use el comando shift que descarta el primer parmetro y desplaza la lista hacia la izquierda. La variable $? contiene un cdigo de salida numrico del anterior comando. Por convencin un cdigo de 0 denota un termino sin errores; en cambio otros valores indican condiciones de error. Un script puede terminar indicando un cdigo de nalizacin con el comando:
exit status
donde status es un entero no negativo que indica el cdigo de salida. Invoque el siguiente script con dos parmetros
#!/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
Comparacin de cadenas: s1 = s2 s1 != s2 -n s1 -z s1 Para comparar si dos cadenas son iguales. Para comparar si dos cadenas no son iguales. Para evaluar si la longitud de la cadena es mayor que cero. Para evaluar si la longitud de la cadena es cero.
Comparacin numrica: n1 -eq n2 n1 -ge n2 n1 -le n2 n1 -ne n2 n1 -gt n2 n1 -lt n2 igual que mayor o igual que menor o igual que no es igual que mayor que menor que
Operadores de archivos: -e le -d le -f le -c le -b le -r le -s le -w le -x le -h le f1 -nt f2 f1 -ot f2 existe existe y es directorio existe y es archivo existe y es un archivo de dispositivo de caracteres existe y es un archivo de dispositivo de bloques existe y tiene permiso de lectura existe y tiene longitud mayor a cero existe y tiene permiso de escritura existe y tiene permiso de ejecucin existe y es un enlace el archivo f1 es mas reciente que f2 el archivo f1 es mas antiguo que f2
Operadores lgicos: ! -a -o el operador NOT, invierte el valor de la siguiente condicin . el operador lgico AND el operador lgico OR
El comando interno let exige que no se incluyan espacios entre los operandos y operadores; en cambio el comando externo expr exige espacios. Operadores matemticos let ++ - * /% < <= > >= == != &^|~ << > && || ! = *= /= %= += -= < <= >= &= ^= |= Operadores matemticos expr + - * /% < <= > >= = != &| suma, resta, multiplicacin divisin y resto comparaciones: menor que, menor o igual que, mayor que, mayor o igual que, igual, diferente operadores lgicos AND y OR 7 incremento y decremento suma, resta, multiplicacin divisin 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 lgicos AND, OR y NOT asignaciones
"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";;
Se utiliza para salir de un script, puede tener ser acompaado de un parmetro de salida. 9
18. Funciones
Cuando se invoca a un subprograma: func param1 param2 param 3 un subprograma puede analizar los parmetros pasados de forma idntica a alas de un guin. 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>
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
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