Este artículo le brinda una breve introducción a algunas de las características más importantes del shell bash, y abarca los siguientes temas:
- Interacción con shells y comandos mediante la línea de comandos
- Comandos y secuencias de comandos válidos
- Definición, modificación, referencia, y exportación de variables de entorno
- Historial de comandos y facilidades de edición
- Invocación de comandos dentro y fuera de la ruta
- Uso de páginas man (manuales) para aprender sobre los comandos
Este artículo lo ayuda a preparar los Objetivos 103.8 del Tema 103 del examen 101 de Administración Nivel Junior de Linux (LPIC-1). Este objetivo tiene un valor de ponderación de 4. El contenido de este artículo corresponde a los objetivos del examen 101 de Abril de 2009 objectives for exam 101. Siempre debería consultar los objetivos para conocer los requisitos definitivos.
El shell bash es uno de los numerosos shells disponibles para Linux. También denominado Bourne-again shell, en honor a Stephen Bourne, creador del shell inicial (/bin/sh). Bash es básicamente compatible con sh, pero además proporciona varias mejoras tanto en las capacidades de las funciones como en las de programación. Bash incorpora características del shell Korn (ksh) y del shell C (csh), y and ha sido pensado para ser compatible con el shell POSIX.
Antes de ahondar en bash, recuerde que un shell es un programa que acepta y ejecuta comandos. También soporta construcciones de de programación que permiten la construcción de comandos complejos a partir de partes más pequeñas. Estos comandos complejos, o scripts, pueden guardarse para convertirse en nuevos comandos. De hecho, muchos de los comandos en un sistema Linux típico son scripts.
Los shells tienen algunos comandos incorporados como
cd, break, y
exec. Otros comandos son externos.
Los shells también utilizan tres streams de entrada y salida estándar:
- stdin es el flujo de entrada estándar, que proporciona los datos de entrada a los comandos.
- stdout es el flujo de salida estándar, que muestra los datos de salida de los comandos.
- stderr es el flujo de error estándar, que muestra los datos de salida de error de los comandos.
Los flujos de entrada proporcionan datos de entrada a los programas, generalmente a partir de la pulsación de las teclas de la terminal. Los flujos de salida imprimen caracteres de texto, generalmente a la terminal. La terminal era en un principio una máquina de escribir ASCII o una terminal de visualización, pero ahora por lo general se trata de una ventana o un escritorio gráfico.
En otro artículo de esta serie series.
podrá encontrar más detalles sobre la forma de redireccionar estos flujos estándar de entrada/salida.
De aquí en adelante, asumiremos que usted sabe cómo lograr el aviso del shell. De lo contrario, el artículo developerWorks "Basic tasks for new Linux developers" muestra cómo hacer esto y otras cosas.
Si usted utiliza un sistema Linux sin escritorio gráfico, o si usted abre la ventana de una terminal en un escritorio gráfico, usted verá un aviso, quizá igual a los señalados en el Listado 1.
Listado 1. Algunos avisos típicos de usuario
[db2inst1@echidna db2inst1]$ ian@lyrebird:~> $ |
Si usted inicia sesión como usuario raíz (o super usuario), el aviso que visualice puede ser similar a alguno de los mostrados en el Listado 2.
Listado 2. Super usuario, o usuario raíz, ejemplos de avisos
[root@echidna ~]# lyrebird:~ # # |
El poder que tiene el usuario raíz es importante, por lo cual hay que ser cuidadoso al utilizarlo. Al tener privilegios raíz, la mayoría de los prompts tienen añadido un signo numeral (#). Los privilegios de usuarios comunes suelen estar delineados con un carácter diferente, generalmente un signo de dólar ($). Su prompt actual puede ser diferente a los ejemplos presentados en este artículo. Su prompt puede incluir su nombre de usuario, nombre de host, directorio actual, fecha u hora de impresión del host, y demás.
Estos artículos incluyen ejemplos de códigos copiados y pegados de sistemas Linux reales por medio de los prompts predeterminados de dichos sistemas. Nuestros prompts raíces poseen un # añadido, por lo cual usted puede distinguirlos de los prompts de usuarios comunes, los cuales tienen un $ añadido. Esta convención es consistente con muchos libros que tratan el tema. Si le parece que algo no funciona, verifique el prompt que aparece en el ejemplo.
Entonces ahora que tenemos un prompt, veamos qué puede hacer con él. La función principal del shell es interpretar los comandos de manera que usted pueda interactuar con su sistema Linux. En los sistemas Linux (y UNIX®), los comandos tienen un nombre de comando, y cuentan con opciones y parámetros. Algunos comandos no poseen ni opciones ni parámetros, y otros tienen sólo uno de los dos..
Cuando una línea contiene un carácter #, el resto de los caracteres de la línea se ignora. Entonces, un carácter # puede indicar tanto un comentario como un prompt raíz. El contexto indicará de cuál de los dos se trata.
El comando echo imprime sus argumentos (o hace eco de los mismos)
a la terminal tal como se muestra en el Listado 3.
Listado 3. Ejemplos de Echo
[ian@echidna ~]$ echo Word Word [ian@echidna ~]$ echo A phrase A phrase [ian@echidna ~]$ echo Where are my spaces? Where are my spaces? [ian@echidna ~]$ echo "Here are my spaces." # plus comment Here are my spaces. |
En el tercer ejemplo del Listado 3, todos los espacios sobrantes se comprimieron en un único espacio en los datos de entrada. Para evitar esto, usted necesita colocar comillas utilizando comillas dobles (") o simples ('). Bash utiliza el espacio en blanco, como los espacios vacíos, las tabulaciones, y los caracteres de las líneas nuevas, para separar las líneas de entrada en tokens, las que luego se pasan al comando. Al colocar las cadenas entre comillas se conserva el espacio vacío adicional y se convierte a la cadena en un único token. En el ejemplo anterior, cada token posterior al nombre del comando es un parámetro, por lo tanto tenemos 1, 2, 4, y 1 parámetro respectivamente.
El comando echo tiene un par de opciones. Normalmente echo anexa un
carácter de línea nueva a los datos de salida. Utilice la opción
-n para suprimirlo. Utilice la opción
-e para permitir que ciertos caracteres de escape de barra invertida
tengan un significado especial. Algunos de ellos pueden observarse en el Cuadro 1.
Cuadro 1. Echo y caracteres de escape
| Secuencia de escape | Función |
|---|---|
| \a | Alerta (campana) |
| \b | Barra invertida |
| \c | Suprimir nuevas líneas añadidas (cumple la misma función que la opción -n) |
| \f | Avance de página (limpia la pantalla de un visor de video) |
| \n | Nueva línea |
| \r | Retorno de carro |
| \t | Tabulación horizontal |
Escapes y continuación de línea
El uso de barras invertidas en bash provoca un pequeño problema. Cuando el carácter barra invertida (\) no se coloca entre comillas, funciona como un escape para señalarle a bash que conserve el significado literal del carácter a continuación. Esto es necesario en los metacaracteres shell especiales, a los que nos referiremos un poco más adelante. Existe una excepción a esta regla: una barra invertida seguida de una nueva línea provoca que bash saltee ambos caracteres y trate la secuencia como un pedido de continuación de línea. Esto puede resultar de ayuda para romper las líneas largas, en especial en scripts de shell.
Para que las secuencias descriptas más arriba sean correctamente administradas por el comando
echo o alguno de los muchos comandos que
utilizan caracteres de control de escape similares, deben colocar las secuencias de escape
entre comillas o incluirlas en una cadena entre comillas, salvo que usted utilice una
segunda barra invertida para que el shell conserve una para el comando. El listado 4
muestra algunos ejemplos de los distintos usos de \.
Listado 4. Mas ejemplos de echo
[ian@echidna ~]$ echo -n No new line
No new line[ian@echidna ~]$ echo -e "No new line\c"
No new line[ian@echidna ~]$ echo "A line with a typed
> return"
A line with a typed
return
[ian@echidna ~]$ echo -e "A line with an escaped\nreturn"
A line with an escaped
return
[ian@echidna ~]$ echo "A line with an escaped\nreturn but no -e option"
A line with an escaped\nreturn but no -e option
[ian@echidna ~]$ echo -e Doubly escaped\\n\\tmetacharacters
Doubly escaped
metacharacters
[ian@echidna ~]$ echo Backslash \
> followed by newline \
> serves as line continuation.
Backslash followed by newline serves as line continuation.
|
Tenga en cuenta que bash muestra un prompt especial (>) al ingresar una línea entre comillas simples. Su flujo de entrada continúa en una segunda línea e incluye el carácter de la línea nueva.
Metacaracteres y operadores de control del shell bash
Bash posee varios metacaracteres, los cuales, cuando no se colocan entre comillas, también sirven para separar los datos de entrada en palabras. Además del espacio en blanco, estos son:
- |
- &
- ;
- (
- )
- <
- >
Analizaramos algunos de estos con más detalle en otras partes de este artículo. Por ahora, tenga en cuenta que si desea incluir un metacaracter en su texto, debe colocarlo entre comillas o como carácter de escape mediante una barra invertida (\) como se observa en el Listado 4.
La nueva línea y ciertos metacaracteres o pares de metacaracteres también sirven como operadores de control. Estos son:
- ||
- &&
- &
- ;
- ;;
- |
- (
- )
Algunos de estos operadores de control permiten crear secuencias o listas de comandos.
La secuencia de comando más sencilla se compone sólo de dos comandos separados por un punto y coma (;). Cada comando se ejecuta en secuencia. En los entornos programables los comandos devuelven un aviso de éxito o falla; los comandos de Linux por lo general devuelven un valor de cero en los caso de éxito y un valor distinto a cero en caso de falla. Usted puede introducir algún procesamiento condicional en su lista utilizando && y los operadores de control ||. Si usted separa dos comandos con el operador de control && el segundo se ejecuta sólo si el primero devuelve un valor de salida de cero. Si usted separa los comandos con ||, el segundo comando se ejecuta sólo si el primero devuelve un código de salida distinto de cero. El Listado 5 muestra algunas secuencias de comandos que utilizan el comando echo. Estas no son muy interesantes porque el retorno de echo es cero, pero más adelante, cuando podamos utilizar más comandos veremos más ejemplos de esto.
Listado 5. Secuencias de comandos
[ian@echidna ~]$ echo line 1;echo line 2; echo line 3 line 1 line 2 line 3 [ian@echidna ~]$ echo line 1&&echo line 2&&echo line 3 line 1 line 2 line 3 [ian@echidna ~]$ echo line 1||echo line 2; echo line 3 line 1 line 3 |
Usted puede terminar un shell utilizando el comando exit
Usted puede opcionalmente proporcionar un código de salida como parámetro. Si usted está
ejecutando su shell en una ventana terminal en un escritorio gráfico, su
ventana se cerrará. De manera similar, si usted está conectado a un sistema remoto
utilizando ssh o telnet (por ejemplo), su conexión se interrumpirá. En el shell bash
usted puede mantener presionada presionar la tecla Ctrl y presionar la tecla d para
salir.
Analicemos otro operador de control. Si usted adjunta un comando o una lista de comandos entre paréntesis, se ejecuta el comando o la secuencia en un sub shell, y el comando exit saldrá del subshell en lugar de salir de salir del shell en el cual usted está trabajando. El Listado 6 muestra un ejemplo simple de && y de || junto con otros dos códigos exit diferentes.
Listado 6. Subshells y secuencias
[ian@echidna ~]$ (echo In subshell; exit 0) && echo OK || echo Bad exit In subshell OK [ian@echidna ~]$ (echo In subshell; exit 4) && echo OK || echo Bad exit In subshell Bad exit |
Continúe leyendo para encontrar más secuencias de comando en este artículo.
Al ejecutar en un shell bash, muchas elementos constituyen su entorno, como la forma de su prompt, su directorio principal, su directorio de trabajo, el nombre de su shell, los archivos que ha abierto, las funciones que ha definido, etc. Su entorno incluye muchas variables que pueden haber sido establecidas por bash o por usted. El shell bash también le permite tener variables shell, que usted puede exportar a su entorno para ser utilizadas en otros procesos que se están ejecutando en el shell o por otros shells que usted puede haber generado desde el shell actual.
Tanto las variables de entorno como las variables shell tienen un nombre. Usted hace referencia al valor de una variable colocando '$' delante de su nombre. Algunas de las variables de entorno bash que usted encontrará se pueden observar en el Cuadro 2.
Cuadro 2.Algunas variables comunes de entorno bash
| Nombre | Función |
|---|---|
| USER | El nombre del usuario que inició la sesión |
| UID | La id de usuario numérico del usuario que inició sesión |
| HOME | El directorio principal del usuario |
| PWD | El directorio de trabajo actual |
| SHELL | El nombre del shell |
| $ | La id de proceso (o PIDdel proceso de shell bash que se está ejecutando (u otro) |
| PPID | La id de proceso del proceso que inició este proceso (que es, la id del proceso primario) |
| ? | El código de salida del último comando |
El Listado 7 muestra lo que usted podría ver en algunos de estas variables bash comunes.
Listado 7. Variables de entorno y variables shell
[ian@echidna ~]$ echo $USER $UID ian 500 [ian@echidna ~]$ echo $SHELL $HOME $PWD /bin/bash /home/ian /home/ian [ian@echidna ~]$ (exit 0);echo $?;(exit 4);echo $? 0 4 [ian@echidna ~]$ echo $$ $PPID 2559 2558 |
Usted puede crear o establecer una variable shell escribiendo un nombre seguido inmediatamente por un signo igual (=). Si la variable existe, usted la modificará para asignar el nuevo valor. Las variables son capaces de distinguir mayúsculas de minúsculas, por lo tanto var1 y VAR1 son variables diferentes. Por convención, las variables, particularmente las exportadas, se escriben en mayúscula, pero este no es un requisito. En teoria, $$ y $? son parámetros shell, no variables. Éstos sólo pueden referenciarse; usted no puede asignarles un valor.
Al crear una variable shell, usted a menudo deseará exportarla al
entorno de manera que esté disponible para otros procesos que usted
inicie desde este shell. Las variables que usted exporta no se encuentran disponibles
para un shell primario. Usted utiliza el comando export para exportar
el nombre de una variable. Como un atajo en bash, usted puede asignar un valor y
exportar una variable en un sólo paso.
Para ilustrar la asignación y la exportación, ejecutemos el comando bash desde el
shell bash y luego ejecutemos el shell korn (ksh) desde el nuevo shell bash.
Utilizaremos el comando ps para mostrar
la información sobre el comando que se está ejecutando. Analizaremos más en profundidad
nuestro conocimiento de ps en otro de los artículos de esta serie. Vea
Resources for the roadmap..............de las series).
Listado 8. Más variables de entorno y shell
[ian@echidna ~]$ ps -p $$ -o "pid ppid cmd" PID PPID CMD 2559 2558 -bash [ian@echidna ~]$ bash [ian@echidna ~]$ ps -p $$ -o "pid ppid cmd" PID PPID CMD 2811 2559 bash [ian@echidna ~]$ VAR1=var1 [ian@echidna ~]$ VAR2=var2 [ian@echidna ~]$ export VAR2 [ian@echidna ~]$ export VAR3=var3 [ian@echidna ~]$ echo $VAR1 $VAR2 $VAR3 var1 var2 var3 [ian@echidna ~]$ echo $VAR1 $VAR2 $VAR3 $SHELL var1 var2 var3 /bin/bash [ian@echidna ~]$ ksh $ ps -p $$ -o "pid ppid cmd" PID PPID CMD 2840 2811 ksh $ export VAR4=var4 $ echo $VAR1 $VAR2 $VAR3 $VAR4 $SHELL var2 var3 var4 /bin/bash $ exit [ian@echidna ~]$ echo $VAR1 $VAR2 $VAR3 $VAR4 $SHELL var1 var2 var3 /bin/bash [ian@echidna ~]$ ps -p $$ -o "pid ppid cmd" PID PPID CMD 2811 2559 bash [ian@echidna ~]$ exit exit [ian@echidna ~]$ ps -p $$ -o "pid ppid cmd" PID PPID CMD 2559 2558 -bash [ian@echidna ~]$ echo $VAR1 $VAR2 $VAR3 $VAR4 $SHELL /bin/bash |
Notas:
- Al comienzo de esta secuencia, el shell bash tenía el PID 2559.
- El segundo shell bash tiene el PID 2811, y su primario es PID 2559, el shell bash original.
- 3.Creamos VAR1, VAR2 y VAR3 en el segundo shell bash, pero solamente . exportamos VAR2 y VAR3.
- 4.En el shell Korn, creamos VAR4. El comando
echomostró valores sólo para VAR2, VAR3, y VAR4, confirmando que VAR1 no se exportó. ¿Le sorprendió ver que el valor de la variable SHELL no cambió pese al cambio de prompt? No siempre se puede esperar que SHELL le informe bajo qué shell está ejecutando, pero el comandopsle indica el comando real. Tenga en cuenta quepscoloca un guión (-) delante del primer shell bash para indicar que este es el shell de inicio. - Volviendo al segundo shell bash, podemos observar VAR1, VAR2, y VAR3.
- Y por último, al regresar al shell original, ninguna de nuestras nuevas variables existen ya.
En la explicación anterior sobre las comillas mencionamos que usted podía utilizar
comillas simples o dobles. Existe una diferencia importante entre ellas.
El shell expande las variables shell que se encuentran entre comillas dobles ($quot;),
pero esta expansión no se produce en el caso de las variables simples ('). En los ejemplos
anteriores, iniciamos otro shell dentro de nuestro shell y obtuvimos un nuevo id
de proceso. Utilizando la opción -c usted puede pasar un comando
al otro shell, el cual ejecutará el comando y volverá. Si usted
pasa una cadena que se encuentra entre comillas como un comando, su shell externo quitará las
comillas y pasará la cadena. En el caso de comillas dobles, ocurrirá la expansión de las variables
antes de que la cadena pase, de manera que los resultados pueden no ser los esperados.
El shell y el comando se ejecutará en otro proceso de manera que estos tendrán
otro PID. El listado 9 ejemplifica estos conceptos. El PID del
shell bash de nivel superior se encuentra resaltado.
Listado 9. Colocación de comillas y variables shell
[ian@echidna ~]$ echo "$SHELL" '$SHELL' "$$" '$$' /bin/bash $SHELL 2559 $$ [ian@echidna ~]$ bash -c "echo Expand in parent $$ $PPID" Expand in parent 2559 2558 [ian@echidna ~]$ bash -c 'echo Expand in child $$ $PPID' Expand in child 2845 2559 |
Todas las referencias de variables presentadas hasta ahora terminan en espacios en blanco, por lo cual ha sido fácil determinar donde terminaban las mismas. De hecho, los nombres de las variables pueden estar compuestos sólo de letras, números o el carácter guión bajo. El shell sabe que el nombre de una variable termina cuando encuentra otro carácter. Aveces es necesario utilizar variables en expresiones en las cuales el significado es ambiguo. En tales casos, usted puede utilizar llaves para delinear el nombre de una variable tal como se muestra en el Listado 10.
Listado 10. El uso de las llaves en los nombres de las variables
[ian@echidna ~]$ echo "-$HOME/abc-"
-/home/ian/abc-
[ian@echidna ~]$ echo "-$HOME_abc-"
--
[ian@echidna ~]$ echo "-${HOME}_abc-"
-/home/ian_abc-
|
El comando env sin ninguna opción ni parámetro
muestra las variables del entorno actual. Usted puede utilizar este comando también
para ejecutar un comando en un entorno personalizado. La opción
-i (o simplemente -)
limpia el entorno actual antes de ejecutar el comando, mientras que la
opción -u desactiva las variables de entorno que usted
no desea pasar.
El Listado 11 muestra la salida parcial del comando env
sin ningún parámetro y luego tres ejemplos de invocación de
shells diferentes sin el entorno primario. Observe todo esto cuidadosamente
antes de nuestro análisis.
Nota: Si su sistema no tiene el ksh (Korn) o los shells tcsh instalados, usted necesitará instalarlos para realizar estos ejercicios.
Listado 11. El comando env
[ian@echidna ~]$ env HOSTNAME=echidna SELINUX_ROLE_REQUESTED= TERM=xterm SHELL=/bin/bash HISTSIZE=1000 SSH_CLIENT=9.27.206.68 1316 22 SELINUX_USE_CURRENT_RANGE= QTDIR=/usr/lib/qt-3.3 QTINC=/usr/lib/qt-3.3/include SSH_TTY=/dev/pts/3 USER=ian ... _=/bin/env OLDPWD=/etc [ian@echidna ~]$ env -i bash -c 'echo $SHELL; env' /bin/bash PWD=/home/ian SHLVL=1 _=/bin/env [ian@echidna ~]$ env -i ksh -c 'echo $SHELL; env' /bin/sh _=/bin/env PWD=/home/ian _AST_FEATURES=UNIVERSE - ucb [ian@echidna ~]$ env -i tcsh -c 'echo $SHELL; env' SHELL: Undefined variable. |
Observe que bash ha establecido la variable SHELL, pero no la exportó al entorno, aunque existen otras tres variables que ha creado bash en el entorno. En el ejemplo de ksh, tenemos dos variables de entorno, pero nuestro intento de hacer eco del valor de la variable SHELL genera una línea en blanco. Finalmente, tcsh no ha creado ninguna variable de entorno y produce un error ante el intento de referenciar el valor del SHELL.
El Listado 11 mostró diferentes comportamientos de los shells en cuanto al manejo de las variables y
los entornos. Aunque este artículo trata sobre bash, es bueno saber que
no todos los shells se comportan del mismo modo. Además, los shells se comportan de manera diferente
conforme sean o no un shell de inicio de sesión. Por el momento, podemos
decir simplemente que un shell de inicio es aquel que se obtiene al iniciar sesión en
el sistema; se pueden iniciar otros shells para que se comporten como shells de inicio si así se lo desea.
Los tres shells iniciados más arriba utilizando env -i
no son shells de inicio de sesión. Pruebe pasar la opción -l
para el comando shell en sí para ver cuales son las diferencias que se obtienen
de un shell de inicio.
Entonces, considerando nuestro intento por mostrar el valor de nuestra variable SHELL en estos shells de inicio de sesión:
- Al iniciar el bash, éste activó la variable SHELL, pero no la exportó automáticamente al entorno.
- Al iniciar el ksh, éste no activó la variable SHELL. Sin embargo, referenciar una variable de entorno indefinida es equivalente a referenciar una con un valor vacío.
- Al iniciar el tcsh, éste no activó la variable SHELL. En este caso, el comportamiento predefinido es diferente al del ksh (y al del bash), dado que se informa un error al intentar utilizar una variable que no existe.
Usted puede utilizar el comando unset para desactivar una variable y
quitarla de la lista de variables shell. Si la variable se exportó al entorno,
éste la removerá del entorno. Usted puede utilizar el comando set para
controlar muchos aspectos del modo de trabajo de bash (o de otros shells). Set es un comando incorporado
a shell, de modo que varias opciones son específicas para shell. En bash, la opción
-u hace que bash informe errores en caso de
variables indefinidas en lugar de tratarlas como definidas pero vacías. Usted puede
activar las diferentes opciones de set con un
- y desactivarlas con un
+. Usted puede visualizar que se encuentran activas utilizando
echo $-.
Listado 12. Unset and set
[ian@echidna ~]$ echo $- himBH [ian@echidna ~]$ echo $VAR1 [ian@echidna ~]$ set -u;echo $- himuBH [ian@echidna ~]$ echo $VAR1 -bash: VAR1: unbound variable [ian@echidna ~]$ VAR1=v1 [ian@echidna ~]$ VAR1=v1;echo $VAR1 v1 [ian@echidna ~]$ unset VAR1;echo $VAR1 -bash: VAR1: unbound variable [ian@echidna ~]$ set +u;echo $VAR1;echo $- himBH |
Si utiliza el comando set sin ninguna opción,
éste le mostrará todas las variables shell y sus respectivos valores (si los hubiera). También existe
otro comando, declare, que se puede utilizar para
crear, exportar, y visualizar valores de variables shell. Usted puede conocer
el resto de las opciones de set y del comando
declare utilizando las paginas de los manuales. Más adelante
analizaremos las páginas de los manuales.
El último comando que debemos analizar es exec. El comando
exec puede utilizarse para ejecutar otro programa que
reemplace el shell actual. En el Listado 13 se inicia un shell bash
secundario y luego se utiliza exec para reemplazarlo por un
shell Korn. Luego de salir del shell Korn, usted vuelve al shell bash
original (en este ejemplo, PID 2852).
Listado 13. Uso de exec
[ian@echidna ~]$ echo $$
2852
[ian@echidna ~]$ bash
[ian@echidna ~]$ echo $$
5114
[ian@echidna ~]$ exec ksh
$ echo $$
5114
$ exit
[ian@echidna ~]$ echo $$
2852
|
Información de sistema con uname
El comando uname imprime información sobre el
sistema y su kernel. En el Listado 14 se observan todas las opciones para
uname y la información resultante; luego cada opción
se define en el Cuadro 3.
Listado 14. El comando uname
[ian@echidna ~]$ uname
Linux
[ian@echidna ~]$ uname -s
Linux
[ian@echidna ~]$ uname -n
echidna.raleigh.ibm.com
[ian@echidna ~]$ uname -r
2.6.29.6-217.2.3.fc11.i686.PAE
[ian@echidna ~]$ uname -v
#1 SMP Wed Jul 29 16:05:22 EDT 2009
[ian@echidna ~]$ uname -m
i686
[ian@echidna ~]$ uname -o
GNU/Linux
[ian@echidna ~]$ uname -a
Linux echidna.raleigh.ibm.com 2.6.29.6-217.2.3.fc11.i686.PAE
#1 SMP Wed Jul 29 16:05:22 EDT 2009 i686 i686 i386 GNU/Linux
|
| Opción | Descripción |
|---|---|
| -s | Imprime el nombre del kernel. En el caso de que no se especifique ninguna opción esto sucederá por defecto. |
| -n | Imprime el nombre del nodo o del dominio. |
| -r | Imprime la actualización del kernel. Esta opción por lo general se utiliza en los comandos de manipulación de módulos. |
| -v | Imprime la versión del kernel. |
| -m | Imprime el nombre del hardware de la máquina (CPU). |
| -o | Imprime el nombre del sistema operativo. |
| -a | Imprime toda la información anterior. |
El listado 14 es de un sistema Fedora 11 ejecutándose en una CPU Intel.® El comando
uname se encuentra disponible en la mayoría de los sistemas UNIX®
y en los similares a UNIX, al igual que en los sistemas Linux. La información impresa dependerá
de la distribución y la versión de Linux así como del tipo de máquina en la cual se ejecute.
El Listado 15 muestra los datos de salida de un sistema AMD Athlon 64 ejecutando
Ubuntu 9.04.
Listado 15. Uso de uname en otros sistemas
ian@attic4:~$ uname -a
Linux attic4 2.6.28-14-generic #47-Ubuntu SMP Sat Jul 25 01:19:55 UTC 2009 x86_64
GNU/Linux
|
Si usted está escribiendo comandos mientras lee esto, notará que
utiliza un mismo comando varias veces, ya sea exactamente igual o con pequeñas modificaciones.
La buena noticia es que el bash shell puede guardar un historial de sus
comandos. El historial se encuentra activado por defecto. Usted puede desactivarlo utilizando el comando
set +o history y volver a activarlo utilizando
set -o history. Una variable de entorno denominada
HISTSIZE le dice al bash cuantas líneas del historial guardar. Otra serie de
configuraciones controla el modo de trabajo y la administración del historial. Si desea obtener más información
diríjase a las páginas del manual del bash.
Algunos de los comandos que se pueden utilizar mediante las funciones del historial son:
- history
- Muestra todo el historial
- history N
- Muestra las últimas líneas N del historial
- history -d N
- Elimina la línea N de su historial; usted podría hacer esto si la línea contiene una clave, por ejemplo
- !!
- Muestra el comando más reciente
- !N
- Muestra el N comando del historial
- !-N
- Muestra el comando que se encuentra N comandos atrás en el historial (!-1 es equivalente a !!)
- !#
- Muestra el comando que usted está escribiendo actualmente
- !string
- Muestra el comando más reciente que inicia con string
- !?string?
- Muestra el comando más reciente que contiene string
Usted puede usar también dos puntos (:) seguidos de ciertos valores para acceder a una parte o comando del historial, o modificarlo. El Listado 16 grafica algunas de las capacidades del historial.
Listado 16. Administración del historial
[ian@echidna ~]$ echo $$ 2852 [ian@echidna ~]$ env -i bash -c 'echo $$' 9649 [ian@echidna ~]$ !! env -i bash -c 'echo $$' 10073 [ian@echidna ~]$ !ec echo $$ 2852 [ian@echidna ~]$ !en:s/$$/$PPID/ env -i bash -c 'echo $PPID' 2852 [ian@echidna ~]$ history 6 595 echo $$ 596 env -i bash -c 'echo $$' 597 env -i bash -c 'echo $$' 598 echo $$ 599 env -i bash -c 'echo $PPID' 600 history 6 [ian@echidna ~]$ history -d598 |
Los comandos mencionados en el Listado 16 realizan las siguientes operaciones:
- Se hace eco del PID del shell actual
- Se ejecuta un comando echo en un nuevo shell y hace eco del PID del shell
- Se vuelve a ejecutar el último comando
- Se vuelve a ejecutar el último comando que comienza con 'ec'; este vuelve a ejecutar el primer comando de este ejemplo
- Se vuelve a ejecutar el último comando que comienza con 'en', pero sustituye '$PPID' por '$$', de manera que se visualice el PID primario
- Se muestran los últimos 6 comandos del historial
- Se elimina la entrada 598 del historial, el último comando echo
También es posible editar el historial de manera interactiva. El shell bash utiliza la biblioteca readline para administrar la edición y el historial de los comandos. Por defecto, las teclas y las combinaciones de teclas utilizadas para moverse dentro del historial o editar las líneas son similares a aquellas utilizadas en el editor Emacs de GNU . Las combinaciones de pulsaciones de teclas en Emacs por lo general son expresadas como C-x o M-x, donde x es una tecla común y C y M son las teclas Control y Meta, respectivamente. En un sistema de PC típico, la tecla Ctrl es equivalente a la tecla Control en Emacs, y la tecla Alt es equivalente a la tecla Meta. En el Cuadro 3 se pueden observar algunas de las funciones de edición del historial a las que se puede acceder. Además las combinaciones de teclas que se observan en el Cuadro 3, las teclas de movimiento del cursor, como las flechas derecha, izquierda, arriba, y abajo, y las teclas Inicio y Fin por lo general están configuradas para funcionar de una forma lógica. Las funciones adicionales así como el modo de personalizar estas opciones utilizando un fichero de inicio readline (generalmente inputrc en su directorio) pueden encontrarse en las páginas de los manuales.
C uadro 3. Edición del historial con los comandos emacs
| Comando | Tecla común de PC | Descripción |
|---|---|---|
| C-f | Flecha derecha | Mueve el cursor un espacio hacia la derecha |
| C-b | Flecha izquierda | Mueve el cursor un espacio hacia la izquierda |
| C-p | Flecha hacia arriba | Mueve un comando anterior en el historial |
| C-n | Flecha hacia abajo | Mueve un comando posterior en el historial |
| C-r | Búsqueda inversa incremental. Escribir una letra o letras para buscar una cadena hacia atrás. Presionar C-r de nuevo para buscar el acontecimiento anterior siguiente de la misma cadena. | |
| M-f | Alt-f | Moverse al inicio de la siguiente palabra; los entornos GUI por lo general toman esta combinación de teclas File para abrir el menú de la ventana |
| M-b | Alt-b | Moverse al final de la palabra anterior |
| C-a | Home | Moverse al principio de la línea |
| C-e | End | Moverse al final de la línea |
| Backspace | Backspace | Eliminar el carácter que está antes del cursor |
| C-d | Del | Eliminar el carácter que se encuentra debajo del cursor (las funciones Del y Backspace pueden configurarse con significados opuestos) |
| C-k | Ctrl-k | Borrar (kill) hasta el final de la línea y guardar el texto eliminado para usarlo luego |
| M-d | Alt-d | Borrar (kill) hasta el final de la palabra y guardar el texto eliminado para usarlo luego |
| C-y | Ctrl-y | Volver a insertar el texto eliminado con un comando kill |
Si desea administrar el historial utilizando el modo de edición tipo vi, utilice
el comando set -o vi para pasar al modo vi.
Vuelva al modo emacs utilizando
set -o
emacs. Al recuperar un comando en modo vi,
inicialmente estará en el modo insert de vi. El editor de
vi es explicado en otro de los artículos de esta serie. (Vea
Resources for the series roadmap).
Rutas - ¿Dónde se encuentra mi comando?
Algunos comandos bash están incorporados, mientras otros son externos. Analicemos ahora los comandos externos y el modo en el que se ejecutan, y cómo darse cuenta de que se trata de un comando interno.
¿Dónde encuentra el shell los comandos?
Los comandos externos son sólo archivos de su sistema de archivos. La administración básica de archivos es un tema que tratamos en otro de los artículos de esta serie. (Vea Resources for the series roadmap). En sistemas Linux y UNIX, se puede acceder a todos los archivos como parte de un mismo árbol raíz enorme al que se accede por medio de /. En los ejemplos que hemos dado hasta ahora, nuestro directorio actual ha sido el directorio principal del usuario. Los usuarios que no sean raíz por lo general tienen un directorio dentro del directorio principal, como /home/ian, en mi caso. El directorio raíz principal es por lo general /root. Si usted escribe el nombre de un comando, el bash busca ese comando en su ruta, la cual es una lista de directorios separados por punto y coma en la variable de entorno PATH.
Si desea saber cuál es el comando que se ejecutará si escribe una cadena en
particular, utilice el comando which o
type . El Listado 17 muestra mi ruta predeterminada junto con las ubicaciones de
varios comandos.
Listado 17. Búsqueda de ubicaciones de comandos
[ian@echidna ~]$ echo $PATH
/usr/lib/qt-3.3/bin:/usr/kerberos/bin:/usr/lib/ccache:/usr/local/bin:/bin:/usr/b
in:/home/ian/bin
[ian@echidna ~]$ which bash env zip xclock echo set ls
alias ls='ls --color=auto'
/bin/ls
/bin/bash
/bin/env
/usr/bin/zip
/usr/bin/xclock
/bin/echo
/usr/bin/which: no set in (/usr/lib/qt-3.3/bin:/usr/kerberos/bin:/usr/lib/ccache
:/usr/local/bin:/bin:/usr/bin:/home/ian/bin)
[ian@echidna ~]$ type bash env zip xclock echo set ls
bash is hashed (/bin/bash)
env is hashed (/bin/env)
zip is /usr/bin/zip
xclock is /usr/bin/xclock
echo is a shell builtin
set is a shell builtin
ls is aliased to `ls --color=auto'
|
Tenga en cuenta que la mayoría de los directorios de la ruta terminan en /bin. Esta es una convención
común, pero no es un requerimiento como puede observarse desde /usr/lib/ccache. El comando
which informó que el comando
ls es un alias y que el comando
set no pudo encontrarse. En este caso,
interpretamos que esto significa que no existe o que se trata de un comando incorporado.
El comando type informa que el comando
ls es un alias, pero
identifica al comando set como un comando incorporado al shell.
También informa que hay un comando echo
incorporado, además del encontrado en /bin por
which. Los comandos también producen datos de salida en
diferentes órdenes.
Hemos observado que el comando ls utilizado para listar
el contenido de los directorios, es un alias. Los alias son una forma práctica de
configurar algunos comandos para utilizar diferentes series de elementos predefinidos o para proporcionar
alternativas a los nombres de los comandos. En nuestro ejemplo, la opción
--color=tty hace que el listado de directorio
sea codificado por colores según el tipo de archivo o directorio. Pruebe ejecutar
dircolors --print-database para ver cómo la codificación
por color es controlada y qué colores se utilizan para cada tipo de archivo.
Cada uno de estos comandos posee opciones adicionales. Según su necesidad, usted
puede utilizar uno u otro comando. Yo tiendo a utilizar which
cuando estoy muy seguro de encontrar un ejecutable y sólo necesito la especificación de
su ruta completa. Yo creo que type me proporciona
información más precisa, aveces necesaria sobre el script de un shell.
Hemos visto en el Listado 17 que los archivos ejecutables tienen una ruta inicial completa con /, el directorio raíz. Por ejemplo, el programa xclock es realmente /usr/bin/xclock, un archivo ubicado en el directorio /usr/bin. En los sistemas antiguos, esto se podía encontrar en el directorio /usr/X11R6/bin. Si un comando no se encuentra en la especificación de ruta, usted puede igualmente ejecutarlo especificando una ruta y un nombre del comando. Existen dos tipos de rutas que se pueden utilizar:
- Rutas Absolutas que son aquellas que comienzn con /, como aquellas que vimos en el Listado 17 (/bin/bash, /bin/env, etc).
- Rutas Relativas varían según el tipo de directorio de trabajo actual,
según lo informado por el comando
pwdEstos comandos no comienzan con /, pero si contienen al menos una /.
Usted puede utilizar rutas absolutas sin importar cuál sea el directorio en el cual está trabajando actualmente,
pero probablemente utilizará rutas relativas sólo si un comando se encuentra cerca de
su directorio actual. Supongamos que usted está desarrollando una nueva versión del
clásico programa "Hello World!" en un subdirectorio de su directorio principal
denominado mytestbin. Usted podría utilizar una ruta alternativa para ejecutar su comando como
mytestbin/hello. Existen dos nombres especiales
que usted puede utilizar en una ruta; un sólo punto (.) se refiere al directorio actual,
y un par de puntos (..) se refiere al directorio primario actual.
Dado que su directorio principal por lo general no se encuentra en su RUTA (y generalmente
no debería estarlo), usted necesitará proporcionar explícitamente una ruta para cualquier
ejecutable que desee ejecutar desde su directorio principal. Por ejemplo, si
tuviera una copia de su programa hello en su directorio principal, usted podría
ejecutarla utilizando el comando ./hello. Usted puede usar tanto
. como .. como parte de una ruta absoluta, aunque un sólo . no es muy útil en tal caso.
Usted puede también usar una virgulilla (~) para referirse a su directorio
principal ~nombre de usuario para referirse al directorio principal del usuario
denominado nombre de usuario. En el Listado 18 se pueden encontrar algunos ejemplos de esto.
Listado 18. Rutas absolutas y relativas
[ian@echidna ~]$ /bin/echo Use echo command rather than builtin Use echo command rather than builtin [ian@echidna ~]$ /usr/../bin/echo Include parent dir in path Include parent dir in path [ian@echidna ~]$ /bin/././echo Add a couple of useless path components Add a couple of useless path components [ian@echidna ~]$ pwd # See where we are /home/ian [ian@echidna ~]$ ../../bin/echo Use a relative path to echo Use a relative path to echo [ian@echidna ~]$ myprogs/hello # Use a relative path with no dots -bash: myprogs/hello: No such file or directory [ian@echidna ~]$ mytestbin/hello # Use a relative path with no dots Hello world! [ian@echidna ~]$ ./hello Hello world! [ian@echidna ~]$ ~/mytestbin/hello # run hello using ~ Hello world! [ian@echidna ~]$ ../hello # Try running hello from parent -bash: ../hello: No such file or directory |
Modificación del directorio de trabajo
Del mismo modo en el que puede ejecutar programas desde varios directorios de su sistema,
puede también modificar el directorio que está funcionando actualmente utilizando el comando
cd. El argumento para
cd debe ser una ruta absoluta o relativa a un directorio.
En cuanto a los comandos, usted puede utilizar ., .., ~, y ~nombre de usuario en las
rutas. Si utiliza cd sin parámetros, el cambio
se realizará en su directorio principal. Un sólo guión (-) como parámetro
significa que se debe volver al directorio de trabajo anterior. Su directorio principal se
almacena en la variable de su entorno PRINCIPAL, y el directorio anterior se guarda en
la variable OLDPWD, de modo que cd solo es
equivalente a cd $HOME y
cd
- es equivalente a
cd $OLDPWD. Por lo general hablamos de cambiar
directorio en lugar de cambiar directorio de trabajo.
En cuanto a los comandos, existe también una variable de entorno, CDPATH, que
contiene una serie de directorios separados por dos puntos que deberían buscarse (además del
directorio actual de trabajo) al resolver rutas relativas.
Si en la resolución se utilizó una ruta de CDPATH, cd
imprimirá la ruta completa del directorio resultante como datos de salida. Normalmente, un
cambio de directorio exitoso genera solamente un prompt nuevo y posiblemente
modificado. En el Listado 19 pueden encontrarse algunos ejemplos de esto.
Listado 19. Modificación de directorios
[ian@echidna ~]$ cd /;pwd / [ian@echidna /]$ cd /usr/local;pwd /usr/local [ian@echidna local]$ cd ;pwd /home/ian [ian@echidna ~]$ cd -;pwd /usr/local /usr/local [ian@echidna local]$ cd ~ian/..;pwd /home [ian@echidna home]$ cd ~;pwd /home/ian [ian@echidna ~]$ export CDPATH=~ [ian@echidna ~]$ cd /;pwd / [ian@echidna /]$ cd mytestbin /home/ian/mytestbin |
El último tema que trataremos en este artículo es el modo de obtener la documentación relativa a los comandos Linux através de las páginas de los manuales y otras fuentes de documentación.
Páginas y secciones de los manuales
La principal (y tradicional) fuente de documentación la constituyen las páginas de los
manuales, a las cuales puede acceder utilizando el comando
man . En la Figura 1 se muestra la página del manual para
el comando man . Utilice el comando
man man para visualizar esta información.
Figura 1. Página del manual para el comando man
La Figura 1 muestra algunos de los elementos típicos de las páginas de los manuales:
- Un encabezado con el nombre del comando seguido de su correspondiente número de sección entre paréntesis
- El nombre del comando y los comandos relacionados al mismo descriptos en la misma página del manual
- Un resumen de las opciones y los parámetros aplicables al comando
- Una breve descripción del comando
- Información detallada de cada una de las opciones
Pueden encontrarse otras secciones sobre el uso, el modo de informar las fallas, información
sobre el autor, y una lista de los comandos relacionados. Por ejemplo, las páginas del manual
man nos dicen que los comandos relacionados (y sus
secciones del manual) son:
apropos(1), whatis(1), less(1),
groff(1), y man.conf(5).
Existen ocho secciones en las páginas de los manuales comunes. Los manuales comunes por lo general se instalan al instalar un paquete, por lo tanto si usted no ha instalado ningún paquete probablemente no tenga las páginas del manual correspondientes. De modo similar, algunas de las secciones del manual pueden estar vacías o casi vacías. Las secciones típicas de los manuales y los ejemplos que estas contienen son:
- Comandos de usuario (env, ls, echo, mkdir, tty)
- Llamadas al sistema o funciones kernel (link, sethostname, mkdir)
- Rutinas de la bibliotecas (acosh, asctime, btree, locale, XML::Parser)
- Información relacionada con dispositivos (isdn_audio, mouse, tty, zero)
- Descripciones de formato de archivos (keymaps, motd, wvdial.conf)
- Juegos (tener en cuenta que muchos juegos ahora son gráficos y poseen ayuda gráfica externa al sistema de las páginas del manual)
- Varios (arp, boot, regex, unix utf8)
- Administración del sistema (debugfs, fdisk, fsck, mount, renice, rpm)
Otras secciones que podrían encontrarse son 9 relacionada con documentación del kernel de Linux, n relacionada con la nueva documentación, o relacionada con la documentación antigua, y l relacionada con la documentación local.
Algunas entradas aparecen en múltiples secciones. Nuestros ejemplos muestran mkdir en
las secciones 1 y 2, y tty en las secciones 1 y 4. Usted puede especificar una
sección determinada, por ejemplo, man 4 tty o
man 2
mkdir, o usted puede
especificar la opción -a para listar todas las secciones
del manual que sean pertinentes
Usted puede haber observado en la figura que man posee
muchas opciones para explorar por si mismo. Por el momento, echemos un vistazo
a algunos de los comandos "Ver también" relacionados con
man.
Dos comandos importantes relacionados con man son
whatis y apropos.
El comando whatis busca en las páginas de los manuales
el nombre que se le da y muestra la información del nombre desde la página del manual
correspondiente. El comando apropos realiza una búsqueda
de palabras claves de manuales y listas que contienen dicha palabra.
El Listado 20 muestra estos comandos.
Listado 20. Ejemplos de whatis and apropos
[ian@echidna ~]$ whatis man man [] (1) - format and display the on-line manual pages man [] (1p) - display system documentation man [] (7) - macros to format man pages man [] (7) - pages - conventions for writing Linux man pages man.config [] (5) - configuration data for man man-pages (rpm) - Man (manual) pages from the Linux Documentation Project man (rpm) - A set of documentation tools: man, apropos and whatis [ian@echidna ~]$ whatis mkdir mkdir [] (1) - make directories mkdir [] (1p) - make directories mkdir [] (2) - create a directory mkdir [] (3p) - make a directory [ian@echidna ~]$ apropos mkdir mkdir [] (1) - make directories mkdir [] (1p) - make directories mkdir [] (2) - create a directory mkdir [] (3p) - make a directory mkdirat [] (2) - create a directory relative to a directory file descriptor mkdirhier [] (1) - makes a directory hierarchy |
Por cierto, si no puede encontrar las páginas del manual correpondientes a man.conf, pruebe ejecutando
man man.config.
Los datos de salida de las páginas del comando man se visualizan
utilizando un programa de paginación. En la mayoría de los sistemas Linux, es probable que sea
el programa less . Otra alternativa pod`ía ser el antiguo programa
more . Si desea imprimir la página,
especifique la opción -t para formatear la página para
impresión utilizando el programa groff o
troff .
El paginador less posee varios comandos que ayudan a buscar cadenas en
los datos de salida visualizados. Utilice man less para conocer
más sobre / (buscar hacia adelante), ? (buscar hacia atrás), y
n (repetir la última búsqueda), entre otros.
Otras fuentes de documentación
Además de las páginas de los manuales a las cuales se puede acceder desde una línea de comando,
la Fundación para el Software libre ha creado una serie de archivos de información
que son procesados con el programa info . Estos archivos proporcionan facilidades para la
navegación de gran alcance incluyendo la habilidad para saltar a otras secciones. Si desea más
información ingrese man info o
info info . No todos los
comandos están documentados en info, por lo cual deberá utilizar simultáneamente
man e info si se convierte en un usuario de información.
Existen además algunas interfaces gráficas en las páginas de los manuales, como por ejemplo
xman (from the XFree86 Project) y
yelp (the Gnome 2.0 help browser).
Si no puede encontrar ayuda para utilizar un comando determinado, pruebe ejecutando el comando con la
opción --help . Esto puede proporcionar la ayuda que necesita para
utilizar el comando, o decirle cómo obtenerla.
Aprender
- Use el
roadmap for LPIC-1 para encontrar
los artículos developerWorks que necesita para prepararse para la certificación LPIC-1
basada en los objetivos de Abril de 2009.
- Vea los objetivos de abril de 2009 para el examen
LPI
101
y LPI
102.
Siempre deberá consultar los objetivos para ver los requerimientos
definitivos.
- Vea toda la serie de exámenes para la preparación del
LPI
en developerWorks para aprender las bases de Linux y prepararse para la certificación de
administrador de su sistema conforme a los objetivos anteriores al mes de abril de
2009.
- En el programa
LPIC, encuentre listas
de tareas, ejemplos de preguntas, y objetivos detallados para los tres niveles de la
certificación en administración de sistema Linux del Linux Professional Institute.
- En
"Basic tasks for new Linux developers"
(developerWorks, March 2005), aprenda como abrir una ventana de terminal o un prompt de shell y mucho más.
- El
Linux Documentation Project
posee una variedad de documentos útiles, especialmente sus HOWTOs.
- En la
developerWorks Linux zone,
encuentre más recursos para los desarrolladores de Linux, y vea
most popular articles and tutorials.
- Vea todos los tips de Linux en
y los tutoriales en
en developerWorks.
- Esté al tanto de los acontecimientos y transmisiones técnicas de developerWorks en
.
Obtener los productos y tecnologías
- Con el software de prueba de
IBM ,
disponible para descargar directamente desde developerWorks, cree su próximo proyecto de desarrollo de
Linux.
Comentar
- Participar en el foro de debate.
- Conéctese con la comunidad My developerWorks
;
con su perfil personal y personalice su página principal; usted puede ajustar
developerWorks según sus intereses e interactuar con otros usuarios de developerWorks
Ian Shields trabaja en múltiples proyectos Linux para la zona Linux de developerWorks. Es Senior Programmer de IBM en el Research Triangle Park (RTP), Carolina del Norte. Ingresó a IBM en Canberra, Australia, como Systems Engineer en 1973, y desde entonces se dedica a sistemas de comunicaciones y computación ubicua en Montreal, Canadá, y en el RTP de Carolina del Norte. Es propietario de numerosas patentes y publicó diversos trabajos. Tiene una diplomatura en Matemática Pura y Filosofía de la Universidad Nacional de Australia. Es Máster y Doctor en Ciencias de la Computación de la Universidad Estatal de Carolina del Norte. Para contactar a Ian, escríbale a: ishields@us.ibm.com.