Sunteți pe pagina 1din 62

1

La shell bash

Captulo 1 Introduccin a Bash Conceptos clave


La shell por defecto en Red Hat Enterprise Linux es la shell bash. La shell bash se puede utilizar de modo interactivo o como un lenguaje de escritura de gran alcance. Tras el arranque, bash ejecuta comandos hallados en el archivo ~/.bashrc, permitindole a los usuarios personalizar su shell. La shell bash guarda el historial de las lneas de comando ejecutadas. La lneas de comando se pueden recuperar desde el historial mediante varias expansiones de historial que comienzan por "!".

La shell bash En Linux, la shell es el programa ms utilizado. La shell es lo que usted ve cuando inicia sesin o cuando abre una terminal y lo que ms usa para iniciar cada comando. Aunque hay una variedad de shells disponibles, todas siguen la misma conducta bsica: escuchar los comandos del usuario, iniciar procesos como se especifica en los comandos e informar los resultados al usuario. La shell ms utilizada en Linux es la shell bash, la cual es la shell por defecto en Red Hat Enterprise Linux. La shell bash no slo es de fcil uso para tareas sencillas, sino tambin tiene capacidades de gran alcance para facilitar tareas complejas o incluso hacerlas posibles. Esta eficacia trae consigo complejidad, solo basta con dar un vistazo a la pgina bash del manual (que tiene mas de 4.500 lneas) para convencerse. Este cuaderno presentar muchas de estas capacidades de gran alcance. Shells interactivas vs. Scripts de shell La shell bash est diseada para ser eficaz para dos tipos diferentes de uso. Usted ya est familiarizado con el uso del comando bash como una shell interactiva. Muchas de estas caractersticas de bash permiten a las personas escribir comandos de una manera ms fcil y eficaz y gran parte de este cuaderno se enfocar en estas habilidades. La shell bash tambin est diseada para ser un lenguaje de escritura de gran alcance. Los scripts de la shell bash son programas pequeos escritos mediante la misma sintaxis que se utiliza en la lnea de comandos. Los scripts de shell permiten a los usuarios automatizar las acciones repetidas al combinar una serie de comandos. A diferencia de las shells interactivas, los scripts de shell suelen ejecutar una serie de comandos de modo no interactivo y muchas de estas caractersticas de la shell bash proveen una programacin lgica (tales como ramas y bucles) para escribir scripts sofisticados. Al final de este cuaderno encontrar una introduccin a la escritura de shell.

La shell bash Al continuar a travs de este cuaderno, trate de tener en la mente estos dos usos diferentes de la shell bash. Algunas caractersticas de bash, tales como el historial de comandos, que pronto veremos, son casi intiles en los scripts de shell. Otros rasgos, tales como la sustitucin aritmtica, pueden no parecer tles en la lnea de comandos, pero pueden ser tiles en un script de shell. Si la utilidad de una caracterstica de un bash no es de inmediato obvia, trate de verla en otro contexto. Shells de inicio En la prctica, los usuarios a veces necesitan iniciar una shell de modo manual. Cada vez que alguien inicie sesin o abra una terminal, una shell se inicia automticamente. Sin embargo, a veces los usuarios desearan ejecutar una shell diferente u otra instancia de la misma shell. Dado que la shell es slo "otro programa", nuevas shells pueden iniciarse desde la shell existente. La nueva shell se denomina subshell de la shell original. Cuando se sale de la subshell, el control vuelve a la shell original. En el siguiente ejemplo, madonna inicia una subshell bash, lista los procesos desde dentro de sta para confirmar que las dos shells se estn ejecutando y luego sale de la subshell.
[madonna@station madonna]$ bash [madonna@station madonna]$ ps PID TTY TIME CMD 9750 pts/5 00:00:00 bash 9786 pts/5 00:00:00 bash 9814 pts/5 00:00:00 ps [madonna@station madonna]$ exit exit [madonna@station madonna]$

Cuando inicia una subshell bash, las diferencias aparentes entre la subshell y la shell padre son mnimas y se debe tener cuidado de seguir el rastro de la shell en la que se encuentra. El archivo ~/.bashrc Como parte de su inicializacin, la shell bash buscar en el directorio de inicio del usuario un archivo titulado .bashrc. El archivo se emplea para personalizar la shell bash. Cuando la shell inicia, los comandos listados en el archivo se ejecutan como si fueran escritos en la lnea de comandos. Tcnicamente, la shell bash "lee" el archivo. Los conceptos relacionados con la lectura de archivos y la inicializacin de shell se tratarn en detalle ms adelante. Aqu, presentaremos rpidamente este slo archivo para poder hacer uso de l en ejercicios posteriores. A continuacin, madonna edita su archivo ~/.bashrc agregndole el comando cal, para que tras el arranque la shell bash se presente un calendario del mes actual.
[madonna@station madonna]$ nano .bashrc ... (madonna appends a single line containing the command "cal") ... [madonna@station madonna]$ cat .bashrc

La shell bash
# .bashrc # User specific aliases and functions # Source global definitions if [ -f /etc/bashrc ]; then . /etc/bashrc fi cal

La usuaria madonna agreg esta nica lnea. Las lneas restantes se encuentran en un archivo por defecto ~/.bashrc de un usuario. Ahora, cada vez que madonna inicia una shell bash (por ejemplo, iniciando en una consola virtual o abriendo otra ventana de terminal), se presenta un calendario.
[madonna@station madonna]$ bash August 2003 Su Mo Tu We Th Fr Sa -*// 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 [madonna@station madonna]$ exit

Introducir Comandos Las shells interactivas repiten el ciclo de escuchar una lnea de comandos, evalan el comando solicitado, realizan todas las acciones solicitadas y muestran los resultados. La shell escucha al teclado de entrada y emplea la tecla de ENTER para reconocer el final de la entrada como en la siguiente ejecucin del comando echo.
[madonna@station madonna]$ echo "hello world" hello world

Historial de comandos Como conveniencia para los usuarios de shells interactivas, el comando shell bash mantiene el historial de cada uno de los comandos escritos por el usuario y ofrece una variedad de formas para hacer que los comandos desde este historial estn a su alcance. La forma ms fcil de ver el historial actual es mediante el comandohistory.
[blondie@station blondie]$ history 1 ls -l /home/ 2 ls -ln /home/ 3 exit 4 exit 5 id ... 167 mv rhyme stuff/

La shell bash
168 169 170 171 172 ls -Rli exit exit history

Como se muestra, el comando history entrega un historial de los comandos previamente escritos, con cada entrada precedida por un "nmero de historial". El comando history va hasta el final de la lista. Desde la lnea de comandos, las teclas de direccin ARRIBA y ABAJO atraviesan pronto la lista de arriba a abajo, mientras que las teclas de direccin IZQUIERDA y DERECHA movern el cursor para permitir al usuario editar un comando dado. Por ejemplo, si blondie quisiera luego ejecutar el comando ls -li, podra pulsar la tecla ARRIBA 5 veces y su intrprete de comandos llenara con el comando ls -Rli. Podra entonces pulsar dos veces la tecla de direccin IZQUIERDA y RETROCESO para suprimir R de la lnea de comandos seguido por la tecla ENTER. Mediante las teclas de flecha, los usuarios pueden rpidamente revisar, editar y ejecutar comandos tecleados anteriormente. Sustitucin de historial Como una alternativa a las teclas de direccin, la shell bash tambin realiza "sustitucin de historial", la cual se desencadena por el signo de exclamacin. El siguiente cuadro resume la sintaxis de sustitucin de historial ms utilizada. Table 1. Sustitucin de historial bash Sustitucin Sintaxis !! Comando anterior !n !-n !cmd Comando nmero n El comando ms reciente n El comando ms reciente que comienza por cmd

A manera de ejemplo de la sintaxis anterior, analice la siguiente salida (abreviada) cuando blondie ejecuta el comando history.
[blondie@station blondie]$ history ... 161 ls 162 ls -il 163 ln rhyme hard_link 164 ls -il 165 chmod 660 rhyme 166 ls -il 167 mv rhyme stuff/ 168 ls -Rli 169 exit 170 171 exit 172 history

La shell bash El siguiente cuadro lista lo que blondie escribira en la lnea de comandos y el comando resultante que ejecutara. Lnea de comandos Comando resultante
!! !165 !-5 !mv historial chmod 660 rhyme ls -Rli mv rhyme stuff/

Conservar el historial entre sesiones No slo el comando shell bash mantiene un historial de comandos dentro de una sesin, sino que tambin conserva los historiales de comandos entre sesiones. Cuando la shell bash sale, entrega el historial actual del comando dentro de un archivo llamado .bash_history en un directorio de inicio del usuario. Tras el arranque, la shell inicializa el historial de comandos desde el contenido de este archivo. Qu repercusin tienen estas shells interactivas mltiples (pertenecientes a un mismo usuario) al ejecutar al mismo tiempo? Puesto que el historial solo se ha guardado en el disco cuando la shell sale, los comandos ejecutados en un proceso bash no estn disponibles en el historial de comandos de un procesobash ejecutado simultneamente. Adems, la ltima shell al salir sobrescribir las historias de las shells que salieron anteriormente. Si est establecido as, las siguientes variables configuran los detalles de cmo se guarda el historial de comandos. Table 1. Variables del historial de comandos de shell bash Variable
HISTFILE

Valor predeterminado
~/.bash_history

Efectos El archivo en el cual el historial de comandos se guarda al salir y desde el cual se inicializa al arrancar. El archivo HISTFILE se truncar a este tamao en el arranque. El nmero mximo de comandos que se escribrirn al salir en el archivoHISTFILE.

HISTFILESIZE HISTSIZE

1000 1000

Trucos del historial de comandos La shell bash ofrece muy pocas tcnicas para acceder previamente los comandos tecleados (o elementos del mismo).

La shell bash ESC-. y ALT-. El ltimo smbolo de la lnea de comandos tecleados anteriormente puede recuperarse con cualquiera de las dos secuencias de teclas mencionadas anteriormente. Una vez aprendido, este truquito suele ser muy til. El ltimo simbolo de un comando suele representar el objeto que alguien est manipulando. Por ejemplo, alguien podra hacer un directorio y enseguida ejecutar cd en ste o editar un archivo e inmediatamente querer utilizar chmod para cambiar sus permisos. Si la secuencia clave se repite, la shell bash continuar el ciclo a travs de los ltimos smbolos de las primeras lneas de comando. CTRL-R Esta secuencia clave imita a !cmd en espritu. El texto tecleado despus de CTRL-R coincide con los comandos tecleados anteriormente con la ventaja de que las lneas de comandos coincidentes se ven de modo inmediato al teclear el texto. Usted tambin tiene la oportunidad de editar la lnea recuperada (utilizando las teclas de direccin IZQUIERDA y DERECHA u otros golpes de teclado de edicin de lneas de comando) antes de ejecutar el comando. fc El comando fc permite a los usuarios "arreglar" el comando escrito anteriormente al abrir el editor por defecto del usuario (por defecto vi) con el comando anterior escrito como texto. Tras salir del edtor (presumiblemente despus de editar de alguna forma el comando), el nuevo texto se ejecutar de inmediato. Para aquellos expertos en salir del editor rpidamente, el comando es muy til. Ejemplos Uso del historial de comandos para acortar el ciclo "editar/compilar/ejecutar" Con frecuencia, los programadores de lenguajes compilados tales como C suelen hallarse en un ciclo repetitivo: editar un archivo, compilarlo y luego ejecutar el programa. A continuacin, madonna edita un archivo que contiene un programa pequeo C y luego lo compila con el compilador C gcc. Despus de ejecutar el programa, decide hacer algunos cambios. Hace entonces uso del historial de comandos para agilizar el proceso.
[madonna@station madonna]$ nano hello.c [madonna@station madonna]$ cat hello.c #include "stdio.h" int main(void) { printf("hello world\n"); return 0;

La shell bash
} [madonna@station madonna]$ gcc -o hello hello.c [madonna@station madonna]$ ./hello hello world [madonna@station madonna]$ !n nano hello.c (... madonna edits the file, replacing the string "hello world" with "hello dolly" ...) [madonna@station madonna]$ !c cat hello.c #include "stdio.h" int main(void) { printf("hello dolly\n"); return 0; } [madonna@station madonna]$ !g gcc -o hello hello.c [madonna@station madonna]$ !. ./hello hello dolly

Observe que la shell bash imprime el comando seleccionado desde el historial de madonna antes de ejecutar el comando. Uso de ESC. Ahora madonna quisiera crear un subdirectorio bin, establece sus permisos para que slo ella pueda acceder a ste y mover su archivo ejecutable hello en l. Usa la secuencia de teclas ESC-. para agilizar el proceso.
[madonna@station [madonna@station [madonna@station [madonna@station hello madonna]$ madonna]$ madonna]$ madonna]$ mkdir bin chmod 700 <ESC-.> mv hello <ESC-.> ls <ESC-.>

Quizas no es el ejemplo ms interesante porque bin es un directorio muy pequeo para teclear de todas maneras. Sin embargo, si hubiera sido el directorio /usr/lib/perl5/ven or_perl/5.8.0/HTML/, los golpes de teclado grabados seran impresionantes. Inhibicin del historial de comandos Madonna es desconfiada y preferira que su historial de comandos fuera almacenado en el disco al salir de la shell. Suprime su archivo del historial y crea un enlace blando con el mismo nombre que apunta al nodo de dispositivo /dev/null.
[madonna@station madonna]$ rm .bash_history

La shell bash
[madonna@station madonna]$ ln -s /dev/null .bash_history [madonna@station madonna]$ ls -l .bash_history lrwxrwxrwx 1 madonna madonna 9 Aug 26 16:35 .bash_history -> /dev/null [madonna@station madonna]$ cat .bash_history [madonna@station madonna]$

Madonna ahora puede usar el historial de comandos de bash para recuperar los comandos utilizados en la shell actual, pero ningn historial de comandos se almacenar entre las instancias de shell. Ejercicios en lnea Lab Exercise Objetivo: Personalizar su archivo ~/.bashrc para mantener un registro de cundo se inician las shells. Estimated Time: 10 mins. Especificaciones 1. Use un editor de texto para modificar el archivo .bashrc desde su directorio de inicio, agregando la siguiente lnea al final del archivo.
2. date >> .bash_timestamps

3. Observe el archivo .bash_timestamps, y confirme si se agrega una nueva marca de tiempo cada vez que inicia una nueva shell bash. 4. De nuevo, mediante un editor de texto, agregue una lnea de comentario a su archivo .bashrc que describa brevemente por qu el comando de fecha fue agregado e incluya su nombre de usuario como la persona que hizo la modificacin. Deliverables A title Question 1

1. En su directorio de inicio, un .bashrc modificado que agregue una marca de tiempo al archivo .bash_timestamps cada vez que se inicie una shell bash. 2. El archivo .bashrc debe tambin contener una lnea de comentario que incluya su nombre de usuario.

La shell bash Captulo 2 Listas de comandos y scripts Conceptos clave


Comandos mltiples se pueden separar con un ;. Tras la salida, cada comando devuelve un entero a su padre denominado valor de retorno. La variable de shell $? se expande al valor de retorno de un comando ejecutado previamente. && y || separan condicionalmentecomandos mltiples.

Ejecucin de comandos mltiples La shell bash permite a los usuarios unir comandos mltiples en una sola lnea de comandos separando los comandos con un ;. (en ingls es igual; las frases independientes se separan con un punto y coma). Veamos un ejemplo:
[elvis@station applnk desktop-menus Xmodmap fs Xresources gdm xserver lbxproxy [elvis@station elvis]$ cd /etc/X11; ls prefdm sysconfig proxymngr twm rstart serverconfig starthere X11]$ X xdm xorg.conf xorg.conf.backup xorg.conf.wbx xorg.conf.works XftConfig.README-OBSOLETE xinit xsm xkb

El efecto es idntico al escribir comandos en lneas separadas.


[elvis@station [elvis@station applnk desktop-menus Xmodmap fs Xresources gdm xserver lbxproxy [elvis@station elvis]$ cd /etc/X11 X11]$ ls prefdm sysconfig proxymngr twm rstart serverconfig starthere X11]$ X xdm xorg.conf

xorg.conf.backup xorg.conf.wbx xorg.conf.works XftConfig.README-OBSOLETE xinit

xkb

xsm

La nica diferencia entre los dos enfoques es que no se tiene la oportunidad de examinar el efecto del primer comando antes de que el segundo comando se ejecute. Muy pocas veces existe la necesidad real de ejecutar comandos mltiples desde una solo lnea de comandos, pero suele ser conveniente combinar los comandos. Ejecucin de comandos en una subshell

10

La shell bash La shell bash permite a los usuarios la fcil ejecucin de comandos en una subshell, delimitando el comando entre parntesis. Considere el siguiente ejemplo:
[elvis@station applnk desktop-menus Xmodmap fs Xresources gdm xserver lbxproxy [elvis@station elvis]$ (cd /etc/X11; ls) prefdm sysconfig xorg.conf.backup proxymngr twm xorg.conf.wbx rstart serverconfig starthere elvis]$ X xdm xorg.conf xorg.conf.works XftConfig.README-OBSOLETE xinit xsm xkb

A primera vista, la conducta parece idntica a la del ejemplo anterior. Una mirada ms de cerca revela una diferencia sutil pero importante. En el primer ejemplo, cuando los comandos se separan apenas por un punto y coma, los comandos se ejecutan en la shell actual. El intrprete de comandos de bash revela que, despus de ejecutados los comandos, la shell del directorio de trabajo actual ha cambiado a /etc/X11 como resultado del comando cd. En el ejemplo anterior, al delimitar los comandos entre parntesis, el directorio de shell actual no cambia. Cuando bash encuentra un parntesis en la lnea de comandos, ste genera un nuevo proceso hijobash (llamado subshell) y ejecuta los comandos dentro de la subshell. Despus de ejecutarlos, la subshell sale y el usuario queda en la shell original (shell sin cambios). El efecto es parecido a la siguiente secuencia de comandos.
[elvis@station [elvis@station applnk desktop-menus Xmodmap fs Xresources gdm xserver lbxproxy [elvis@station exit [elvis@station elvis]$ bash elvis]$ cd /etc/X11; ls prefdm sysconfig proxymngr twm rstart serverconfig starthere X11]$ exit elvis]$ X xdm xorg.conf

xorg.conf.backup xorg.conf.wbx xorg.conf.works XftConfig.README-OBSOLETE xinit

xkb

xsm

La subshell se inicia manualmente al ejecutar el comando bash. Los comandos se ejecutan ahora en la subshell. Al terminar, se sale de la subshell. Ahora que elvis est de nuevo en su shell original, las modificaciones en la subshell (tales como el cambio en el directorio de trabajo actual) han quedado atrs. Por qu podra alguien desear ejecutar un comando en una subshell? Las subshells se utilizan para evitar efectos secundarios. Lo que suceda en la subshell no debera tener efecto en el entorno original de la shell (como en ingls, lo que est entre parntesis no debe cambiar la frase que lo rodea).

11

La shell bash Introduccin a los scripts de shell La clave para usar Red Hat Enterprise Linux de modo efectivo es la automatizacin. Un buen administrador de Linux debe ser en realidad extremadamente perezoso cuando se trata de hacer algo aburridor o repetitivo. Las secciones anteriores ilustraron la manera de encadenar comandos para ejecutar de modo consecutivo o simultneo en lugar de esperar a que el comando termine antes de teclear el prximo. Tambin le introdujeron a las caractersticas del historial de bash y le mostraron cmo referirse a comandos tecleados previamente para que slo tenga que escribirlos una vez. Sin embargo, an falta una parte importante de la caja de herramientas del administrador del sistema: la escritura de scripts. Un script, en su forma ms simple, es un texto con una lista de comandos en l. Los comandos se envan a travs de un programa especfico llamado intrprete, el cual ejecuta un comando a la vez. Este intrprete suele ser la shell bash (conocida como /bin/bash o /bin/sh) y cada comando es un comando comn de Linux. Otros intrpretes permiten utilizar lenguajes de programacin de gran alcance como Perl, Python y Ruby. Antes de comenzar a escribir sus propios scripts hay algunas cosas importantes que recordar:

La primera lnea de su script debe especificar a qu intrprete enviar las instrucciones. Esto se hace con una cadena especial llamada "shebang" (pronunciada "shuh-bang"), la cual se ve as: #!. A la shebang le sigue un nombre de un intrprete para este script. As, por ejemplo, para usar bash como su intrprete usted debera usar #!/bin/sh o #!/bin/bash. La mayora de los scripts slo usan #!/bin/sh. Al referirse al intrprete como #!/bin/bash se habilitan otras caractersticas, pero se limita la compatibilidad del script con los sistemas antiguos de Unix y rara vez es necesario. Antes de ejecutar un script, usted debe habilitar el permiso "ejecutable" en l (de lo contrario, es slo un archivo de texto). El comando para esto es chmod u+x <scriptname>. Le otorga (y slo a usted) permiso para ejecutar este script justo como usted hara con otro comando. El comando chmod se tratar en detalle ms adelante en esta clase. Si cre un script llamado foo.sh en su directorio de inicio y justo despus tecle foo.sh obtendra el mensaje de error "no existe tal directorio o archivo". Esto se debe a que cuando teclea un comando hay una serie de directorios en donde Linux busca ese comando. Estos directorios se conocen colectivamente como su RUTA y, por razones de seguridad, su RUTA nunca incluye el directorio actual. Para resolver este problema tiene dos alternativas: 1. Usted puede especificar de modo explcito la ubicacin del script al teclear ~/foo.sh o ./foo.sh ("." siempre se refiere al directorio actual). 2. Puede colocar el script en un directorio que sea parte de su RUTA. Los usuarios que no son root no tienen permiso para colocar archivos en la mayora de estos directorios, pero todos los usuarios tienen un bin personal, al cual pueden escribir en su directorio de inicio. Por lo tanto,

12

La shell bash si foo.sh fuera movido a ~/bin se podra ejecutar al teclear simplemente foo.sh en la lnea de comandos. Esta es la tcnica preferida. aprender ms acerca de la RUTA en captulos siguientes. Veamos un simple ejemplo. Suponga que usted es un administrador que necesita ver con frecuencia qu usuarios han iniciado sesin en el sistema. Esta informacin puede obtenerse al ejecutar el comando w (s, eso es todo) pero mientras esto proporciona un buen resumen de quin ha iniciado sesin, no imprime la hora en la que se tom esta instantnea de la actividad del usuario. Otro comando, llamado date imprime la fecha y hora actual, pero no la informacin del usuario. Si solo usted pudiera combinar esos dos comandos... Suponga que cre un script llamado wdate.sh en su directorio personal bin:
[student@station ~]$ cat ~/bin/wdate.sh #!/bin/sh date w [student@station ~]$ chmod u+x ~/bin/wdate.sh [student@station ~]$ wdate.sh
Thu Jul 14 12:13:54 PDT 2005 12:13:54 up 2 days, 12:50, 8 users, USER TTY FROM student_a tty1 student tty2 :0.0 /bin/sh/home/student/bin/wdate.sh load average: 0.35, 0.27, 0.18 LOGIN@ IDLE JCPU PCPU WHAT Mon23 ?xdm? 2:43m 3.06s /bin/bash Tue17 0.00s 2.19s 0.00s

[student@station ~]$

Observe que el script haba sido colocado en ~/bin y era ejecutable antes de ejecutarse como un comando normal. Al ejecutar date seguido por w, nos da dos comandos por el precio de uno! Obviamente, este script podra luego modificarse para ejecutar un nmero arbitrario de comandos seguidos. De hecho, los scripts pueden ser mucho ms eficaces que apenas una lista de comandos y pueden ser programas complejos en su propio derecho. El material complementario de esta leccin describe tcnicas avanzadas para scripts y pueden habilitarse a discrecin de su instructor. Por ahora, concntrese en dominar los scripts bsicos como una valiosa tcnica de almacenamiento. La regla de oro del administrador es que si usted tiene que hacer una tarea ms de dos veces,haga un script! Valores de retorno Cada proceso en Linux tiene un ciclo de vida. Todos los procesos comienzan a solicitud de otro proceso (a menudo shell). El proceso solicitado se denomina padre, y el proceso recin nacido el hijo. El proceso hijo suele realizar sus deberes (incluyendo generar sus propios hijos), y luego elige morir. Un proceso de salida deja atrs una pequea parte de informacin cuando muere, llamado el valor de retorno del proceso o estatus de salida. El proceso padre es responsable de reunir los valores de retorno de los hijos muertos.

13

La shell bash Los valores de retorno vienen en forma de enteros los cuales van de 0 a 255. Los programas pueden escoger lbremente el valor al salir [1]. A menudo, lo que significan las implicaciones por valores de retorno son parte de una interfaz de un programa bien definido y estn documentadas en la pgina man del programa, (si no est familiarizado con el comandodiff, la seccin de "DIAGNSTICO" de su pgina del manual ofrece un ejemplo). Una convencin de Linux (y Unix) es que un programa devuelve en 0 para implicar "xito" en lo que estaba intentando hacer, y un valor de retorno de no cero que implica algun tipo de error. La shell bash almacena el valor de retorno del comando ejecutado anteriormente en una variable especial llamada ?. Infortunadamente, no hemos descrito an todas las variables de shell (eso sigue luego), pero observemos que el valor de esta variable (por ejemplo, el valor de retorno del programa ejecutado antes), puede examinarse con el comando echo $?. En el siguiente ejemplo, el comando ls se utiliza para examinar los permisos del archivo /etc/passwd. Dado que el comando "funciona", el comando ls devuelve un valor de retorno de 0.
[elvis@station elvis]$ ls -l /etc/passwd -rw-r--r-1 root root 3694 Aug 15 16:26 /etc/passwd [elvis@station elvis]$ echo $? 0

En contraste, los siguientes ejemplos muestran cmo responde el comando ls al listar un archivo que no existe.
[elvis@station elvis]$ ls -l /etc/password ls: /etc/password: No such file or directory [elvis@station elvis]$ echo $? 1

Dado que el comando "no funcion", devolvi un valor de retorno de 1. Devolver un 0 de xito y un 1 cuando se presenta cualquier tipo de error, es una conducta normal. Si una pgina man del programa no menciona otra cosa, generalmente se puede asumir esta conducta. Ejecucin de comandos mltiples de modo condicional La shell bash usa &&y || para unir dos comandos de modo condicional. Cuando los comandos se unen de este modo, el primero siempre se ejecutar. El segundo comando puede que se ejecute o no dependiendo del valor de retorno del primer comando. Por ejemplo, un usuario puede desear crear un directorio y luego mover un nuevo archivo dentro de ese directorio. Si la creacin del directorio fracasa, entnces no hay razn para mover el archivo. Los dos comandos pueden acoplarse de la siguiente forma.
[elvis@station elvis]$ echo "one two three" > numbers.txt [elvis@station elvis]$ mkdir /tmp/boring && mv numbers.txt /tmp/boring [elvis@station elvis]$ ls

14

La shell bash Al acoplar los dos comandos con &&, el segundo comando slo ejecutar el primer comando que tuvo xito (por ejemplo, tuvo un valor de retorno de 0). Esto es similar a la operacin "and" que se encuentra en varios lenguajes de programacin. En el ejemplo anterior, el comando mkdir tuvo xito y luego el archivo se movi. Qu sucedera si el comando mkdir fracasara?
[elvis@station elvis]$ echo "one two three five seven eleven" > primes.txt [elvis@station elvis]$ mkdir /tmp/mostly/boring && mv primes.txt /tmp/mostly/boring mkdir: cannot create directory `/tmp/mostly/boring': No such file or directory [elvis@station elvis]$ ls primes.txt

Dado que el comando mkdir fracas (el directorio /tmp/mostly no exist, por lo tanto el directorio /tmp/mostly/boring no se pudo crear), bash no trat de ejecutar el comando mv. Igualmente, los comandos mltiples pueden combinarse con ||. En este caso, bash ejecutar el segundo comando slo si el primer comando "fracasa"(tiene un valor de retorno diferente a cero). Esto es igual al operador "or" que se encuentra en lenguajes de programacin. En el siguiente ejemplo, elvis intenta cambiar los permisos en un archivo. Si el comando fracasa, un mensaje para ese efecto se imprime en la pantalla.
[elvis@station elvis]$ chmod 600 /tmp/boring/numbers.txt || echo "chmod failed." [elvis@station elvis]$ chmod 600 /tmp/mostly/boring/primes.txt || echo "chmod failed" chmod: failed to get attributes of `/tmp/mostly/boring/primes.txt': No such file or directory chmod failed

En el primer caso, el comando chmod tuvo xito, y no se imprimi ningn mensaje. En el segundo caso, el comando chmod fracas (porque el archivo no exista) y apareci el mensaje "chmod failed" (aparte del mensaje de error estndar de chmod). Ejemplos Echoing $? twice El usuario elvis acaba de aprender sobre los valores de retorno, y est examinando los valores de retorno de varios comandos. Despus de ejecutar (sin xito) el comando ls, encuentra que, como era de esperar, la variable de bash ? contiene 1. Al examinar la variable otra vez, se da cuenta que ahora contiene un 0. Qu hizo cambiar el valor?
[elvis@station elvis]$ ls -l /etc/password ls: /etc/password: No such file or directory [elvis@station elvis]$ echo $? 1 [elvis@station elvis]$ echo $?

15

La shell bash
0

Recuerde que la variable de bash ? contiene el valor de retorno de los comandos ejecutados ms recientemente. En el primer caso, ste contena el valor de retorno (sin xito) del comando ls. En el segundo caso, ste contena el valor de retorno del comando echo (con xito). Visualizacin de recordatorios El usuario ahora quiere desarrollar un esquema en donde pueda dejar recordatorios y que automticamente aparezcan al iniciar una shell. Crea un archivo en el directorio de inicio llamado reminders con el texto brush your teeth y agrega la siguiente lnea a su archivo ~/.bashrc.
cat /home/elvis/reminders

Luego prueba su configuracin de modo manual iniciando una nueva shell bash.
[elvis@station elvis]$ echo "brush your teeth" > reminders [elvis@station elvis]$ nano .bashrc [elvis@station elvis]$ cat .bashrc # .bashrc # User specific aliases and functions # Source global definitions if [ -f /etc/bashrc ]; then . /etc/bashrc fi cat reminders [elvis@station elvis]$ bash brush your teeth [elvis@station elvis]$ exit exit [elvis@station elvis]$

Todo parece funcionar bien, hasta que elvis sigue su consejo de limpieza y borra su archivo reminders. La prxima vez que inicia una shell se encuentra con lo siguiente:
[elvis@station elvis]$ bash cat: reminders: No such file or directory [elvis@station elvis]$

Dndose cuenta que le gustara ejecutar el comando cat slo si el archivo reminders existe, edita la lnea que agreg a su archivo .bashrc con lo siguiente:
ls reminders > /dev/null && cat reminders

16

La shell bash Ahora el comando cat slo se ejecutar si el comando ls tiene xito, porque el archivo reminders existe, (hay una mejor forma de hacer esto? S, pero an no hemos aprendido lo suficiente para hacerlo.) Ejercicios en lnea Lab Exercise Objetivo: Ejecutar comandos dentro de una subshell. Estimated Time: 10 mins. Especificaciones 1. Agregue una sola lnea al final del archivo .bashrc en su directorio de inicio. La lnea debe ejecutar los comandos cd /usr y ls en una sola subshell , (al ejecutarla, el directorio de trabajo actual de su shell no se afectar.) Si se implementa correctamente, al iniciar una nueva shell debera ver una salida similar a la siguiente:
[elvis@station elvis]$ bash bin etc include lib dict games kerberos libexec [elvis@station elvis]$ local sbin share src tmp X11R6

Deliverables A title Question 1

1. Un archivo ~/.bashrc cuya ltima lnea ejecute los comandos cd /usr y ls en una sola subshell.

Limpieza Una vez obtenga la calificacin, restaure su archivo ~/.bashrc al estado original. Captulo 3 Variable de bash Conceptos clave

Las variables de la shell se asignan mediante una sintaxis A=apple. Las variables se examinan ("desreferencian") con el caracter $ como en echo $A.

17

La shell bash

En el nivel de kernel, cada proceso tiene una coleccin de variables de entorno que los procesos hijos heredan. El comando export convierte una variable de shell en una variable de entorno. Los comandos set y env listan las variables de shell y las variables de entorno, respectivamente.

Conceptos bsicos de la variable de shell La shell bash le permite a los usuarios establecer y hacer referencia a las variables de shell. Una variable de shell es simplemente un valor con nombre que la shell recuerda. Las variables de shell se pueden utilizar en comandos y scripts de shell y pueden tambin referenciarse en programas como opciones de configuracin. Por ejemplo, el cliente de correo electrnico mutt ejecuta un editor externo al escribir un mensaje. Por defecto este editor esvi. Sin embargo, antes de ejecutar vi comprobar si una variable llamadaEDITOR se ha establecido. Si se ha establecido, entonces el comando definido por EDITOR se utiliza en lugar de vi. La mayora de los programas que lanzan editores externos funcionan del mismo modo. Hay dos tipos de variables de shell: variables locales y variables de entorno. Una variable local existe solo dentro de la shell en la cual se crea. Las shells hijas heredan las variables de entorno como cuando se lanza una terminal despus de iniciar sesin. Primero, veremos cmo definir una variable local, luego hablaremos acerca de cmo definir variables de entorno incluyendo la bash misma. El configurar las variables locales es bastante sencillo. En el siguiente ejemplo, prince establecer la variable A con el valor apple.
[prince@station prince]$ A=apple

Si usted sigue, asegrese de no dejar ningn espacio a los lados del signo =. Ahora la shell se "cuelga"a esta asociacin por todo el tiempo que exista la shell (o hasta que se anule explcitamente, ver a continuacin). Cada vez que prince quiera usar el valor "apple", puede usar la variable A en su lugar, iniciando la variable con el signo ($), como en el comando echo mostrado abajo. Esto se llamadesreferenciar la variable A.
[prince@station prince]$ echo $A apple

La variable se puede utilizar en cualquier parte de la lnea de comandos (o en los scripts de shell). Qu sucede si prince, en lenguaje colorido, decidiera escribir unas cuantas lneas acerca de las manzanas (o apples en ingls) y las almacenara en un archivo llamado ode_to_apple.txt. La siguiente lnea podra ayudarlo a empezar:
[prince@station prince]$ echo "Oh, I like them squishy" >> ode_to_$A.txt [prince@station prince]$ ls

18

La shell bash
ode_to_apple.txt

Cuando la shell bash examin la lnea de comandos, remplaz $A por apple. Estos son los conceptos bsicos de las variables de shell. Las variables se establecen y se configuran con una sintaxis VAR=valor y se desreferencian con una sintaxis $VAR. Detalles de la variable de shell Qu puede utilizarse como nombres de variables? Los nombres de variables pueden ser cualquier cadena de caracteres alfanumricos (A-Z, a-z, 0-9), y el guin bajo (_), pero no pueden comenzar por un nmero. Las variables de shell distinguen maysculas de minsculas, como se muestra a continuacin.
[prince@station prince]$ B=banana [prince@station prince]$ echo $B is my favorite fruit banana is my favorite fruit [prince@station prince]$ echo $b is my favorite fruit is my favorite fruit

En el primera impresin en pantalla, $B fue remplazado por el valor banana. Cmo fue desreferenciado $b? Si se le pide a la shell desreferenciar una variable no establecida, sta remplaza la referencia de la variable con una cadena vaca (en otras palabras, con nada). Dado que b se considera como una variable diferente a B, y que la variable b nunca ha sido asignada, la shell remplaza la referencia $b con nada. Por protocolo, las variables suelen definirse con maysculas, pero esto no es ms que protocolo. Cul puede ser el valor de la variable? Cualquier cosa. El truco se presenta en la asignacin. Cuando se asignan las variables, la sintaxis es nombre=valor, sin dejar espacios. Qu sucedera si prince quisiera que la variable FRUIT apuntara a la frase mushy bananas?
[prince@station prince]$ FRUIT=mushy bananas -bash: bananas: command not found

Nos hemos tropezado con una sintaxis avanzada para configurar las variables, es decir nombre=valor comando, el cual establece la variable name slo para la ejecucin del comando especificado. La shellbash obedientemente estableci la variable FRUIT en el valor mushy y fue a ejecutar el comando bananas, con resultados esperables. Pero esto no es lo importante, lo importante es que si quiere establecer una variable a un valor que contenga espacios, debe incluir el valor entre comillas.
[prince@station prince]$ FRUIT="mushy bananas" [prince@station prince]$ echo $FRUIT is my favorite fruit mushy bananas is my favorite fruit

Con esta modificacin, prince obtiene la conducta correcta desde la shell bash, si no la gramtica inglesa correcta.

19

La shell bash Cuando se desreferencian las variables, el nombre de la variable puede marcarse con corchetes {}, si es necesario. Por ejemplo, qu sucedera si arriba, prince hubiera querido guardar su poema dentro de un archivo llamado apple_ode.txt? El ensaya el primer mtodo obvio, en el mismo directorio como se muestra arriba.
[prince@station prince]$ echo $A apple [prince@station prince]$ echo "Oh, I like them squishy" > $A_ode.txt [prince@station prince]$ ls ode_to_apple.txt

Dnde est el archivo apple_ode.txt? Un par de cosas han conspirado contra prince. Primero, la shell bash desreferenci el nombre correcto de variable, pero no el que prince quera. De qu puede estar compuesta una variable? De caracteres alfanumricos y minsculas. La shell bash apunt a la variable (sin inicializar) A_ode (a nada) y cre el archivo resultante .txt. En segundo lugar, debido a que .txt comienza por un ., es un "archivo oculto", as como ls -a lo revela.
[prince@station prince]$ ls -a . .bash_profile .gtkrc .. .bashrc .kde .bash_history .gnome-desktop ode_to_apple.txt .bash_logout .gnupg .pgpkey [prince@station prince]$ cat .txt Oh, I like them squishy .plan .txt .viminfo .xauthizv2EF

El usuario prince puede salir de esta situacin utilizando corchetes para delimitar el nombre deseado de la variable.
[prince@station prince]$ echo "Oh, I like them squishy" > ${A}_ode.txt [prince@station prince]$ ls apple_ode.txt ode_to_apple.txt

Utilizar corchetes para delinear nombres de variable siempre es correcto y en algunos casos, es necesario. Al terminar con una variable, la variable se puede desligar de su valor con el comando unset.
[prince@station prince]$ unset A [prince@station prince]$ echo $A [prince@station prince]$

Variables de Bash El siguiente cuadro lista algunas variables que se establecen automticamente con la shell bash. Estas variables son de slo lectura y no pueden ser configuradas por el usuario.

20

La shell bash Table 1. Variables Bash de slo lectura Variable ? $ ! _ PPID SHELLOPTS UID Se expande hasta El estatus de salida del comando ejecutado ms recientemente Opciones de banderas de la shell actualmente activadas Id (pid) del proceso de la shell actual Id (pid) del proceso del comando secundario ms reciente ltimo smbolo del comando anterior Id (pid) del proceso padre de la shell. Lista separada por comas de las opciones de shell actual como lo inform el comando set -o. El userid del usuario actual

Estas variables son establecidas por la shell para proveer informacin. Estas no se pueden reasignar por el usuario, as como prince lo descubre a continuacin.
[prince@station prince]$ echo $SHELLOPTS braceexpand:emacs:hashall:histexpand:history:interactivecomments:monitor [prince@station prince]$ SHELLOPTS=foo -bash: SHELLOPTS: readonly variable

Las siguientes variables son inicializadas por la shell bash, pero pueden ser reasignadas. Table 2. Variables Bash preasignadas Variable HOSTNAME OLDPWD PWD RANDOM SECONDS Se expande hasta El nombre del host DNS de la mquina actual El directorio de trabajo anterior The current working directory Un nmero aleatorio entre 0 y 32767 El nmero de segundos desde que la shell se inici

BASH_VERSION La versin actual bash

Variables de entorno El configurar y resolver variables debera ser bastante sencillo, (siempre y cuando se acuerde de los espacios). Ahora presentaremos un concepto un poco ms sutil y mucho ms til: variables de entorno. As como la shell bash permite asignar parejas de valores-nombre llamados variables de shell, el kernel de Linux permite a cualquier proceso definir las parejas nombre-valor

21

La shell bash llamadas variables de entorno. Estas variables son una parte del proceso almacenado en el kernel, simplemente como el id del proceso, el id del usuario y el directorio actual de trabajo son parte del proceso. Lo ms importante es que cada vez que se inicie un proceso (tal como la shell bash iniciando el comando ls), las variables de entorno son heredadas por el proceso hijo. Esto le permite a los usuarios utilizar la shell bash para crear o modificar una variable de entorno y luego todos los comandos iniciados por la shell heredarn esa variable. Cmo creamos variables de entorno dentro de la shell bash? Primero, una variable de shell se crea y luego la variable de shell es "promovida" a una variable de entorno mediante el comando export, (la variable ser luego exportada a cualquier proceso hijo futuro). Considere el siguiente ejemplo:
[prince@station prince]$ A=apple [prince@station prince]$ B=banana [prince@station prince]$ echo a:$A b:$B a:apple b:banana [prince@station prince]$ export A [prince@station prince]$ bash [prince@station prince]$ ps PID TTY TIME CMD 2251 pts/5 00:00:00 bash 2316 pts/5 00:00:00 bash 2342 pts/5 00:00:00 ps [prince@station prince]$ echo a:$A b:$B a:apple b: [prince@station prince]$ exit exit [prince@station prince]$ echo a:$A b:$B a:apple b:banana [prince@station prince]$ unset A B

El usuario prince ha creado dos variables de shell, A y B. La variable A se promueve a una variable de entorno con el comando export. El usuario prince inicia una subshell bash. Al ejecutar el comando ps, prince confirma que hay otras shells ejecutndose: el padre y el hijo (su shell actual). Dado que la variable A pasa a ser una variable de entorno, sta fue heredada por la shell hija del padre. Por el contrario, la shell hija no sabe nada de la variable de shell padreB. Cuando prince sale de la shell hija, vuelve a la shell padre, donde la variable B est an definida. Por ltimo, prince desenlaza tanto la variable de entornoA como la shell de entorno B con el mismo comando unset. Las variables de entorno suelen utilizarse para configurar comandos con informacin acerca de configuraciones locales o en otras palabras, la informacin acerca del entorno local. A manera de ejemplo, muchos comandos buscarn una variable de entorno

22

La shell bash llamada LANG para determinar el lenguaje del usuario y modificar su salida como corresponde.
[prince@station prince]$ echo $LANG en_US.UTF-8 [prince@station prince]$ date Fri Aug 1 11:54:24 EDT 2002 [prince@station prince]$ LANG=de_DE [prince@station prince]$ date Fre Aug 1 11:54:53 EDT 2002 [prince@station prince]$ LANG=es_ES [prince@station prince]$ date vie ago 1 11:55:09 EDT 2002

Al establecer la variable de entorno LANG para de_DE, la abreviatura habitual para el da "viernes" en alemn entonces se convierte en la abreviacin alemana por regla. Al establecer LANG como es_ES, los efectos son incluso ms obvios, puesto que las abreviaturas de los das y meses han cambiado al espaol (como tambin las convenciones de las maysculas). Un punto importante que merece reformularse. El comando date no cambi la conducta porque el comando bash tena una variable de entorno denominada LANG (directamente). El proceso al ejecutar el comando date modific su salida porque tena su propia variable de entorno llamada LANG. Esto simplemente sucedi para heredar esta variable de la shell bash. Todos los procesos tienen variables de entorno, no slo shells. Por qu prince no tuvo que exportar explcitamente la variable LANG? La variable ya es una variable de entorno configurada por los scripts de arranque. Una vez que una variable es una variable de entorno, se puede modificar ( y suprimir) mediante la misma sintaxis de las variables de shell. A menudo, los usuarios utilizan una sintaxis ms corta para crear y exportar una variable de entorno:
[prince@station prince]$ export EDITOR=nano

Con este slo comando, prince ha creado, asignado y exportado la variable EDITOR. Listado de variables Examinar variables con set y env La shell bash provee dos comandos para listar variables definidas. El comando set, sin argumentos, lista las variables de shell y las variables de entorno asociadas con la shell, mientras que el comando env, otra vez sin argumentos, lista slo variables que han sido exportadas al entorno.
[prince@station prince]$ set BASH=/bin/bash

23

La shell bash
BASH_VERSINFO=([0]="2" [1]="05b" [2]="0" [3]="1" [4]="release" [5]="i386-redhatlinux-gnu") BASH_VERSION='2.05b.0(1)-release' COLORS=/etc/DIR_COLORS.xterm COLUMNS=80 ... [prince@station prince]$ env HOSTNAME=localhost SHELL=/bin/bash TERM=xterm HISTSIZE=1000 USER=prince MAIL=/var/spool/mail/prince ...

Variables de entorno ms utilizadas El siguiente cuadro lista algunas variables de entorno que con frecuencia se utilizan para personalizar un entorno de usuario. Table 1. Variables de entorno ms utilizadas Variable
TERM PATH DISPLAY LANG EDITOR

Uso Especifica la configuracin de bajo nivel de la terminal del usuario. La variable es ms relevante al utilizar una consola de lnea serial ("terminal tonta") para acceder al sistema. Especifica los directorios para buscar archivos ejecutables en ellos. Especifica qu clientes del servidor X deberan usar el entorno grfico. Especifica el lenguaje preferido para los programas internacionalizados. Muchos programas dependen de un editor externo para la entrada de parte del usuario. A menudo, el editor por defecto es vi. Si la variable de entorno EDITOR est establecida, el editor especificado se utilizar en su lugar. La mayora de los comandos que envan o administran trabajos de impresin examinarn esta variable de entorno para determinar la impresora predeterminada.

PRINTER

Ejemplos Uso de variables para hacer referencia a las palabras ms utilizadas El usuario prince desea mantener al da los aspectos relacionandos con el software de Open Source y suele utilizar los enlaces de texto del navegador web links para visitar http://www.redhat.com/opensourcenow/key_issues.html. En lugar de teclear de modo repetitivo la URL, prince modifica su archivo ~/.bashrc, para que la URL sea almacenada en la variable OSNISSUES. Ahora prince puede referirse a la pgina web de un modo ms fcil.

24

La shell bash
[prince@station prince]$ vim .bashrc [prince@station prince]$ cat .bashrc # .bashrc # User specific aliases and functions # Source global definitions if [ -f /etc/bashrc ]; then . /etc/bashrc fi OSNISSUES=http://www.redhat.com/opensourcenow/key_issues.html [prince@station prince]$ bash [prince@station prince]$ links $OSNISSUES

Mediante http_proxy para definir un servidor Proxy HTTP Dado que prince est utilizando un computador sin conexin directa al internet, debe configurar su navegador de red para usar el servidor proxy encontrado en la direccin IP 10.1.1.1 y en el puerto 8080. Mientras trata de entender cmo establecer un servidor proxy para el navegador de texto links, se encuentra con lo siguiente en la pgina de manual links(1).
PROTOCOL_proxy that can act They are preferable servers used by Links, (http, ftp, gopher, etc), can be mapped separately by setting environment variables of the form PROTOCOL_proxy (literally: FTP_proxy, HTTPS_proxy, etc), to "http://some.server.dom:port/". HTTP_proxy, (see WWW_access_GATEWAY, below). Each protocol to the older gateway Links supports the use of proxy servers as firewall gateways and caching servers.

Con el fin de establecer el servidor proxy, agrega la siguiente lnea a su archivo ~/.bashrc.
HTTP_proxy=http://10.1.1.1:80

Prince inicia una nueva shell (para que el archivo .bashrc sea ledo) y trata de tener acceso a la pgina web de Open Source.
[prince@station prince]$ links http://www.redhat.com/opensourcenow/key_issues.html Looking up www.redhat.com www.redhat.com Unable to locate remote host www.redhat.com Alert!: Unable to connect to remote host.

25

La shell bash
links: Can't access startfile http://www.redhat.com/opensourcenow/key_issues.html

El navegador de enlaces aparentemente no est tratando de usar el servidor proxy. Cuando prince revisa sus pasos, se da cuenta que aunque configur la variable http_proxy, olvid exportar la variable. Dado que la variable es una variable de shell establecida y no una variable de entorno, no es heredada por el proceso links. Prince edita la lnea que agreg a su archivo .bashrc, agregndole la palabra exportar:
[prince@station prince]$ cat .bashrc # .bashrc # User specific aliases and functions # Source global definitions if [ -f /etc/bashrc ]; then . /etc/bashrc fi export HTTP_proxy=http://10.1.1.1:80

De nuevo inicia una nueva shell (para que lea el archivo .bashrc otra vez) y ensaya una vez ms.
[prince@station prince]$ links http://www.redhat.com/opensourcenow/key_issues.html

Dado que la variable http_proxy ahora es exportada como una variable de entorno, es heredada por el proceso links, y links usa con xito el servidor de proxy para contactar el sitio. Puesto que prince incluy la lnea en su archivo ~/.bashrc, la variable de entorno se configurar automticamente cada vez que inicie una nueva shell, y prince no necesita preocuparse por esto. Agregar un directorio a su PATH Cuando la shell bash examina una lnea de comandos, asume que la primera palabra es el nombre del programa que se va a ejecutar. Luego debe ubicar el archivo que contiene el programa en el sistema de archivos. Dado que la bsqueda de un archivo ejecutable, por ejemplo, ls en todo un sistema de archivos, tardara mucho, la shell busca en la variable de entorno PATH para obtener instrucciones. La variable de entorno PATH contiene una lista de directorios en los cuales deberan buscar los archivos ejecutables, separados por una coma:
[prince@station prince]$ echo $PATH /bin:/usr/bin:/usr/local/bin:/usr/bin/X11:/usr/X11R6/bin:/home/prince/ bin

26

La shell bash Considere ejecutar el comando xclock, el cual comienza por un reloj en el entorno grfico X. Por medio de la variable PATH, bash primero busca el archivo /bin/xclock, y al no encontrarlo, busca entonces /usr/bin/xclock. El proceso continua hasta encontrar el archivo ejecutable /usr/bin/X11/xclock. No todos los archivos ejecutables en el sistema residen en directorios que estn en la lista por su variable de entorno PATH. Se dice que algunos programas viven "fuera de su ruta". Sin embargo, el hecho que un programa viva fuera de su ruta, no significa que no pueda ejecutarse. Significa que usted debe especificar el comando mediante una referencia absoluta. A manera de ejemplo, el comando lsof lista los archivos actualmente abiertos en el sistema, (el nombre se deriva del ingls LiSt Open Files.) Dado que este comando lo suelen utilizar administradores de sistemas, y no usuarios "normales", el comando vive en el directorio /usr/sbin, el cual se adhiere "fuera del" PATH por defecto en Red Hat Enterprise Linux. El usuario prince deseara usar el comando para listar todos los archivos actualmente abiertos que el proceso init est utilizando.
[prince@station prince]$ -rwxr-xr-x 1 root [prince@station prince]$ -bash: lsof: command not ls -l /usr/sbin/lsof root 95640 Jan 24 lsof -c init found 2003 /usr/sbin/lsof

Al examinar su PATH, el directorio /usr/sbin no est listado, as que prince trata de ejecutar el comando como una referencia absoluta.
[prince@station prince]$ /usr/sbin/lsof -c COMMAND PID USER FD TYPE DEVICE SIZE init 1 root mem REG 3,3 27036 init 1 root mem REG 3,3 104560 init 1 root mem REG 3,3 1536292 2.3.2.so init NODE 245377 244833 476416 NAME /sbin/init /lib/ld-2.3.2.so /lib/tls/libc-

Dado que l preferira poder ejecutar el comando directamente, prince deseara agregar el directorio /usr/sbin a su ruta. Utiliza un truco estndar de Linux (y Unix) para agregar el directorio a su ruta.
[prince@station prince]$ PATH=$PATH:/usr/sbin

El comando puede ser pensado como si se dijera "establezca la variable PATH"sea cualquiera que sea actualmente, pero luego agregue :/usr/sbin. Tras examinarlo, la variable PATH ha agregado el directorio /usr/sbin y prince ahora puede listar los archivos fcilmente.
[prince@station prince]$ echo $PATH /bin:/usr/bin:/usr/local/bin:/usr/bin/X11:/usr/X11R6/bin:/home/prince/ bin:/usr/sbin [prince@station prince]$ lsof -c init COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME init 1 root mem REG 3,3 27036 245377 /sbin/init

27

La shell bash
init init 2.3.2.so 1 root mem 1 root mem REG REG 3,3 104560 244833 /lib/ld-2.3.2.so 3,3 1536292 476416 /lib/tls/libc-

Ejercicios en lnea Lab Exercise Objetivo: Establecer y apuntar correctamente varias variables de shell y de entorno. Estimated Time: 30 mins. Especificaciones Estas especificaciones deben aplicarse a las shells recin iniciadas. Edite el script de arranque de bash .bashrc (que se encuentra al comienzo de su directorio de inicio) para incluir los comandos apropiados. 1. Su shell debe incluir el directorio /usr/sbin en su ruta de bsqueda de archivos ejecutables. 2. Tras el arranque, su shell debera crear la variable de entorno PRINTER que apunte a la palabra sales. 3. Slo por gusto, tras el arranque, haga que su shell establezca la variable HISTSIZE en su proceso actual de shell, (qu efecto tendr esto en su historial de comandos de shell?) 4. Tras el arranque, su shell debera crear la variable de shellCLICHE, la cual debera apuntar a la frase en ingls that is how the cookie crumbles. Asegrese que la variable no se convierta en una variable de entorno. 5. Tras el arranque, su shell debe redirigir la salida del comando date al archivo en su directorio de inicio titulado ppid_is_my_parent, en donde ppid es remplazado por su id del proceso padre de shell (almacenado en la variable de shell PPID). Si ha configurado su archivo de shell .bashrc correctamente, debera poder reproducir una salida similar a la siguiente.
[student@station student]$ echo $PATH /bin:/usr/bin:/usr/local/bin:/usr/bin/X11:/usr/X11R6/bin:/usr/sbin:/ho me/student/bin [student@station student]$ echo $PRINTER sales [student@station student]$ ps PID TTY TIME CMD 3914 pts/3 00:00:00 bash 3948 pts/3 00:00:00 ps [student@station student]$ echo $HISTSIZE 3914 [student@station student]$ echo $CLICHE that is how the cookie crumbles

28

La shell bash
[student@station student]$ echo $PPID 4293 [student@station student]$ ls 4293_is_my_parent

Deliverables A title Question 1

Un archivo de arranque bash.bashrc configurado correctamente, para que las shells recin creadas bash tengan la siguiente configuracin. 1. El directorio /usr/sbin est includo en la ruta de bsqueda de la shell. 2. La variable de entorno PRINTER apunta a sales. 3. La variable de entorno HISTSIZE apunta al id (PID) del proceso actual de la shell. 4. La variable de shell CLICHE (no es una variable de entorno) apunta a la frase en ingls that is how the cookie crumbles. 5. Tras el arranque, la salida del comando date es redirigida al archivo titulado ppid_is_my_parent en su directorio de inicio, donde ppid es remplazado por el id del proceso padre de la shell.

Limpieza Despus de que su ejercicio haya sido calificado, probablemente querr suprimir los cambios hechos en el archivo .bashrc, (en caso contrario, podra terminar con un amplio historial, y demasiados archivos molestos soso_is_my_parent.) Captulo 4 Expansin de la lnea de comandos Conceptos clave

La shell bash expande ciertos metacaracteres de lnea de comandos antes de interpretar el comando. La expansin con la tilde ampla los smbolos que comienzan por una tilde (~) a los directorios de inicio de usuarios. La expansin de llaves ampla los smbolos con corchetes ({}) en palabras mltiples, cada una contiene una sola palabra a partir de la lista especificada. La sustitucin de comandos expande el texto delimitado por comillas invertidas (``) o "dlar parntesis" ($()) en la salida producida por el comando encerrado. Las comillas dobles ("..." ), las comillas sencillas ('...') y el caracter de barra invertida pueden usarse para evitar que la shell expanda los caracteres.

29

La shell bash Expansiones de lnea de comandos Generalidades Antes de ejecutar un comando, la shell bash ejecuta varias expansiones en la lnea de comandos. Varios tipos de expansiones de bash, tales como la expansn del nombre de ruta (comodn) y la expansin de variables ya se han descrito. El siguiente cuadro lista los tipos de expansiones bash con una descripcin de cada una a continuacin. Table 1. Expansiones de lnea de comandos en la shell bash Expansin Historial Llaves Tilde Variable Aritmtica Sustitucin de comandos Nombre de ruta Sintaxis ! {} ~username $, ${...} $((...)) `...`, $(...) *, ?, [...], [^...] Se expande hasta Una lnea de comandos anterior Texto especificado Directorio de inicio de un usuario Shell y variables de entorno Clculo numrico Salida de la ejecucin del comando en una subshell Nombres de archivos coincidentes en el sistema de archivos

Expansin del historial La expansin del historial, la cual se invoca con un signo de exclamacin, se describi de modo extensivo en una leccin anterior. Aqu se incluye debido al contexto. Expansin de llaves La expansin de llaves expande una sola palabra en palabras mltiples, sustituyendo uno de los elementos en "llave" para cada palabra. Por ejemplo, la expresin {c,b,r}at se expandira en tres palabrascat bat rat. La expansin de llaves se utiliza para referirse (o crear) archivos que tienen prefijos, postfijos o componentes de ruta comunes, (recuerde que varios ejercicios de laboratorio han utilizado expansin de llaves para crear rpidamente un gran nmero de directorios o archivos y luego subdirectorios dentro de ellos).
[prince@station prince]$ mkdir chap{01,02,03,04}

El usuario prince ahora tiene los siguientes cuatro directorios:


. |-- chap01/ |-- chap02/ |-- chap03/

30

La shell bash
`-- chap04/ 4 directories, 0 files

[prince@station prince]$ mkdir chap{01,02,03,04}/{html,text}

Ahora se han agregado los siguientes directorios.


. |-| | |-| | |-| | `-chap01/ |-- html/ `-- text/ chap02/ |-- html/ `-- text/ chap03/ |-- html/ `-- text/ chap04/ |-- html/ `-- text/

12 directories, 0 files

En el primer comando mkdir, la palabra entre corchetes se expande a cuatro directorios chap01, chap02, chap03, y chap04. En el segundo comando mkdir, la palabra con doble corchete se expande a ocho directorios chap01/html, chap01/text, chap02/html y as sucesivamente. A diferencia de los archivos/comodines, las palabras que resultan de la expansin de llaves no coinciden con los archivos en el sistema de archivos (los archivos no tienen que existir). De hecho, las palabras expandidas no tienen que ser nombres de archivos, aunque en la prctica suelen serlos. Expansin de tilde Quizs este es el concepto ms sencillo de expansin, la expansin de tilde, el cual expande un ~nombredeusuario para el usuario del directorio de inicio del nombredeusuario, como se list en el archivo/etc/passwd (o la base de datos apropiada del usuario). A continuacin, prince utiliza la expansin tilde para referirse a su directorio propio y a los directorios de elvis, y luego un subdirectorio del directorio de inicio de elvis.
[prince@station drwx-----x 15 drwx-----x 9 [prince@station total 4 drwxrwxr-x 2 prince]$ elvis prince prince]$ elvis ls -ld ~ ~elvis elvis 4096 Jul 21 17:41 /home/elvis prince 4096 Aug 4 06:58 /home/prince ls -l ~elvis/pub music 4096 Jul 13 05:46 music

31

La shell bash A menudo en este curso y en otros textos, la tilde se utiliza para implicar que un archivo debera existir en el directorio de inicio del usuario, tal como el archivo ~/.bash_history. Ahora podemos ver la razn de esta convencin. Expansin de variables La expansin de variables se trat de modo extenso en la leccin anterior. Reformulando, la shell bash expandir (desreferenciar) expresiones de la forma $VARNAME o ${VARNAME} al valor de la shell o variable de entornoVARNAME. Expansin aritmtica La shell bash suele considerarse un entorno deficiente para clculos numricos y los operadores aritmticos tales como +, -, *, y / en la lnea de comando no tienen el significado matemtico habitual. Sin embargo, la shell bash trata de manera especial texto delimitado con una sintaxis $((...)). Primero, las variables se tratan como enteros numricos cuando resulte apropiado, y segundo, los operadores matemticos estndar como por ejemplo +, -, *, y / se tratan como tal. La shell bash "expandir" toda la expresin y la remplazar por el resultado numrico. Los operadores aritmticos son los mismos del lenguaje de programacin C y estn totalmente documentados en la pgina de manual bash(1) bajo "EVALUACIN ARITMTICA". En el siguiente ejemplo, prince utilizar una expansin aritmtica para calcular el rea de un rectngulo.
[prince@station prince]$ WIDTH=16 [prince@station prince]$ HEIGHT=82 [prince@station prince]$ echo $(( $WIDTH * $HEIGHT)) 1312

Sin embargo, las limitaciones de clculos numricos se descubren rpidamente cuando prince trata de volver a calcular el rea mediante un nmero de punto flotante.
[prince@station prince]$ WIDTH=16.8 [prince@station prince]$ echo $(( $WIDTH * $HEIGHT)) -bash: 16.8 * 82: syntax error in expression (error token is ".8 * 82")

La shell bash slo soporta enteros aritmticos. Sustitucin de comandos Quizs de las expansiones ms complejas y tiles, la sustitucin de comandos permite a los usuarios ejecutar comandos arbitrarios en la subshell e incorporar los resultados dentro de la lnea de comandos. La sintaxis de la"vieja escuela" para la sustitucin de comandos es encerrar el comando entre "acentos graves" (la comilla simple inclinada hacia la izquierda que se encuentra en la misma tecla de ~, cerca de 1 en la mayora de los teclados), y el comando de sustitucin suele denominarse "sustitucin de acentos

32

La shell bash graves". La sintaxis ms moderna soportada por la shell bash es similar a la expansin aritmtica, pero con solo un par de parntesis: $(subcomando) Como ejemplo de una sustitucin de comandos, prince deseara crear un directorio que contenga la fecha en su nombre. Despus de examinar la pgina de manual date(1), crea una cadena de formato para generar la fecha en un formato compacto.
[prince@station prince]$ date +%d%b%Y 04May2003

Ahora, ejecuta el comando mkdir mediante la sustitucin de comandos.


[prince@station prince]$ mkdir reports.$(date +%d%b%Y) [prince@station prince]$ ls reports.04May2003

O pudo haber combinado las ventajas de la sustitucin de comandos y la sustitucin del historial como se muestra a continuacin.
[prince@station prince]$ mkdir reports.$(!da) mkdir reports.$(date +%d%b%Y) [prince@station prince]$ ls reports.04May2003

La shell bash implementa la sustitucin de comandos al generar una nueva subshell, ejecutar el comando, registrar la salida y salir de la subshell. El texto se utiliza para invocar la sustitucin de comandos luego es remplazado por la salida registrada desde el comando. Expansin de nombre de ruta La expansin de nombre de ruta o "comodn de archivo", se describi en el cuaderno anterior, pero no se introdujo como una expansin de shell. Ahora podemos ver que el nombre de ruta es uno de los tipos de expansiones implementados por la shell bash. Para repasar, la sintaxis de la expansin del nombre de ruta vea la siguiente tabla. Table 1. Expansin del nombre de ruta bash Caracter * ? [...] [^...] Coinciden 0 ms caracteres exactamente un caracter exactamente uno de los caracteres includos exactamente uno de los caracteres excludos

Comillas y caracteres de escape

33

La shell bash La shell bash usa varios caracteres de puntuacin que se encuentran en el teclado para ejecutar diferentes tipos de expansiones, redirecciones y otra clase de actos de expertos. Aunque es eficaz, hay situaciones en que los usuarios desean utilizar uno de estos caracteres sin la invocacin de ningn tipo de conducta especial. Parafraseando a Sigmund Freud, "A veces un signo dlar es slamente un signo de dolar." La shell bash proporciona tres mecanismos para evitar que los caracteres sean interpretados por la shell, escapando, utilizando comillas dobles o sencillas. Table 1. Uso de comillas y escape de la shell bash Sintaxis \ "..." '...' Efecto Impide que el siguiente caracter sea interpretado por la shell. Impide que los caracteres includos sean interpretados por la shell, exceptuando los caracteres $, !, y ` (acento grave). Impide que todos los caracteres includos sean interpretados por la shell.

Considere los siguientes ejemplos, donde prince est tratando de imprimir en pantalla. En el primer caso, prince define la variable CAR, y trata de imprimir la lnea sin comillas.
[prince@station prince]$ CAR=corvette [prince@station prince]$ echo <pre>little red $CAR</pre> -bash: syntax error near unexpected token `newline'

Sin comillas, bash interpret los caracteres > y < como solicitudes para redirigir la salida (y entrada) del comando. La shell se confundi cuando se le pidi redirigir la salida dos veces. El usuario prince, trata de nuevo, esta vez utilizando comillas dobles.
[prince@station prince]$ echo "<pre>little red $CAR</pre>" <pre>little red corvette</pre>

En este caso, las comillas dobles protegieron los caracteres < y >. Sin embargo, el signo de dlar, todava se interpreta como marcador para una variable. El usuario prince intenta de nuevo con comillas sencillas.
[prince@station prince]$ echo '<pre>little red $CAR</pre>' <pre>little red $CAR</pre>

En este caso, todos los caracteres de puntuacin fueron protegidos de la interpretacin de la shell. Como una alternativa, los caracteres pueden escaparse individualmente con una barra invertida precedente.
[prince@station <pre>little red [prince@station >pre<little red prince]$ echo \<pre\>little red $CAR\</pre\> corvette</pre> prince]$ echo \<pre\>little red \$CAR\</pre\> $CAR</pre>

34

La shell bash Una nota sobre las comillas Como hemos visto, bash hace uso de una variedad de signos de puntuacin relacionados con comillas, asignando a cada uno un propsito diferente. Los tres estilos de comillas se ilustran con el comando echo de abajo. Con el fin de reforzar las diferencias, los tres estilos de comillas se describen a continuacin.
[prince@station prince]$ FOOD=guacamole [prince@station prince]$ echo "wow! `whoami` sells $FOOD" 'for $!' wow! prince sells guacamole for $!

Comillas dobles: "..." Las comillas dobles se utilizan en situaciones donde usted deseara tratar la mayora de la puntuacin literalmente o combinar palabras en un slo smbolo, pero an puede hacer uso de variables, sustitucin de comandos y sustitucin de historial. Comillas sencillas inclinadas a la derecha (apstrofes): '...' Las comillas sencillas son las ms poderosas y se utilizan en situaciones similares a las comillas dobles cuando quiere que toda la puntuacin, incluyendo las variables y la sustitucin de comandos, se traten literalmente. Comillas sencillas inclinadas hacia la izquierda (acentos graves): `...` Los acentos graves son bsicamente diferentes a las comillas simples o dobles, no son para citar. Estos acentos se utilizan para invocar la sustitucin de comandos en el texto incluido. Sutilezas de la expansin de lnea de comandos Hemos visto que bash se aplica a un gran nmero de expansiones de lnea de comandos antes de que un comando se ejecute. La frase incluye una sutileza que no siempre es apreciada y puede algunas veces llevar a confusiones. Las expansiones de shell se presentan antes de que el comando se ejecute. A veces, algunos los comandos esperan argumentos que contienen caracteres especiales para la shell bash. Un ejemplo es el comando find. Si no se tiene cuidado al utilizar comillas o escapar los caracteres especiales, bash podra "expandirlos" antes de que el comando los vea. El siguiente ejemplo del comando find en accin podra ayudar. Al iniciar desde un directorio vaco, prince ejecuta find para buscar todos los archivos terminados en .conf en el directorio /etc.
[prince@station prince]$ find /etc -name *.conf find: /etc/sysconfig/pgsql: Permission denied /etc/sysconfig/networking/profiles/default/resolv.conf /etc/sysconfig/networking/profiles/netup/resolv.conf find: /etc/default: Permission denied /etc/X11/gdm/factory-gdm.conf

35

La shell bash
/etc/X11/gdm/gdm.conf /etc/modprobe.conf ...

Pasando por alto algunas quejas acerca de los directorios inaccesibles, el comando funciona. Luego, prince crea los archivos a.conf y b.conf en el directorio local e intenta de nuevo.
[prince@station prince]$ touch a.conf b.conf [prince@station prince]$ ls a.conf b.conf [prince@station prince]$ find /etc -name *.conf find: paths must precede expression Usage: find [path...] [expression]

Por qu el comando que funcion hace apenas unos segundos no funciona ahora? La respuesta, como podra esperarse, tiene que ver con la expansin de lnea de comandos. Primero, veamos el segundo caso. La shell bash encontr el siguiente comando.
find /etc -name *.conf

Qu hace primero bash? Aplica la expansin de lnea de comandos. Despus de examinar el directorio local y hallar los archivos a.conf y b.conf, la shell remplaza el comodn *.conf con los nombres de archivo coincidentes, a.conf b.conf. Esta es una expansin de nombre de ruta bastante antigua. Despus de la expansin, el comando se ve de esta manera.
find /etc -name a.conf b.conf

Ahora bash ejecuta el comando, el cual genera un mensaje de error (porque la opcin name no pudo manejar dos argumentos). Volviendo al primer comando, por qu funcion? Al implementar la expansin del nombre de ruta, la shell bash intenta ayudar a la gente. Si un comodn "falta " (por ejemplo, ningn archivo coincide con la expresin especificada), bash conserva el comodn. En el primer caso, como ninguno de los archivos coincidi con *.conf, bash pas el argumento al comando find como est escrito. [1] Cul es la forma correcta de manejar la situacin? Usar comillas o escapar los caracteres especiales, como se muestra a continuacin:
[prince@station prince]$ find /etc -name "*.conf" find: /etc/sysconfig/pgsql: Permission denied find: /etc/default: Permission denied /etc/sysconfig/networking/profiles/default/resolv.conf /etc/sysconfig/networking/profiles/netup/resolv.conf /etc/X11/gdm/factory-gdm.conf /etc/X11/gdm/gdm.conf /etc/modprobe.conf ...

36

La shell bash Debido a que se ha utilizado el * , la shell bash no intentar realizar una expansin de nombre de ruta y el comando funciona como se desea. La leccin es: si est pasando un caracter especial dentro de un comando, usted debera proteger el caracter con comillas (o un escape de barra invertida). Ejemplos Uso de expansin de llaves El usuario prince est configurando un directorio llamadoogg en el que va a almacenar archivos de msica que ha "quemado" (copiado) de sus discos favoritos. Con el fin de organizar las cosas, le gustara crear directorios basados en estilos diferentes de msica y en cada uno de los subdirectorios crear un archivo llamado playlist. En la siguiente transcripcin, prince usa una expansin de llave para agilizar su trabajo.
[prince@station prince]$ mkdir ogg [prince@station prince]$ mkdir ogg/{blues,folk,rap,pop} [prince@station prince]$ touch ogg/{blues,folk,rap,pop}/playlist

En este punto, prince ha creado la siguiente estructura de directorio.


ogg/ |-- blues | `-- playlist |-- folk | `-- playlist |-- pop | `-- playlist `-- rap `-- playlist 4 directories, 4 files

Pudo prince haber utilizado el comodn de archivo (expansin de nombre de ruta) en su lugar? Al utilizar el comando mkdir, el comodn de archivo habra sido intil porque los directorios blues, folk, etc.., no existan. Qu sucedera si prince hubiera utilizado el comodn de archivo para el comando touch?
[prince@station prince]$ touch ogg/*/playlist touch: creating `ogg/*/playlist': No such file or directory

Los directorios blues, folk, etc., existeron, pero ninguno de los archivos playlist existia, por lo tanto el comodin se perdi. Para situaciones en que el archivo podra o no existir, la expansin de llaves tiende a funcionar mejor que el comodn. Ms acerca de la terminacin con el tabulador Hemos visto que la shell bash graba las pulsaciones al completar nombres de comandos o nombres de archivos cuando se pulsa la tecla TAB. La shell bash completar nombres de usuario y variables, cuando las palabras comienzan por los caracteres ~ o $,

37

La shell bash respectivamente. Por ejemplo, si un usuario escribe ~el<TAB>, bash podra completar el smbolo ~elvis. De la misma manera, $PA<TAB> podra completarse $PATH. De forma similar a la expansin del comando y nombre de archivo, si los caracteres iniciales tecleados hasta el momento no especifican nicamente una variable (o nombre de usuario), bash emite un pitido. Al pulsar dos veces el TAB se listarn las posibles terminaciones. Poner entre comillas los nombres de archivos raros En un cuaderno anterior, mencionamos que los nombres de archivo en Linux (y Unix) podran estar compuestos por cualquier caracter a excepcin de uno (Recuerda cul?[1]) En el mismo cuaderno, se les dijo a los estudiantes que aunque se podan utilizar caracteres especiales, era mejor evitarlos. Ahora estamos en una buena posicin para ver el porqu. Suponga que prince quiere crear un archivo nico llamado Make $$$ *Fast* !!.
[prince@station prince]$ touch Make $$$ *Fast* !! touch Make $$$ *Fast* l [prince@station prince]$ ls 13986$ *Fast* l Make

El comando touch accede, creando los archivos que bash le pide hacer. Primero, como los smbolos estn separados por espacios, bash los trata como cuatro palabras separadas. Luego la shell bash aplica sus distintas expansiones a las palabras. 1. El archivo Make se crea fcilmente. 2. La shell bash aplica la sustitucin de variables a $$$, resultando en 13986$. (De dnde sale el nmero 13986?[2]) 3. El smbolo *fast* sobrevive con el preservado del *, pero ese no tena que ser el caso. 4. Por ltimo, !! se expande a l desde el historial de comandos del usuario, el cual aparentemente (y un poco extrao) fue el anterior comando ejecutado. Una vez se han aplicado las extensiones, la shell bash invoca touch con cuatro argumentos, para que touch obedientemente cree cuatro archivos. De qu manera persuadimos a bash para que cree un archivo con nuestro rito proporcionado por Linux de incluir espacios y puntuacin en el nombre de archivo? Obviamente con comillas.
[prince@station prince]$ touch 'Make $$$ *Fast* !!' [prince@station prince]$ ls 13986$ *Fast* l Make Make $$$ *Fast* !!

Con slo ls, es difcil distinguir entre mltiples archivos y un archivo nico con espacios en el nombre. Un ls -l ayuda a aclarar la situacin.
[prince@station prince]$ ls -l total 0

38

La shell bash
-rw-rw-r--rw-rw-r--rw-rw-r--rw-rw-r--rw-rw-r-*Fast* !! 1 1 1 1 1 prince prince prince prince prince prince prince prince prince prince 0 0 0 0 0 Aug Aug Aug Aug Aug 31 31 31 31 31 06:19 06:19 06:19 06:19 06:40 13986$ *Fast* l Make Make $$$

Observe que las comillas sirven en realidad para dos propsitos. 1. Las comillas inhiben la interpretacin de los signos de puntuacin como lo solicitan las expansiones de shell. 2. Las comillas impiden la divisin de palabras, la cual es la forma como la shell bash compone argumentos para los programas que ejecuta. Por ejemplo, el comando touch one two three hara que bash ejecute el comandotouch con tres argumentos, one, two, y three. Por el contrario, el comando touch "one two three" hara que bash pase el nico argumento del comando touch a one two three (aunque uno con espacios). Ejercicios en lnea Lab Exercise Objetivo: Usar varias sustituciones de shell bash de modo efectivo. Tiempo estimado: 15 minutos. Especificaciones 1. Configure su archivo ~/.bashrc para que, tras el arranque, la variable LINUX_VERS contenga toda la primera lnea del archivo /var/log/dmesg, (el archivo /var/log/dmesg se regenera cada vez que se arranca la mquina, por lo que deber establecer la variable de modo dinmico. Recuerde que el comando head -1 mostrar la primera lnea del archivo). 2. En su directorio de inicio, cree archivos con los siguentes nombres de archivo, (el contenido de los archivos es irrelevante). a. archivo sin ttulo b. **'s y ||'s c. >> README!! << 3. En su directorio de inicio, cree un subdirectorio denominado shirts. Dentro del subdirectorio, cree 108 archivos de la forma estilo.tamao.color.ext, donde cada archivo contenga una combinacin de valores a partir del cuadro siguiente. Estilo Tamao Color tee, crew, turtleneck XXL, XL, L, M, S, XS red, yellow, blue

Extensin info, inv

39

La shell bash 4. Por ejemplo, el directorio debera contener archivos titulados tee.XXL.red.info, tee.XXL.red.inv, tee.XL.red.info, tee.XL.red.inv y as sucesivamente. Deliverables A title Question 1

1. Tras el arranque, la variable LINUX_VERS debe establecerse para que contenga la primera lnea del archivo /var/log/dmesg. 2. Los archivos a continuacin deberan existir en el directorio de inicio del usuario. a. archivo sin ttulo b. **'s y ||'s c. >> README!! << 3. Un directorio llamado ~/shirts, el cual contiene exactamente 108 archivos, cada uno de forma estilo.tamao.color.ext. Cada nombre de archivo contiene una combinacin de los valores que aparecen en el cuadro de arriba.

Captulo 5 Personalizacin de la shell Conceptos clave

La shell bash internamente implementa ciertos comandos sencillos que estn muy ligados con la conducta de la shell. Estos se conocen como los comandos incorporados. Los alias de shell crean comandos aparentes que expanden a texto arbitrario. Los alias de shell se establecen y examinan con el comando alias. Los alias de shell se remueven con el comando unalias. El intrprete de comandos de la shell bash se puede personalizar mediante la variable PS1. Las banderas de shell se pueden establecer con el comando set -f y se limpian con set +f. Las opciones de shell se examinan, establecen y se anulan con el comando shopt.

Esta leccin se centra en las tcnicas utilizadas para personalizar la shell bash, como por ejemplo crear comandos alias, personalizar el intrprete de comandos de la shell y establecer las opciones de la shell. La leccin comienza con un tema que no es la

40

La shell bash personalizacin real, pero est relacionada con la conducta de la shell, el tema de los comandos internos. Comandos internos de la shell Al evaluar una lnea de comandos, la shell trata la primera palabra como un comando. La shell bash implementa algunos comandos de modo interno, lo que significa que los comandos no existen en el sistema de archivos como un programa cargable, sino que la shell misma los implementa. Estos comandos se conocen como comandos internos de la shell. Estos suelen ser comandos sencillos relacionados con cambios a la shell misma. En un cuaderno anterior, presentamos el comando which, el cual reportar en qu parte del sistema de archivo reside el archivo ejecutable que contiene un comando en particular. A continuacin, madonna observa que el comando date es implementado por el programa que se encuentra en el archivo ejecutable /bin/date:
[madonna@station madonna]$ which date /bin/date

Qu sucede cuando madonna utiliza which para buscar el archivo ejecutable que contiene el programa cd?
[madonna@station madonna]$ which cd /usr/bin/which: no cd in (/usr/local/j2sdk1.3.1/bin:/bin:/usr/bin:/usr/local/bin :/usr/bin/X11:/usr/X11R6/bin:/home/madonna/bin)

De acuerdo con which, el comando cd no existe como ejecutable en el sistema de archivos. El comando cd es un ejemplo de un comando interno de la shell. Una lista de comandos internos de la shell y su documentacin correspondiente se puede ver mediante el comando help, el cual es en s mismo un comando interno de la shell.
[madonna@station madonna]$ help GNU bash, version 2.05b.0(1)-release (i386-redhat-linux-gnu) These shell commands are defined internally. Type `help' to see this list. Type `help name' to find out more about the function `name'. Use `info bash' to find out more about the shell in general. Use `man -k' or `info' to find out more about commands not in this list. ... alias [-p] [name[=value] ... ] bind [-lpvsPVS] [-m keymap] [-f fi builtin [shell-builtin [arg ...]] cd [-L|-P] [dir] compgen [-abcdefgjksuv] [-o option ... bg [job_spec] break [n] case WORD in [PATTERN [| PATTERN]. command [-pVv] command [arg ...] complete [-abcdefgjksuv] [-pr] [-o

41

La shell bash El comando help entrega una versin de la informacin sobre la shell, menciona un par de sitios donde la documentacin de bash puede encontrarse y presenta bota una lista de comandos internos. Observe que la lista contiene el comando cd. El comando help tambin se puede utilizar para ver documentacin detallada acerca de un comando interno especfico.
[madonna@station madonna]$ help cd cd: cd [-L|-P] [dir] Change the current directory to DIR. The variable $HOME is the default DIR. The variable CDPATH defines the search path for the directory containing DIR. Alternative directory names in CDPATH are separated by a colon (:). A null directory name is the same as the current directory, i.e. `.'. If DIR begins with a slash (/), then CDPATH is not used. If the directory is not found, and the ...

Dado que el comando cd est ligado a la conducta de la shell, es decir, cambia el directorio de trabajo de la shell, este es un buen candidato para un comando interno. Varios comandos que ya ha estado utilizando, tales como cd, pwd, y echo, son en realidad internos de la shell. Alias Los alias permiten a los usuarios personalizar los nombres de los comandos o enlazar comandos con las opciones o argumentos ms utilizados. Una vez creados, los alias se utilizan como si fueran cualquier otro comando. El comando alias Los alias se crean (y examinan) mediante el comando interno alias. Al crear alias, el comando alias utiliza la siguiente sintaxis.
alias NAME=VALOR

Este comando creara un alias denominado NOMBRE, el cual apuntara al valor VALOR. La sintaxis debera ser reminiscente a la utilizada para asignar variables de shell. En particular, como en la asignacin de variable, la asignacin de alias no permite espacios en ningn lado del signo de igual. Del mismo modo, dado que la sintaxis slo espera un smbolo nico despus del signo igual, las frases que contienen mltiples palabras (separadas por espacios) deben ir entre comillas. En el siguiente ejemplo, madonna establece el alias h como un atajo para el comando head. Dado que el alias apunta a una sola palabra (head), madonna no tiene que preocuparse por citar el valor. Luego utiliza el nuevo alias para examinar varias de las primeras lneas del archivo /etc/services.
[madonna@station madonna]$ alias h=head [madonna@station madonna]$ h /etc/services

42

La shell bash
# /etc/services: # $Id: 010_text.dbk,v 1.3 2004/01/07 18:41:02 bowe Exp $ # # Network services, Internet style # # Note that it is presently the policy of IANA to assign a single well-known # port number for both TCP and UDP; hence, most entries here have two entries # even if the protocol doesn't support UDP operations. # Updated from RFC 1700, ``Assigned Numbers'' (October 1994). Not all ports # are included, only the more common ones.

En el siguiente ejemplo, madonna advierte que a menudo est listando todos los procesos ejecutndose en la mquina con el comando ps aux. Decide entonces que cada vez que ejecute ps, prefera la salida ms completa que ps aux presenta y por lo tanto establece un alias para el comando ps.
[madonna@station madonna]$ alias ps="ps aux" [madonna@station madonna]$ ps USER PID %CPU %MEM VSZ RSS TTY STAT START root 1 0.0 0.0 1376 72 ? S Aug30 root 2 0.0 0.0 0 0 ? SW Aug30 [keventd] root 3 0.0 0.0 0 0 ? SW Aug30 root 4 0.0 0.0 0 0 ? SWN Aug30 [ksoftirqd_CPU0] root 9 0.0 0.0 0 0 ? SW Aug30 [bdflush] root 5 0.0 0.0 0 0 ? SW Aug30 [kswapd] ...

TIME COMMAND 0:04 init [ 0:00 0:00 [kapmd] 0:00 0:00 0:00

En este caso, puesto que ella quiso que el alias apuntara a una frase de dos palabras (ps y aux), necesit encerrar la frase entre comillas (para que tras "la divisin de palabras", la shell trate la frase como una sola palabra). El comando alias tambin se utiliza para examinar los alias actualmente definidos. Si madonna quisiera repasar los alias que estableci podra sencillamente ejecutar el comando alias (sin argumentos).
[madonna@station madonna]$ alias alias h='head' alias l.='ls -d .* --color=tty' alias ll='ls -l --color=tty' alias ls='ls --color=tty' alias ps='ps aux' alias vi='vim' alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

43

La shell bash El comando alias lista los alias establecidos por madonna (h y ps), como tambin otros alias establecidos por los scripts de arranque bash de madonna (y son parte de la configuracin predeterminada de Red Hat Enterprise Linux). Si se dan argumentos (sin el signo de igual), el comando alias mostrar el alias actual para el argumento, si existe alguno:
[madonna@station madonna]$ alias ps h foo alias ps='ps aux' alias h='head' -bash: alias: foo: not found

El comando unalias Los alias se pueden suprimir con el comando interno de la shell unalias. Para suprimir un alias, pase el nombre de alias como un argumento al comando unalias. A continuacin madonna suprime el alias que cre anteriormente para ps.
[madonna@station madonna]$ unalias ps [madonna@station madonna]$ alias ps -bash: alias: ps: not found

Evaluacin de alias Cundo busca alias la shell de bash ? A diferencia de las variables, no hay signos de puntuacin asociados con ninguna clase de "expansin de alias". En su lugar, la shell de bash busca alias en donde se espera un comando (es decir, como la primera palabra en la lnea de comando). Si la primera palabra es reconocida como un alias , el alias se expande. La excepcin es si el alias se expande al comando que tiene el mismo nombre de alias en cuyo caso la shell simplemente ejecuta la expansin y sigue adelante, (de otra manera, los usuarios podran fcilmente crear alias que pondran la shell en un bucle infinito). Los usuarios pueden no darse cuenta de que estn usando alias en lugar del comando mismo. Un buen ejemplo es la configuracin predeterminada de Red Hat Enterprise Linux, la cual alias el comando ls al valor ls --color=tty, (este instruye a ls para proporcionar caracteres de control especiales que dan color a diferentes tipos de archivos, pero solo si el comando est escribiendo en una terminal. Cuando se redirige a un archivo, no se presenta ningn color). Ejecucin de comandos Hemos descrito varios tipos de palabras considerados por la shell bash como "comandos". Para resumir, y proveer un contexto, la siguiente lista resume los pasos que la shell bash realiza al evaluar la primera palabra de la lnea de comandos, (el siguiente no es el algoritmo exacto, el cual es ms complicado, pero sirve como una aproximacin til).

44

La shell bash 1. Realiza cualquier expansin de la shell. 2. La palabra se define como un alias? Si es as, expanda el alias y vuelva a comenzar (a menos que el alias se expanda a un comando que tenga el mismo nombre del alias en cuyo caso expande el alias y empieza de nuevo, pero no vuelve a expandir alias). 3. La palabra se define como una funcin de una shell? Si es as, llame la funcin de la shell en la shell actual, (las funciones de la shell van ms all del alcance de este curso, pero estn incudas aqu para completar la informacin). 4. La palabra es un comando intermo de la shell? Si es as, ejecute el comando interno. 5. La palabra contiene un /? Si es as, ejecute el archivo si existe y tiene permisos ejecutables. 6. Si la palabra no contiene un /, busque un archivo con un nombre similar en todos los directorios en orden como se defini en el entorno de variable PATH. Si existe un archivo coincidente y tiene permisos ejecutables, ejecute el archivo. Personalizar el intrprete de comandos de bash La shell bash interactiva, mientras que repite su bucle de "escuchar", "evaluar" y "ejecutar", expide un intrprete de comandos cada vez que vuelve a la etapa de "escuchar". El intrprete de comandos se utiliza para contarle al usuario que la evaluacin de la etapa anterior ha terminado y que la shell est esperando intrucciones. En la configuracin predeterminada de Red Hat Enterprise Linux , el intrprete de comandos tambin provee ms informacin, incluyendo el nombre de usuario actual, nombre de la mquina y directorio de trabajo. El comando bash en realidad tiene cuatro intrpretes de comandos diferentes los cuales se utilizan en diferentes situaciones. Los dos ms vistos son el intrprete de comandos primario, utilizado cada vez que bash est listo para un nuevo comando y el intrprete de comandos secundario utilizado cuando un usuario presiona la tecla INTRO, pero la lnea de comandos tiene obviamente una sintaxis inacabada (tal como unas comillas que an no se han cerrado). A continuacin [madonna@station madonna]$ sirve de intrprete de comandos primario, mientras que> sirve de intrprete de comandos secundario.
[madonna@station madonna]$ echo "Little Miss Muffet > Sat on a Tuffet" Little Miss Muffet Sat on a Tuffet

Personalizacin del intrprete de comandos de bash con PS1 y PS2 Los usuarios pueden personalizar los intrpretes de comandos de bash mediante las variables de shell PS1 y PS2, las cuales bash usa para componer los dos prompts. El ejemplo anterior implic que el intrprete de comandos primario es la forma de decir de bash "Estoy esperando", y el intrprete de comandos secundario es la forma de decir de bash "Todava estoy esperando". Para plantear el punto de una forma obvia, madonna personalizar sus intrpretes de comandos para decir justo eso.

45

La shell bash
[madonna@station madonna]$ PS1="I'm waiting ... " I'm waiting ... PS2="I'm still waiting ... " I'm waiting ... echo "Hickory Dickory Dock I'm still waiting ... three mice ran up the clock" Hickory Dickory Dock three mice ran up the clock Estoy esperando ...

Inmediatamente tras cambiar el valor de la variable PS1, bash comenz a utilizar el nuevo valor como su intrprete de comandos primario. A menudo los usuarios desearan que el intrprete de comandos tambin visualizara informacin til. La shell de bash permite a los usuarios insertar secuencias de escape dentro de la definicin de PS1, que remplaza con informacin dinmica cuando se genera el intrprete de comandos. El cuadro a continuacin resume algunas de las secuencias ms comunes. Para obtener una lista ms completa, vea la pgina de manual bash(1). Table 1. Secuencias de escape comunes utilizadas en intrpretes de comandos bash Secuencia \a \d \h \T \u \W \! \$ \nnn Expansin Campana audible de la terminal fecha en formato"da mes" el nombre del host hasta el primer "." La hora actual en formato de 12 horas HH:MM:SS el nombre de usuario del usuario actual el nombre de la base del directorio de trabajo actual El nmero de historial de este comando Si el UID efectivo es 0, un #, de lo contrario un $ el caracter correspondiente al nmero octal nnn

La expansin de parmetros (variables), la expansin aritmtica, y la sustitucin de comandos se aplican al valor de PS1 cuando el intrprete de comandos es generado tambin. La secuencia de escape \$ puede requerir ms explicacin. La shell de bash utiliza esta secuencia para reproducir una caracterstica de la shell Bourne originial (/bin/sh). El intrprete de comandos por defecto de la shell Bourne es un dlar ($) para los usuarios estndar y un signo (#) para el usuario root. Con la secuencia de escape \$, un valor predeterminado PS1 para todo el sistema puede utilizarse, imitndo esta conducta original. Al personalizar el intrprete de comandos de bash, el intrprete de comandos suele verse ms limpio si la variable PS1 est definida con un espacio al final.

46

La shell bash Opciones y banderas de la shell de bash Se utilizan dos comandos internos para configurar la conducta de la shell mediante las opciones de shell. Uno es el comando set, el cual se utiliza para modificar la conducta de shell mediante (por lo general) banderas de una letra, y el otro esshopt, usado para configurar las opciones de la shell. Banderas de la shell: el comando interno set El comando set realiza una labor triple. Cuando se utiliza con la lnea de comandos, como suele ser el caso, el comando se utiliza para establecer, o anular las banderas de shell. Observe el cuadro siguiente con las banderas ms utilizadas y sus opciones. Cuando se llamado sin argumentos, el comando set visualiza todas las variables de shell y sus valores (como se describi en una leccin anterior). El ltimo uso del comando incorporado se utiliza en la escritura de shell y por ahora puede hacerse caso omiso sin ningn problema. Table 1. Banderas de la shell que el comando interno set utiliza. Bandera -f -n Efecto Inhabilita la expansin de nombres de ruta (comodn) Lee comandos pero no los ejecuta (se usa para revisar sintaxis en los scripts). Establece la opcin especificada. Algunas de las opciones ms comunes incluyen lo siguiente. emacs Emplea lneas de comandos con enlaces de teclas del estilo emacs ignoreeof No sale de la shell cuando se lee EOF (CTRL-D) vi Usa enlaces clave de lnea de comando del estilo vi -v -x -C Imprime comandos como se leen (til para depurar scripts) Imprime comandos despues de aplicadas las expansiones (til para depurar scripts y examinar expansiones de la shell) No le permite a la shell reescribir archivos en redireccin.

-o
nombredeopcin

El comando set con la sintaxis normal de las opciones (tal como set -x) habilita la bandera especificada. Para inhabilitar la bandera, remplace el guin (-) por un signo ms

47

La shell bash (+) (tal como set +x). La lista de opciones establecidas puede almacenarse en la variable de shell $-. Por ejemplo, a continuacin, madonna temporalmente inhabilita el comodn de archivo (habilitando la bandera de shell -f) y luego restaurando el comodn de archivo (inhabilitando el mismo).
[madonna@station madonna]$ set -f [madonna@station madonna]$ ls /etc/*.conf ls: /etc/*.conf: No such file or directory [madonna@station madonna]$ set +f [madonna@station madonna]$ ls /etc/*.conf /etc/aep.conf /etc/lftp.conf /etc/pnm2ppa.conf /etc/aeplog.conf /etc/libuser.conf /etc/pwdb.conf /etc/cdrecord.conf /etc/logrotate.conf /etc/resolv.conf /etc/esd.conf /etc/lpd.conf /etc/rndc.conf ...

No se preocupe si no entiende an los efectos de todas las banderas de shell. En su lugar, asegrese de saber cmo se utiliza el comando set para habilitar o inhabilitar una bandera si es necesario. Si en una leccin posterior le dijeran "esta accin puede inhabilitarse al configurar la bandera -H de shell ", usted sabr cmo hacerlo. Opciones de la shell: el comando interno shopt El comando bash tambin tiene una segunda serie de variables de configuracin, las cuales se conocen como "opciones de shell". Estas se establecen y se anulan mediante el comando shopt donde shopt -s nombreopcinestablece la opcin nombreopcin, y shopt -u nombreopcin anula la opcin. El comando shopt nombreopcin visualiza el estado actual de la opcin, mientras que solo shopt visualiza todas las opciones de la shell. Algunas de las opciones de shell ms fciles de entender estn listadas en el cuadro siguiente. Table 1. Opciones de la shell bash Opcin cdspell Efecto Intenta corregir palabras mal escritas de los nombres de directorios cuando utiliza el comando incorporado cd. Habilita sintaxis coincidente de patrones de comodines extendidos No considera el caso cuando se aplican comodines de archivo.

expand_aliases Habilita alias de shell extglob nocaseglob

Lo anterior se presenta a manera de ejemplos. Revise la pgina de manual de bash(1) para obtener una lista completa. A continuacin, madonna examina el estado de la opcin de shell cdspell, lo habilita y luego el de cd en el directorio /etc con un deletreo descuidado.

48

La shell bash
[madonna@station madonna]$ shopt cdspell cdspell off [madonna@station madonna]$ shopt -s cdspell [madonna@station madonna]$ cd /ect /etc

Una vez all, descubre que la opcin de shell solo efecta el comando interno de cd. El comando ls, por ejemplo, que no es un incorporado de shell, no se afecta por esta opcin. Despus de observar este hecho, madonna, inhabilita la opcin cdspell.
[madonna@station etc]$ ls -d /ect ls: /ect: No such file or directory [madonna@station etc]$ shopt -u cdspell [madonna@station etc]$ cd /ect -bash: cd: /ect: No such file or directory

Se estar preguntando cmo recordar todas estas opciones y cmo recordar cules se modifican con set y cules con shopt. La respuesta es que no es necesario. Recuerde sin embargo, que hay dos mecanismos para establecer banderas de shell y opciones de shell (set y shopt, respectivamente) y recuerde dnde buscar informacin sobre cada una (el comando help y la pgina de manual bash(1)). Ejemplos Alias predeterminados en Red Hat Enterprise Linux La configuracin predeterminada en Red Hat Enterprise Linux proporciona varios usos ilustrativos de alias. Tras iniciar sesin en el comando alias se revela lo siguiente.
[madonna@station madonna]$ alias alias l.='ls -d .* --color=tty' alias ll='ls -l --color=tty' alias ls='ls --color=tty' alias vi='vim' alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

El primer alias, l., se utiliza para listar todos los archivos ocultos (aquellos que comienzan por ".") en el directorio actual.
[madonna@station madonna]$ l. . .bash_profile .xauthxLTmDk .. .bashrc .bash_history .fonts.cache-1 .bash_logout .gconf .gconfd .gnome .gnome2 .gnome2_private .gnome-desktop .gtkrc .kde .viminfo

Observe que la shell bash ejecuta la expansin de nombre de ruta despus de expandir el alias, para que .* sea remplazado por cada archivo en el directorio local que comienza con ".".

49

La shell bash El segundo alias, ll, provee una forma ms fcil para invocar el comando ls con su opcin de lnea de comando ms usada -l. El tercer alias, ls, en efecto cambia la conducta por defecto del comando ls, para que cada invocacin de ls incluya la opcin de lnea de comandos --color=tty. Si consideramos cmo bash evala alias, alguna redundancia se descubre. Cuando un usuario ejecuta ll, bash expande el alias a ls -l --color=tty. La shell de bash luego examina la primera palabra de la expansin, ls, la cual es en s misma un alias. La expansin de alias resulta en ls --color=tty -l --color=tty. Puesto que el alias ls se expandi al comando cuya primera palabra fue otra vez ls, bash no intenta otras expansiones de alias. Sin embargo, la expansin resultante ll especifica dos veces -color=tty. La bandera de shell bash "x" es til para descubrir estos tipos de problemas. Cuando sea habilitado, cada comando se imprime en pantalla (con un prefijo "+") despus de que todos los alias y expansiones se hayan aplicado.
neas [madonna@station madonna]$ set -x ++ echo -ne '\033]0;madonna@station:~\007' [madonna@station madonna]$ ll + ls --color=tty -l --color=tty total 12 drwx-----2 madonna madonna 4096 Aug 26 16:23 bin -rw-rw-r-1 madonna madonna 76 Aug 26 16:10 hello.c drwxr-xr-x 4 madonna madonna 4096 Jul 21 17:05 networking ++ echo -ne '\033]0;madonna@station:~\007' [madonna@station madonna]$ set +x + set +x [madonna@station madonna]$

Infortunadamente, al habilitar la bandera "x" de la shell genera lneas complejas reflejando la generacin de cada intrprete de comandos, pero expandido totalmente el ls --color=tty -l --color=tty se ve con claridad que es en realidad ejecutado como resultado del comando ll. El cuarto alias, vi, se utilliza para reasignar un comando empleado para una implementacin alterna. Uno de los editores ms comunes de Linux (y Unix) es el editor vi. Red Hat Enterprise Linux se distribuye con una versin mejorada de vi, conocida como vim (para "Vi IMproved"). Con el fin de hacer uso transparente del editor mejorado, el comando ms utilizado vi ha sido reasignado. El ltimo alias crea un delimitador para el comando which, para que los alias tambin sean reportados como sitios de archivos ejecutables hallados en la ruta de un usuario. Uso de alias para crear comandos rm, mv, y cp ms seguros El examen de los usos de las opciones de los comandos rm, mv y cp revela que todos comparten la opcin -i que se utiliza para invocar un modo interactivo. Cuando se utiliza, estos comandos le pedirn al usuario confirmacin antes de ejecutar una

50

La shell bash operacin que causara la prdida de informacin (tal como los comandos comodines cp o mv de un archivo de destino ya existente o cualquier uso del comando rm). El uso de la opcin -i se ilustra a continuacin.
[madonna@station madonna]$ date > a [madonna@station madonna]$ date > b [madonna@station madonna]$ cp -i a b cp: overwrite `b'? y [madonna@station madonna]$ mv -i a b mv: overwrite `b'? y [madonna@station madonna]$ rm -i b rm: remove regular file `b'? y

Muchos administradores de sistemas establecen alias por defecto para estos comandos, para que cada invocacin de estos comandos sea una invocacin interactiva.
[madonna@station madonna]$ alias cp="cp -i" mv="mv -i" rm="rm -i" [madonna@station madonna]$ alias cp mv rm alias cp='cp -i' alias mv='mv -i' alias rm='rm -i' [madonna@station madonna]$ date > a [madonna@station madonna]$ date > b [madonna@station madonna]$ cp a b cp: overwrite `b'? y [madonna@station madonna]$ rm a b rm: remove regular file `a'? y rm: remove regular file `b'? y

En Red Hat Enterprise Linux, la cuenta de root tiene dichos alias establecidos por defecto. Sin embargo, los usuarios estndar, pueden configurar estas protecciones por su cuenta si as lo desean. Cada uno de estos comandos tambin viene con la opcin -f para "forzar" la conducta requerida. Dado que la opcin -f anula la opcin -i y puede emplearse para evitar la aburridora interrogacin al suprimir un gran nmero de archivos. Uso de alias para crear marcadores de tiempo La usuaria madonna quiere saber cul de sus archivos y directorios "ocultos" en su directorio de inicio son creados o modificados por aplicaciones que ella ejecuta. Quisiera saber una forma fcil de controlar cules archivos se crean o cambian antes o despus de ciertas operaciones. Ella sabe que el comando find implementa un criterio newer, el cual listar todos los archivos que han sido modificados antes que un archivo especificado. Deseara crear dos alias. El primero llamado Para crear el primer alias, primero dedica un poco de su tiempo a la lectura de la pgina de manual date(1) y determina que el siguiente comando generar el nombre de archivo apropiado para el archivo marcador de tiempo.
[madonna@station madonna]$ date +timestamp.%H:%M:%S

51

La shell bash
timestamp.19:30:23

Para crear los alias, agrega las dos lneas siguientes a su directorio ~/.bashrc. Observe el uso de la sustitucin de comandos para determinar el tiempo actual en el primer alias.
alias ts="touch $(date +timestamp.%H:%M:%S)" alias tsc="find . -newer"

Abre una nueva shell (para que el .bashrc modificado tenga efecto), y ensaya sus nuevos alias. Primero utiliza ts para crear un archivo marcador de tiempo.
[madonna@station madonna]$ ts [madonna@station madonna]$ ls bin hello.c networking timestamp.19:39:18

El alias ts parece funcionar, creando el archivotimestamp.19:39:18. Luego hace clic derecho en la ventana secundaria del escritorio Gnome y elige "Nuevo Folder" desde el menu emergente. Un folder recin creado untitled folder aparece en su ventana del escritorio. A continuacin ejecuta el alias tsc especificando su archivo marcador de tiempo recin creado como el archivo con el que se compara.
[madonna@station madonna]$ tsc timestamp.19:39:18 ./.gnome-desktop ./.gnome-desktop/untitled folder ./.nautilus/metafiles ./.nautilus/metafiles/file:%2F%2F%2Fhome%2Fmadonna%2F.gnomedesktop.xml

Como se esperaba, el alias lista todos los archivos que han sido modificado ms recientemente que el archivo marcador de tiempo especificado. Observando que un archivo titulado untitled folder fue creado en un subdirectorio llamado .gnomedesktop, madonna asume (correctamente) que el directorio ~/.gnome-desktop contiene todos los elementos que se muestran en el escritorio de Gnome. Ella quiere sondear un poco ms, esta vez explorando la conducta de la papelera. Decide crear un nuevo archivo marcador de tiempo, mover su nueva carpeta a la papelera y luego buscar archivos modificados relativos a sus nuevo archivo marcador de tiempo.
[madonna@station madonna]$ ts [madonna@station madonna]$ ls bin hello.c networking timestamp.19:39:18

Asombrada, madonna no ve su nuevo archivo. Examina la hora modificada del archivo original ejecutando un ls -l.
[madonna@station madonna]$ ls -l timestamp.19:39:18 -rw-rw-r-1 madonna madonna 0 Sep 1 19:42 timestamp.19:39:18

52

La shell bash Extraamente, la hora modificada del archivo implica que se ha modificado aproximadamente tres minutos despus de su tiempo de creacin hallado en el nombre del archivo. Explorando an ms madonna confirma el alias ts.
[madonna@station madonna]$ alias ts alias ts='touch timestamp.19:39:18'

Ahora madonna entiende el problema. Vuelve a llamar la lnea desde su directorio ~/.bashrc donde defini el alias ts:
alias ts="touch $(date +timestamp.%H:%M:%S)"

Aunque intent la sustitucin de comandos date para que se produjera cada vez que se invocara el alias Para confirmar sus instintos, edita su archivo~/.bashrc, renombrando el alias ts ts_incorrect y agregando la siguiente lnea.
alias ts_correct='touch $(date +timestamp.%H:%M:%S)'

Esta vez, el alias se define mediante comillas sencillas, evitando que la sustitucin de comandos sea evaluada al crearse el alias. Despus de comenzar una nueva shell (para que ~/.bashrc surta efecto), madonna confirma sus definiciones de alias.
[madonna@station madonna]$ alias ts_incorrect ts_correct alias ts_incorrect='touch timestamp.19:47:18' alias ts_correct='touch $(date +timestamp.%H:%M:%S)'

Ahora, al utilizar ts_correct, la sustitucin de comandos se realiza cuando se invoca el alias (contrario a cuando ste se define). Esta es la conducta que madonna deseaba. Luego sigue explorando para saber qu archivos se modifican al utilizar la aplicacin de la papelera Nautilus.
[madonna@station madonna]$ ts_correct [madonna@station madonna]$ ls bin hello.c networking timestamp.19:39:18

timestamp.19:48:12

Despus de arrastrar el icono untitled folder del escritorio al icono basura, busca de nuevo archivos modificados.
[madonna@station madonna]$ tsc timestamp.19:48:12 ./.gnome-desktop ./.nautilus/metafiles ./.nautilus/metafiles/file:%2F%2F%2Fhome%2Fmadonna%2F.gnomedesktop.xml ./.nautilus/metafiles/file:%2F%2F%2Fhome%2Fmadonna%2F.Trash.xml ./.Trash

Aparentemente, la carpeta fue removida del directorio .gnome-desktop a la carpeta .Trash, (el archivo untitled folder no es listado, porque el hecho de mover un

53

La shell bash archivo de un directorio a otro no afecta la hora modificada del archivo, slo las horas modificadas de los directorios.) Ejercicios en lnea Lab Exercise Objetivo: laboratorio de prctica Tiempo estimado: 15 minutos. Especificaciones Edite su archivo ~/.bashrc para que las shellsbash recin creadas tengan las siguientes propiedades. 1. El alias dir ejecuta el comando ls -l. 2. El alias globoff inhabilita la expansin de nombre de ruta (habilitando la bandera de shell apropiada). 3. El alias complementario globon habilita la expansin del nombre de ruta (inhabilitando la bandera de shell apropiada). 4. Al redireccionar la salida a un archivo, la shell bash no sobrescribir un archivo existente. 5. La shell tiene la opcin de shell cdspell habilitada. 6. El comando rm es un alias para rm -i. Ejercicio de desafio El siguiente ejercicio debe completarse como un ejercicio de desafio. No ser calificado por el script automtico de calificacin. Configure el intrprete primario para que contenga el nmero de historial y el cdigo de salida del comando previamente ejecutado, separado por un : (sin espacios). La coma debera ser la nica coma incluida en el intrprete. Si est bien configurado, el intrprete debera tener una conducta igual a la siguiente. Observe con cuidado la conducta del intrprete de comandos despus de un comando con xito, despus de un comando fallido, y cmo se relaciona con el nmero de historial del comando previamente ejecutado.
[madonna@station madonna] /tmp [madonna@station madonna] ls: /TMP: No such file or [madonna@station madonna] ... 41 ls -d /tmp 42 ls -d /TMP 43 history 40:0 $ ls -d /tmp 41:0 $ ls -d /TMP directory 42:1 $ history

54

La shell bash
[madonna@station madonna] 43:0 $ !42 ls -d /TMP ls: /TMP: No such file or directory [madonna@station madonna] 44:1 $

Deliverables A title Question 1

Un archivo ~/.bashrc bien configurado, de tal forma que shells bash recin iniciadas tengan las siguientes caractersticas. 1. 2. 3. 4. 5. 6. El alias dir ejecuta ls -l El alias globoff inhabilita las expansiones de nombre de ruta. El alias globon habilita expansiones del nombre de ruta. Al redireccionar la salida, la shell no sobrescribir los archivos existentes. La shell tiene habilitada la opcin de shell cdspell. Un alias rm, el cual ejecuta el comando rm -i.

Captulo 6 Lectura de scripts de shell e inicializacin de shell Conceptos clave


Los scripts de shell son ledos con el comando source o con .. Todos los scripts de shell se ejecutan en la misma shell que lee el script. Las shells bash pueden ser tanto shells de inicio como de no inicio. Las shells bash pueden ser tanto shells interactivas como no-interactivas. /etc/profile, archivos dentro del directorio /etc/profile.d y ~/.bash_profile ledos en el arranque de cada shell de inicio de sesin. /etc/bashrc y ~/.bashrc se leen en el arranque de cada shell de inicio. ~/.bash_logout es leda por cada salida de shell de inicio de sesin.

Hasta el momento en este cuaderno, hemos estado utilizando el archivo ~/.bashrc como si fuera el nico archivo que pudiera ser usado para personalizar la shell bash. Esto nos ha permitido enfocarnos en temas, tales como los alias y expansiones de shell, sin complicarnos con detalles de scripts e inicializacin de shell, a riesgo de dejar al estudiante con la impresin de que el archivo ~/.bashrc es el nico que puede utilizarse para personalizar la shell bash. Si esta es la impresin que se ha dado, el propsito de esta leccin es cambiar esa idea.

55

La shell bash En esta leccin, discutiremos cmo se pueden leer los scripts de shell y cules scripts se leen por defecto en el arranque con Red Hat Enterprise Linux. El saber qu scripts son ledos en el arranque, le permite a los usuarios aplicar automticamente muchas de las personalizaciones aprendidas en lecciones anteriores. Lectura de scripts La shell bash permite a los usuarios coleccionar mltiples comandos dentro de un slo archivo y luego ejecutar los comandos como si fueran tecleados directamente en ese intrprete. Esto se conoce como leer el archivo. De modo apropiado, el comando usado para leer un archivo es el comando interno de shell source. Como ejemplo, blondie deseara explorar diferentes estilos de intrpretes de shell. Para ayudar a comparar, utiliza un editor para crear un archivo de texto llamado prompts.script. Agrega varias lneas, cada una proporcionando una definicin diferente para la variable PS1. Por ltimo, comenta todo menos la primera lnea.
[blondie@station blondie]$ cat prompts.script PS1="whadda you want? " #PS1="\a\u@\H \$(date --iso-8601) \t [\!] \$ " #PS1="[\u@\h \W]\$ "

Con el fin de ensayar el primer intrprete, lee el archivoprompts.script.


[blondie@station blondie]$ source prompts.script whadda you want?

Tras originar el archivo, la variable PS1 se modifica como si el contenido del script fuera tecleado en la lnea de comando. Este punto importante merece repeticin: cuando se originan los scripts de shell, el contenido del script se ejecuta (y puede modificarse) dentro de la shell actual. Luego, blondie edita prompts.script, comentando la primera lnea y sin comentar la segunda. Luego lee el script otra vez.
whadda you want? cat prompts.script #PS1="whadda you want? " PS1="\a\u@\H \$(date --iso-8601) \t [\!] \$ " #PS1="[\u@\h \W]\$ " whadda you want? source prompts.script blondie@station.example.com 2003-09-02 05:55:35 [15] $

Edita de nuevo el archivo, comentando la segunda lnea y dejando de comentar la ltima (que restaura su intrprete al predeterminado de Red Hat Enterprise Linux).
blondie@station.example.com 2003-09-02 05:57:07 [16] $ cat prompts.script #PS1="whadda you want? " #PS1="\a\u@\H \$(date --iso-8601) \t [\!] \$ " PS1="[\u@\h \W]\$ "

56

La shell bash Como un atajo, la shell bash tambin tiene un comando interno llamado ., el cual es un sinnimo para el comando source. Esta vez, blondie hace uso de su atajo al originar el archivo.
blondie@station.example.com 2003-09-02 05:57:09 [17] $ . prompts.script [blondie@station blondie]$

(Algo confuso, la palabra . adquiere diferentes significados en diferentes contextos. Cuando . aparece como la primera palabra en la lnea, es sinnimo del comando source. Cuando . aparece en cualquier otra parte, es el directorio de inicio actual) Inicializacin de bash Shells de Inicio, no inicio, interactivas y no interactivas Habiendo aprendido cmo leer scripts de shell de modo arbitrario, ahora volvemos la atencin a la inicializacin de bash, la cual tiende a ser un tema demasiado complicado. Despus de describir la secuencia de arranque, el proceso ser resumido en una forma ms sucinta. Para comenzar a distinguir sutilmente entre diferente tipos de shells: shells deinicio y no-inicio, y shells interactivasy no-interactivas. Como el nombre lo dice, las shells de inicio de sesin son la primera shell que usted ve cuando inicia sesin en una mquina. Cuando usted inicia utilizando la consola virtual o dentro de una mquina remota, su primera shell interactiva es una shell de inicio. Cuando inicie mediante el entorno grfico X, la shell no vista utilizada para empezar su inicializacin X es una shell de inicio de sesin. Cada shell de por medio se conoce como una shell de no-inicio de sesin. Con qu frecuencia ve shells de no-inicio de sesin? Por todas partes. Obviamente, si usted fuera a iniciar manualmente una subshell, sta sera una shell de no-inicio. Cada vez que usted abre una nueva terminal en un entorno grfico X, la shell es una shell de no-inicio. Cada vez que usted usa la sustitucin de comandos o comandos de grupo entre parntesis, o ejecuta scripts de shell (como se describir en la siguiente leccin), se crea una nueva shell de inicio de sesin. Adems, las shells pueden ser interactivas o no-interactivas. Usualmente, las subshells iniciadas de forma manual o las shells en terminales X recin abiertas, son shells interactivas. Las shells invocadas como resultado de una sustitucin de comandos y similares son shells no-interactivas. El siguiente cuadro ayudar a distinguir los diferentes tipos de shells. Table 1. Diferentes tipos de shells bash Shell de inicio Shell de sesin? interactiva? Shells de inicio de sesin desde consolas virtuales Si Si Contexto

57

La shell bash Contexto Shells de inicio de sesin cuando se inicie dentro de una mquina a travs de la red Shell de inicializacin X Shell de terminal X subshell iniciada al ejecutar manualmente bash subshell utilizada en sustitucin de comandos subshell utilizada para comandos agrupados en () subshell utilizada al ejecutar scripts Shell de inicio de sesin? Si Si No No No No No Shell interactiva? Si Si Si Si No No No

El cuadro de arriba lista los predeterminados para Red Hat Enterprise Linux. Diferentes conductas pueden invocarse al especificar explcitamente ciertas opciones de lnea de comandos. Vea la pgina del manual de bash(1) para obtener mayor informacin. Scripts bash de arranque Cul es la diferencia entre una shell de inicio de sesin y una shell de no-inicio de sesin? o entre una shell interactiva y una no-interactiva? Principalmente, las shells difieren en qu archivos de inicializacin se leen tras el inicio. A continuacin, se indicar el bash de inicializacin de shell como se presenta en Red Hat Enterprise Linux. Shells de inicio de sesin Tras el arranque, las shells de inicio de sesin primero leen el archivo /etc/profile. En Red Hat Enterprise Linux, este archivo inicializa varias variables de entorno tales como PATH, USER, HOSTNAME, y HISTSIZE. El script /etc/profile luego origina todos los archivos coincidentes al patrn [1] /etc/profile.d/*.sh. Luego, la shell bash busca una serie de archivos en el directorio de inicio del usuario, y lee la primera que existe. En Red Hat Enterprise Linux, el archivo por defecto es ~/.bash_profile. La version por defecto de este archivo apenas agrega $HOME/bin al PATH del usuario, y busca y origina el archivo~/.bashrc descrito a continuacin. Shells de no-inicio de sesin (interactivas) En lo que concierne al programa bash, el nico archivo utilizado para personalizar shells de no-inicio de sesin es el archivo ~/.bashrc hallado en el directorio de inicio del usuario. En la configuracin por defecto de Red Hat Enterprise Linux, la nica personalizacin que este archivo realiza es buscar y leer el archivo /etc/bashrc.

58

La shell bash El archivo global /etc/bashrc realiza varias operaciones, incluso establece la usmask por defecto del usuario y define la variable PS1 (la cual define el prompt de shell). Shells de no-inicio de sesin (no interactivas) Las shells no-interactivas de no-inicio de sesin no leen por defecto ninguno de los archivos de arranque (aunque esta conducta puede cambiarse estableciendo la variable de entorno BASH_ENV. Para mayor informacin ver la pgina de manual bash(1)). Figure 1. Archivos de configuracin de arranque bash

Por qu hay shells de inicio de sesin y shells de no inicio de sesin? Por qu tanta complejidad? Al arrancar, los varios scripts de arranque ledos por shells de inicio tienden a emplear mucho tiempo personalizando variables de entorno (tales como el PATH, HISTSIZE del usuario, etc). No obstante, cuando las subsehells se inician,

59

La shell bash no se necesita repetir todo este trabajo. Siempre que un proceso hijo es generado por la shell de inicio de sesin, sea sta una subshell u otro caso, las variables de entorno se copian automticamente en el hijo (por el kernel de Linux). Si la subshell luego lee los mismos scripts de arranque como su shell de inicio del padre, el esfuerzo de inicializar variables de entorno se duplicara sin necesidad. Por lo tanto, con el fin de agilizar los tiempos de arranque, las shells de no-inicio intentan acortar el proceso. Otras personalizaciones de shell, principalmente los alias, son conceptos especficos de bash, no de nivel de kernel y deben reinicializarse cada vez que se inicie una nueva shell. Al examinar los scripts de arranque listados arriba, observe que los archivos /etc/profile y ~/.bash_profile son ledos olo por las shells de inicio de sesin, mientras que los archivos ~/.bashrc y /etc/bashrc son ledos por todas las shells (de inicio y no-inicio). Los dos archivos anteriores suelen utilizarse para configurar variables de entorno, porque slo tienen que ser inicializadas una vez. Mientras que los dos ltimos archivos se utilizan para personalizaciones especficas de la shell tales como alias y opciones de shell. Observe la simetra. Para la configuracin de variables de entorno, hay un archivo de arranque global (/etc/profile) y un archivo de arranque local (~/.bash_profile). El primero puede utilizarse por el administrador del sistema para establecer la configuracin de todo el sistema. El ltimo lo pueden utilizar usuarios individuales para personalizar su propio entorno. Una situacin parecida se presenta con /etc/bashrc y ~/.bashrc. Table 1. Archivos de configuracin de arranque bash Archivo
/etc/profile /etc/profile.d/*.sh ~/.bash_profile ~/.bashrc /etc/bashrc

Tipo de shell Shells de inicio de sesin Shells de inicio de sesin Shells de inicio de sesin Todas las shells interactivas Todas las shells interactivas

Uso previsto Variables de entorno globalmente tiles Variables de entorno de paquetes especficos Variables de entorno de usuarios especficos Alias de usuario especfico, funciones de shell y opciones de shell Alias globales, funciones de shell y opciones de shell

Por qu hay shells interactivas y no-interactivas? Las shells no-interactivas son shells iniciadas como resultado de ejecutar un script (ver la siguiente leccin), usando parntesis para agrupar comandos o usando sustitucin de comandos. Con el fin de evitar posibles efectos secundarios del script de arranque, las shells no-interactivas no leen scripts de arranque tras el inicio.

60

La shell bash Salida de las shells de inicio de sesin: ~/.bash_logout Tras la salida, las shells de inicio de sesin leern el archivo ~/.bash_logout si existe. En Red Hat Enterprise Linux, el archivo simplemente ejecuta el comando clear para que la pantalla se limpie de informacin tras la salida. Ejemplos El comando su revisitado En un cuaderno anterior, presentamos el comando su como una forma de cambiar el userid (cambiar el id del usuario). En ese momento, introdujimos dos modos de usar el comando su. El primero era simplemente su nombredeusuario, el cual inicia una nueva shell de no-inicio como el nuevo usuario. El segundo es ejecutar su nombredeusuario, el cual inicia una shell de inicio de sesin como el nuevo usuario. Con el fin de explorar las implicaciones de estos dos modos haremos que blondie agregue la siguiente lnea a su archivo ~/.bash_profile.
echo "~/.bash_profile sourcing"

Del mismo modo, agrega la siguiente lnea a su archivo ~/.bashrc.


echo "~/.bashrc sourcing"

Ahora haremos que el usuario elvis haga su en blondie usando ambas formas.
[elvis@station elvis]$ su blondie Password: ~/.bashrc sourcing [blondie@station elvis]$ exit exit [elvis@station elvis]$ su - blondie Password: ~/.bashrc sourcing ~/.bash_profile sourcing

En el primer caso, slo el archivo ~/.bashrc fue ledo. En el segundo caso, tanto ~/.bash_profile como ~/.bashrc son ledos. De modo explcito, ejecutando source en /etc/profile y ~/.bash_profile A menudo en este cuaderno y en las direcciones de Linux (y Unix), en general, se les pide a los usuarios "salir e ingresar otra vez" para que los cambios de configuracin surtan efecto. Esto suele darse porque al instalar un nuevo software o algn otro cambio se han alterado los archivos de configuracin del usuario (o del sistema) bash y las direcciones desearan que el usuario reiniciara la shell para que los archivos de arranque sean ledos otra vez.

61

La shell bash A menudo, los usuarios pueden evitarlo releyendo los archivos clave de configuracin en su lugar. Por ejemplo, si blondie sospecha que un cambio ha ocurrido en el sistema de archivos de arranque bash, podra leer de modo manual el archivo /etc/profile.
[blondie@station blondie]$ . /etc/profile

De otro modo, si blondie sospecha que sus archivos de arranque locales bash han cambiado, entonces puede leer su archivo de configuracin local bash manualmente.
[blondie@station blondie]$ . ~/.bash_profile

(Observe que esto no funcionara para todos los cambios de configuracin, sino slo para aquellos relacionados con la shell bash. Por ejemplo, si una membresa de grupo de usuarios ha cambiado, entonces el usuario s tiene que salir e ingresar otra vez para que los cambios surtan efecto) Ejercicios en lnea Lab Exercise Objetivo: Configurar los scripts de arranque bash Estimated Time: 10 mins. Especificaciones 1. Agregue la siguiente lnea a su archivo de arranque ~/.bashrc.
echo "sourcing ~/.bashrc"

2. Agregue la siguiente lnea a su archivo de arranque ~/.bashrc.


echo "sourcing ~/.bash_profile"

3. Agregue la siguiente lnea a su archivo ~/.bash_logout.


rm -fr ~/.Trash/*

Deliverables A title Question 1

1. Una shell bash que tras el arranque de una shell de no-inicio de sesin emita el mensaje sourcing ~/.bashrc 2. Una shell bash que tras el arranque de una shell de inicio de sesin emita los

62

La shell bash mensajes sourcing ~/.bashrc y sourcing ~/.bash_profile. 3. Una shell bash que tras la salida de una shell de inicio de sesin suprima el contenido (no-oculto) de la papelera de Nautilus.

S-ar putea să vă placă și