La shell sin complicaciones

De Wiki de la Comunidad Mandriva

¡Téngalo en cuenta!

ESTA PAGINA ES UNA VERSIÓN REVISADA DE SIETE PAGINAS DE LA OBSOLETA BASE DE CONOCIMIENTOS ENCONTRADA EN:

http://club.mandriva.com/xwiki/bin/view/KB/BasicsBshell ptyxs 24 February 2008 at 08:27 (CET)
Esta pagina presenta y explica los comandos y mecanismos básicos del shell.



Contenido

Utilizando el Shell

La herramienta definitiva y la más poderosa

Alguna vez habrá escuchado la letanía 'la linea de comandos, esta fuera de moda', 'es arcaica' y cosas similares. Ademas que las personas y los sistemas operativos deberían de evitarla.

La realidad es que usted: puede utilizar Linux sin tener que saber nada sobre el shell. Puede hacer que su sistema inicie directamente en el modo gráfico(X) y apagarlo desde ahí. Puede utilizar el Centro de Control Mandriva y Webmin para configurar cada uno de los aspectos de su sistema.

Sin embargo, es nuestra convicción, que utilizar Linux sin usar el shell es como manejar su carro solo en la primera velocidad. Por supuesto, es más fácil y eventualmente llegará a donde usted quiere, pero es lento y le quita la diversión de conducir.

Y desde luego: la linea de comandos es divertida. Es como la más grande colección de bloques para construcción jamas vista. Y estos bloques pueden realizar las cosas más asombrosas e incluso pueden cooperar entre ellos, pudiendo hacer las tareas más complejas en unas cuantas lineas. Esto se debe a que el shell de Unix no es solo un interprete de comandos como el indicador de DOS en Windows, es un entorno de programación bastante completo.

Eso no significa que el aprendizaje del shell sea fácil. Bien, pero hay que aprender ¿que espera?. ;-) Créanos que es muy gratificante y usted sera reconocido como un mago de la computación por los extraños, en un periodo relativamente corto. *grin*

Para tener una idea de que es un shell, un poco de información previa podría serle útil.

Terminales, Xterms y Shells

En los días cuando nació Unix, el ahora dominante de la raza «ordenadores personales» era totalmente desconocido. Las maquinas que en aquel entonces eran llamadas «computadores» eran robustas, con el tamaño de una habitación, utilizaban cintas y memorias magnéticas --de ahí el termino 'básico' para la memoria del sistema--.

Con la PDP-11 creada por DEC (ahora Compaq) e introducida en 1970, esta 'pequeña' (en aquel entonces llamada 'mini') y el computador económico apareció en el mercado, convirtiéndose instantáneamente en un gran éxito, en las universidades, ya que la mayoría de ellas fue capaz de comprar por primera vez un computador --La PDP-11 era una verdadera ganga por solo $10,000)--.

Los sistemas operativos de estas máquinas fueron escritos en Assembler, código de maquina, muy eficiente, pero para nada portable. Cada proveedor vendió su propio sistema operativo, junto con sus máquinas.

Pronto se hizo palpable la incomodidad de esta situación y se hicieron intentos de crear un sistema operativo que pudiera funcionar en más de una sola marca de computador.


En 1969, un empleado de AT&T Bell Labs llamado Ken Thompson, escribió el primer código de lo que se conoce como Unix --un juego de palabras en MULTICS, un proyecto anterior en el que Thompson habias estado trabajando--. Sin embargo, las cosas realmente comenzaron cuando Dennis Ritchie, llegó con un nuevo lenguaje de programación llamado "C", para este nuevo sistema operativo.

A pesar de que Unix era menos eficaz que el sistema operativo que suministraban los proveedores de computadores, tenía tres ventajas decisivas: Que podría ser portado a cualquier maquina que se tuviera alrededor, que incluyó el lenguaje "C" --el cual hizo de la programación algo más fácil en muchos aspectos-- y ademas gratis. Pronto, las universidades de todo Estados Unidos comenzaron a equipar sus máquinas con Unix.

Terminales

Así Unix era y es un sistema operativo que funciona en una amplia variedad de maquinas. ¿Que hay sobre las personas que usaban esas maquinas? Esas personas se conectaban a las maquinas por medio de terminales 'tontas', esto es maquinas que consisten de un teclado, un monitor y lo suficiente para mantener una conexión a la computadora central. Lo que hacían los usuarios en esta terminales básicamente era Teclear Remotamente (TeleTYping), de ahí surge 'tty' para los archivos de dispositivo de las terminales o el nombre del comando 'getty'.

Podrá preguntarse ¿que tiene que ver esto con el tema?. Bien, los proveedores de esas terminales no se ponían de acuerdo sobre un estandard . Esto es, cada marca de terminal tenia su propia distribución de teclado, su propio método de mostrar los caracteres en la pantalla, su propia idea de lo que caracteres o códigos de control representaban las señales que enviaban y recibían, y cosas así.
Para poder hacer frente a todo ese caos, se creo un archivo central que contenía todas las diferentes y distintas capacidades de las terminales -- termcap. Abra /etc/termcap en un editor de texto y asómbrese (o asustese ;-)).

En su mayoría las terminales Linux utilizan 'vt100' o 'linux' como tipo de terminal.

En un sistema Mandriva linux puede acceder ventanas que emulan esas terminales por medio de las combinaciones CTRL+ALT+F1 a CTRL+ALT+F6. ALT-F7 lo regresara a la actual sesión gráfica (vea más adelante). Existen 'archivos especiales' en /dev : /dev/tty1 al /dev/tty6 .


Xterms

En los comienzos de 1980, se desarrolló el sistema de ventanas X, un subsistema gráfico para Unix. En lo años 90, se desarrolló el entonces incipiente XFree86, un fork de este sistema con el fin de escribir una versión más estable para el procesador Intel, basado en los clones de Unix, tales como, FreeBSD, NetBSD o Linux. Más tarde, se desarrolló el fork de XFree86, llamado X.org. X.org es por ahora el sistema gráfico por defecto de Mandriva.

El primer y mas importante uso de X, es la posibilidad de ejecutar múltiples terminales 'virtuales'. De hecho, el sistema X viene con el aplicativo, xterm. Por lo tanto, usted encontrará que la palabra 'xterm' y la frase 'terminal virual', se utilizan a menudo como sinónimos. Al leer la frase 'abrir un xterm', esto no quiere decir que usted debe instalar y usar el programa llamado xterm, si no que también puede ser cualquier otro programa emulador de terminales, como por ejemplo rxvt, konsole, aterm, eterm, wterm, etc.

Un emulador d terminales --este es otro nombre para 'terminal virtual'-- se conecta al sistema a través de un archivo de dispositivo de un pseudo tty y utiliza su propio estándar de pantalla. Esto podría llevar a un comportamiento ligeramente distinto de algunas teclas o de aplicaciones en los distintos emuladores de terminal, esto depende de lo bien que los emuladores hagan lo propio en cuanto al estándar de la pantalla xterm.

En Mandriva, se puede tener acceso a estos emuladores a través de KDE menú principal -> Sistema -> Terminales. Son archivos especiales ubicados en /dev/pts ('pts' = 'Pseudo-TerminaleS'): /dev/pts/1, /dev/pts2 etc.

Shells

Con el fin de ejecutar programas en una terminal, un Shell es necesario. Ya que un Shell es la parte de un sistema operativo que se comunica con el usuario y permite su comunicación por medio de los comandos.

La primera Shell 'real' de Unix, sh, fue escrita alrededor de 1975 por Steve Bourne y es también llamado el "Bourne Shell". Pronto, surgieron otros desarrollos, algunos basados en el original "Bourne Shell" como (pd)ksh o zsh, que a menudo se utilizaban como estándar de la Shell de los Unix propietarios o las Shells que se implementaron con características del lenguaje de programación 'C', como csh o tcsh.

En Linux, el Shell estándar es 'bash', el GNU Bourne-Again Shell (bueno, es parte del humor UNIX ...). Es muy poderoso (demasiado dirían algunos).

Primeros pasos en el Shell

¡Téngalo en cuenta!
En primer lugar, usted no debe utilizar la consola como 'root' para las tareas diarias, sobre todo si se está empezando a usarla. No se puede dañar el sistema accidentalmente (o intencionadamente) cuando se utiliza un shell con permisos de usuario normal, sin embargo, con permisos de root, un error simple puede tener consecuencias imprevistas y graves.


Lo primero que aparece después de acceder o abrir una ventana xterm es el símbolo del sistema. El estandar del prompt --Símbolo del sistema-- de Mandriva Linux consiste en el nombre del usuario, el nombre de la maquina en la que usted se ha autenticado --Si no se ha proporcionado ninguno, se utilizará "localhost"--, el directorio donde usted se encuentra --el "directorio de trabajo actual"-- y el símbolo del sistema:

[tom@belbo tom]$

En el ejemplo anterior, estoy registrado como el usuario "Tom", en una máquina que he llamado "Belbo" y estoy en mi directorio home, "/home/tom". El símbolo del sistema del 'root', se vería como este:

[root@belbo root]#

Notese que, aparte del nombre, el signo del sistema también ha cambiado de un '$' a un '#'. Es una tradición en las Shells Bourne, que al final del símbolo del sistema de un usuario normal tenga un '$' y al final del símbolo del sistema de un usuario root's, tenga un '#'.

Cada aspecto del sistema es personalizable. Más adelante usted leerá acerca de esto.

Para ejecutar un comando, escriba el nombre del comando en el prompt y luego pulse la tecla <<ENTER>>. El shell busca dicho comando en su ruta de búsqueda o $PATH (hablaremos más sobre esto, más adelante), ejecuta el comando, imprime la salida del comando en la terminal --si es que así debe proceder-- y presenta de nuevo el símbolo del sistema --prompt-- cuando el comando termina de hacer su trabajo:

[tom@belbo tom]$ whoami
tom
[tom@belbo tom]$

Por cierto, no importa donde esté el cursor cuando se pulse la tecla <<ENTER>>, el shell siempre leerá la línea completa.

Los comandos basicos son ls (lista los archivos y directorios de la actual ubicación), cp (copia), {prog|mv}} (mueve / renombra), cd (cambia de directorio), cada uno viene con una gran cantidad de opciones que usted puede consultar en su respectiva página de manual, haciendo (man ls, man mv, etc).

Cuando usted pulse <<TAB>>, a continuación verá una lista de todos los comandos disponibles, cuando digite algunos caracteres, presione la tecla <<TAB>> seguidamente... entonces verá una lista de todos los comandos que comienzan con esos caracteres digitados.

Antes de introducirse en la tierra de la shell, se le dará una breve introducción a la terminología. Los comandos capturan opciones y/o argumentos:

Image:Konsole.png
[usuario@computadora ~]$ mv -i file dir

La '-i' es una opción del comando mv, y se considera a 'file' y 'dir' como argumentos. Las opciones disponibles, se explican detalladamente en la pagina del comando man (man mv, para dicho ejemplo), se considera que los argumentos son suministrados por usted. Las opciones modifican el comportamiento de los comandos, se considera que los argumentos determinan con cuales datos el comando debe llevar a cabo su tarea.

Hasta ahora, esto se parece mucho a la shell de DOS, la cual casi todo el mundo odia y desprecia (y con toda la razón). Llegó el momento de introducir algunos mecanismos, que hacen de tu vida con la shell una experiencia mucho más agradable.

Usando el Editor de linea de comando (shell) II: Los primeros comandos para experimentar con la shell

Si usted es un principiante, ahora va a poder divertirse con estos primeros comandos.


Para abrir una consola:

  • Presione simultáneamente las teclas Alt+Ctrl+Fn (Fn puede ser una tecla entre F1 a F6): usted puede volver a su entorno gráfico clásico presionando Alt-F7
  • O haciendo click en K Menu -> Herramientas -> Konsole.

Tenga cuidado de no iniciar la sesión como 'root', sino mas bien como un usuario normal.


Saber "donde está"

  • El comando pwd muestra el directorio de trabajo (llamado algunas veces el directorio actual).

Para recordar mas fácilmente: pwd es el acrónimo de "print working directory".


Crear un archivo vacío

  • Utilice el comando touch file_name.

Si file_name es un archivo existente, solo la fecha y la hora se cambiarán. El contenido no será modificado.


Agregar una linea al final de un archivo sin eliminar su contenido

Image:Konsole.png
[usuario@computadora ~]$ echo "blah blah blah" >> file_name

Leer el contenido de un archivo

  • El comando cat file_name muestra el contenido de un archivo de texto.


Reemplazar el contenido de un archivo existente con otro contenido o crear un archivo con un contenido especifico

  • Similar al comando anterior, pero utilizando el [operador de redirección|BasicsBshell4] '>' esta vez:
Image:Konsole.png
[usuario@computadora ~]$ echo "blah blah blah" > file_name

(si el archivo no existe, será creado, sin utilizar el comando 'touch')

Leyendo el contenido de un archivo con paginación

  • El comando less file_name muestra el contenido de un archivo y permite desplazarse por él.

Cambiar el nombre de un archivo o un directorio

  • El comando mv name1 name2 renombra el archivo o el directorio de name1 a name2.

Creando una nueva copia de un archivo

  • El comando cp file1 file2 crea el archivo file2 copiando el contenido del archivo file1 dentro de él.

Viendo lo que está dentro de un directorio

  • El comando ls -l lista el contenido del directorio de trabajo.
  • El comando ls -la lista el contenido del directorio de trabajo e incluye los archivos ocultos.
  • El comando ls -l dir lista el contenido del directorio llamado "dir".

Desplazarse

  • El comando cd directory_name cambia el directorio de trabajo por el directorio llamado directory_name.

Limpiar

  • El comando rm file elimina el archivo llamado "file".

Crear o eliminar directorios

  • El comando mkdir directory crea el directorio "directory".
  • El comando rmdir directory elimina el directorio vacio "directory".

Colocar archivos en alguna parte

  • El comando mv file directory mueve el archivo 'file' hacia el directorio 'directory'.

Buscar algún texto en un archivo

  • El comando grep texto_a_encontrar file_name busca el texto en el archivo file_name.
  • El comando grep -i texto_a_encontrar file_name hace lo mismo, pero no distingue entre mayúsculas y minúsculas.

Para saber lo que está sucediendo en este momento

  • El comando top muestra una lista de programas que estan siendo mas usados por la CPU (estará en pantalla). Utilice "q" para salir.
  • El comando ps ux muestra una lista de todos los programas activos, pertenecientes al usuario actual.
  • El comando ps aux muestra una lista de todas las actividades del sistema.

En cuanto a lo que has hecho

  • Es posible recuperar y ver los comandos que haya escrito anteriormente, utilizando las teclas de flecha del teclado arriba y abajo.
  • El comando history muestra una lista de los últimos comandos usados.

Para convertirse en administrador temporalmente

  • El comando su - es como un interruptor para el modo de administrador, es decir, con este comando usted se convertirá en "root" (tenga cuidado: no se quede como root experimentando con todos estos comandos. ¡Rápidamente podría ocurrir un trágico error!).
  • El comando exit lo trae de vuelta a su identidad anterior.

Usando el Shell III

Unix (y su hermano menor Linux) nacieron en la linea de comandos. Debido a esto, la línea de comandos en Unix tiene un montón de mecanismos para que no tenga que escribir todo "manualmente". Este capitulo presenta algunos de esos mecanismos.


Auto-Completación

¿Cuál es el modo más rápido desde tu directorio home, suponiendo que es tu directorio actual de trabajo, al directorio /usr/src/linux/Documentation/isdn/ usando el comando cd ('cambiar directorio')? Pues es

Image:Konsole.png
[usuario@computadora ~]$ cd /u\<TAB\>sr\<TAB\>l\<TAB\>/D\<TAB\>is\<TAB\>

A esto se le llama 'completación automática de línea de comandos' y es indispensable. Repasemos más detenidamente el ejemplo:

Image:Konsole.png
[usuario@computadora ~]$ cd /u\<TAB\>

expande a "cd /usr/". Fácil. Sigue

Image:Konsole.png
[usuario@computadora ~]$ cd /u\<TAB\>sr\<TAB\>

expande a "cd /usr/src/". Si teclea "cd /u\<TAB\>s\<TAB\>", se le mostrará un lista de tres subdirectorios de /usr para escoger que siguen el patrón ('cd /u\*/s\*'): /usr/sbin , /usr/share y /usr/src .

Así, la tecla "TAB" es una herramienta útil para buscar subdirectorios o ficheros de los que conoce la primera letra. Por ejemplo,

Image:Konsole.png
[usuario@computadora ~]$ ls /usr/bin/zip\<TAB\>

Devuelve una lista con todos los ficheros y subdirectorios de /usr/bin que empiece con las letras 'zip'. Por supuesto, hay comandos mucho más poderosos para esta tarea, pero este truco funciona cuando se tiene prisa.

Además, es realmente útil cuando los nombres son muy lartos. Por ejemplo, si quiere instalar un RPM que se llama boomshakalakwhizbang-4.6.4.5-mdk586.rpm , simplemente teclea

Image:Konsole.png
[usuario@computadora ~]$ rpm -i boom\<TAB\>

Y si no hay ningún otro fichero en ese directorio que siga ese patrón, el shell mostrará el nombre completo.

Image:Konsole.png
[usuario@computadora ~]$ cd /u\<TAB\>sr\<TAB\>l\<TAB\>

Expande a "cd /usr/src/linux" y espera una decisión. Hay dos directorios en /usr/src que siguen el patrón: /usr/src/linux-... y /usr/src/linux . ¿Cómo decir al shell que quieres el último? Simplemente añade una barra ('/'), indicando así el final de est último nombre.

Puede ser que no esté seguro de si es /usr/src/linux/Documentation o /usr/src/linux/documentation . Como sabrá, Linux distingue entre minúsculas y mayúsculas. Si ha leído con atención hasta aquí, seguro que ya sabe la respuesta:

Image:Konsole.png
[usuario@computadora ~]$ cd /u\<TAB\>sr\<TAB\>l\<TAB\>/d\<TAB\>

expande a /usr/src/linux/drivers/ . Parece que era 'Documentation' (con 'D' en mayúscula).

Este tipo de completación funciona también para comandos:

Image:Konsole.png
[usuario@computadora ~]$ gre<TAB>
grecord grefer grep
Image:Konsole.png
[usuario@computadora ~]$ gre

Aquí el shell me lista todos los comandos que empiecen por la cadena 'gre'.

Histórico de comandos

Usando la tecla flecha hacia arriba, puede volver a ver todos los comandos que ha usado en esa consola recientemente. Usando la tecla flecha hacia abago, puede regresar a otros comandos. Junto con la techa mayúsculas (SHIFT), puede ver las salidas recientes de los comandos en la consola. De este modo se pueden editar comando 'antiguos' y ejecutarlos de nuevo.

La combinación de teclas CTRL + r pone a la shell en el modo "búsqueda incremental/reversa". Ahora teclee la primera letra del comando que esté buscando:

CTRL + r y ahora pulsando 'i' puede cambiar esta línea a

(reverse-i-search)`i': isdnctrl hangup ippp0

Si pulsa la tecla ENTER, este comando se volverá a ejecutar. Mediante las teclas de cursor derecha o izquierda, puede desplazarse para luego editar el comando si hiciera falta.

Edición de comandos

Puede navegar y editar comandos con las teclas de cursos y las teclas de función ('Home', 'End' etc), si así quiere, pero hay atajos de teclado para la mayoría de las tareas de edición:

  • CTRL + k: borra ('kill') desde la posición del cursor hasta el final de línea
  • CTRL + u: borra desde la posición del cursor hasta el inicio de línea
  • ALT + d: borra desde la posición del cursor hasta el final de la 'palabra' actual
  • CTRL + w: borra desde la posición del cursor hasta el inicio de la 'palabra' actual
  • CTRL + a: mueve el cursor hasta la primera letra de la línea
  • CTRL + e: mueve el cursor hasta el final de la línea
  • ALT + b: mueve el cursor hasta la primera letra de la 'palabra' actual
  • ALT + f: mueve el cursor hasta la última letra de la 'palabra' actual
  • CTRL + y: inserta la última 'palabra' borrada
  •  !$\: repite el último argumenteo del comando previo.

Ejemplo: Creaste un directorio mediante el comando mkdir peter/pan/documents/tinkerbell. Ahora quieres entrar en dicho directorio usando cd. En vez de teclearlo todo, puede poner

Image:Konsole.png
[usuario@computadora ~]$ cd !$

y el shell añadirá la ruta del directorio tomándola del comando mkdir previo y poniéndola en el comando cd actual.

Conforme se vaya adentrando en el mundo de Linux, verá que estos atajos de teclado se usan en otras aplicaciones a la hora de introducir texto, por ejemplo en los navegadores.

Atajos disponibles de la Shell

Mandriva Linux viene con una serie de atajos, algunos son parte de las características nativas del bash, otros son pre-configurados (mas adelante aprenderá más, acerca de cómo configurar sus propios atajos).

El directorio "home" es el punto focal para la actividad de cada usuario, muchos sistemas Unix ofrecen atajos especiales para llegar a él.

Por ejemplo, "~" (virgulilla) es una manera abreviada, asignada al nombre de su directorio "home". Supongamos que usted esta en algún directorio lejano y necesita copiar un archivo llamado "alguntexto", a ún directorio llamado "documentos", alojado a su vez dentro del directorio "home".

En lugar de escribir "cp alguntexto /home/myusername/documentos", usted puede escribir "cp alguntexto ~/documentos" que es mucho más corto, pero tiene exactamente el mismo efecto.

En teoría, esto también se aplica al comando cd. Pero realmente esto también se considera demasiado largo, de manera que si usted escribe solamente cd, esto le llevará a su directorio principal, sin importar donde esté.

Mandriva Linux provee una serie de atajos ya preconfiguras (llamados 'alias'):

  • cd.. ejecuta "cd .." (lo lleva al directorio padre).
  • d ejecuta 'ls' (lista el directorio).
  • l ejecuta 'ls' (lista el directorio).
  • la ejecuta 'ls -a' (lista el directorio completamente, e.j. incluidos los archivos que comienzan con un punto)
  • ll ejecuta 'ls -l -k' (lista el directorio con formato largo, e.j. con los atributos de archivos, muestra el tamaño de los archivos en KB y no en bytes)
  • ls ejecuta 'ls -F ––color=auto' (lista directorios, añade indicadores a los distintos tipos de archivos y utiliza los colores)
  • lsd ejecuta 'ls -d \*/' (solo lista los subdirectorios, no los archivos)
  • md ejecuta 'mkdir' (crea un directorio)
  • p ejecuta 'cd -' (regresa al directorio anterior)
  • rd ejecuta 'rmdir' (elimina un directorio (vacío))
  • s ejecuta 'cd ..' (para ir al directorio padre)

Ahora que usted está un poco más familiarizado con la shell y algunos de los atajos que ofrece, es hora de echar un vistazo a lo que realmente puede hacer con ella, además de la ejecución de comandos simples.

Usando la Shell IV

Cola de comandos

Llegará el momento en que use ciertas combinaciones de comandos a menudo. Querrá incluir todos los comandos en una sola línea para poder dedicarse a otra cosa. La shell lo permite, mediante el uso de ciertos caracteres entre comandos para hacer una cola de comandos. Esta sección introduce dos de los más importantes.

Nótese que tendrá que usaré espacios en blancos por simplicidad y claridad, aunque en la vida real no hagan falta. Por ejemplo, no hay diferencia entre ls -a ; du -hs y ls -a;du -hs.

Image:Konsole.png
[usuario@computadora ~]$ comando1 ; comando2

Ejecuta comando1 primero y luego comando2, aun cuando comando1 devuelva un error. Ejemplo:

Image:Konsole.png
[usuario@computadora ~]$ ls -a ; du -hs

Primero mostrará la lista completa de ficheros de un directorio y después el espacio total que ocupa un directorio junto con sus subdirectorios.

Image:Konsole.png
[usuario@computadora ~]$ comando1 && comando2

Ejecuta primero comando1 y solamente si se completó sin ningún error, entonces ejecuta comando2.

Ejemplo:

Image:Konsole.png
[usuario@computadora ~]$ ls -a bogusdir && du -hs

mostrará ls: bogusdir: No such file or directory y du no se ejecutará en absoluto (si no tiene ningún directorio llamado 'bogusdir', claro está ;-)). Si hubiera usado ';' en vez de '&&', el comando 'du' sí se habría ejecutado.

El ejemplo clásico para demostrar la diferencia entre ';' y '&&', y la utilidad de las colas de comandos, es la compilación del kernel de Linux.

Para compilar e instalar el núcleo de Linux, necesita ejecutar un conjunto de comandos uno detrás de otro: make dep, make clean, make bzImage, make modules, make modules_install y make install. Tener que esperar a que termine cada comando para decirle al sheel que ejecute el siguiente puede ser bastante pesado. En vez de eso, cada comando de la línea anterior será ejecutado sólo si todos los anteriores no devolvieron ningún error. Si usa ';' para hacer la cola de comandos, y uno de ellos falla, como los demás sí se ejecutarán, al final obtendrá un kernel inusable en el directorio /boot. En este caso, use '&&':

Image:Konsole.png
[usuario@computadora ~]$ make dep && make clean && make bzImage && make modules && make modules_install && make install

Esto compilará el kernel y sus módulos, y los instalará sin que haga falta ninguna interacción.

Command Jobbing

Cuando ejecuta comandos o inicia un programa desde terminal, la terminal se bloquea mientras el comando o programa este ejecutándose. En Unix, se dice que el comando o programa esta ejecutándose en 'primer plano' ('foreground'). Si necesita la terminal para ejecutar otro comando, deberá abrir una nueva terminal.

Pero existe una forma más elegante de hacerlo, llamada 'jobbing' o 'ejecutar en segundo plano' ('backgrounding'). Cuando realiza esto un comando liberara la terminalinmediatamente, y así la terminal puede ser usada nuevamente. Para hacerlo solo agregue un "&" (ampersand) despues del comando:

Image:Konsole.png
[usuario@computadora ~]$ gqview &

Le indica al shell que ejecute el visor gráfico 'GQview' en 'segundo plano' (i.e. to run it as a 'job').

El comando jobs le indicara que comandos y programas están ejecutandose en segundo plano en la actual ventana de terminal:

Image:Konsole.png
[usuario@computadora ~]$ jobs
[1]+ Running gqview &


Esto es importante al querer cerrar una ventana de terminal, ya que al cerrar la terminal se finalizaran todos lo que se este ejecutando. Esto es, si cierra la terminal del ejemplo, el programa GQview se cerrara también.

¿Pero y si ya esta ejecutando un programa en primer plano y desea ejecutarlo en segundo plano?, No hay problema:

Image:Konsole.png
[usuario@computadora ~]$ gqview

(press "CTRL z")
[1] Terminated gqview

[2]+ Stopped gqview<

Luego

Image:Konsole.png
[usuario@computadora ~]$ bg kview
[2]+ gqview &


La combinación de teclas CTRL z suspende un programa en ejecución en la terminal, así que puede usar el comando bg para enviarlo a segundo plano.

Tenga en cuenta que hay situaciones en la que iniciar una aplicación grafica desde una terminal en primer plano es útil. De esa forma los mensajes de error que la aplicación genere son mostrados en la terminal, y aun si no son útiles para usted pueden proporcionar pistas de lo que esta mal a la persona a la que le pida ayuda.

Algunos programas grafico, normalmente en su etapa de pruebas (o Beta), continuan enviando mensajes a la terminal que los controla incluso si están en segundo plano. Si este comportamiento le molesta, puede evitarlo ejecutando:

Image:Konsole.png
[usuario@computadora ~]$ command &>/dev/null &

Esto no solo envia el programa a segundo plano, también envía toda la salida que se mostraría de command en la terminal al archivo /dev/null . Solo para que se entere, /dev/null es el asesino de datos del sistema, todo lo que envié se desvanecerá inmediatamente sin dejar rastro.

Command Substitution

Command substitution is a very handy feature. Let's say you want to have a look at the README.mouse file from the XFree86 documentation, but you don't know where it is. Since you are a clever user, you've already heard of the 'locate' command and have the 'slocate' package installed. So you do a:

Image:Konsole.png
[usuario@computadora ~]$ locate README.mouse

and you find out it is located in /usr/X11R6/lib/X11/doc. Now you either use the terminal pager less or your file manager to display that file, providing that path. Command substitution makes that much easier for you:

Image:Konsole.png
[usuario@computadora ~]$ less $(locate README.mouse)

Accomplishes the same in one step. The output of the command locate README.mouse (= /usr/X11R6/lib/X11/doc/README.mouse) is used as the argument for the less pager, which now displays this file.

The syntax for this mechanism is:

Image:Konsole.png
[usuario@computadora ~]$ command1 $(command2)

Instead of '$()', you can use single backquotes:

Image:Konsole.png
[usuario@computadora ~]$ command1 `command2`

That's less to type, but harder to read in scripts and more easily to confuse with 'normal' single quotes, which the shell won't accept as substitution indicators. I prefer the first method, but in the end it's up to you.

Here's another example. Let's say you want to kill some stubborn program called rob. You can do this by finding out what its Process ID is with the pidof command and then issuing the kill command with this PID as its argument. Instead of typing

Image:Konsole.png
[usuario@computadora ~]$ pidof rob
567
kill 567

You type:

Image:Konsole.png
[usuario@computadora ~]$ kill `pidof rob`

It is more efficient, isn't it?

Next, I'll introduce two more useful shell mechanisms, file name globbing and output redirection.

Using the Shell V

Filename Globbing or Expansion

Filename globbing allows you to provide more than one filename to a command without having to write all filenames in full. You use special characters for this, called 'wildcards'.

Say you want to delete all files in a directory that end with the string .bak using the rm command. Instead of typing each filename as an argument to rm, you use the '*' wildcard:

Image:Konsole.png
[usuario@computadora ~]$ rm *.bak

'*' matches zero or more characters. In this example, you tell the shell to expand the argument to the rm command to "all file names ending on or consisting of the string .bak", the shell does so and passes that expanded argument to the rm command.

As you will see, it is important to note that the shell reads and interprets the command line before the command does it. This has the advantage that you can use wildcards with (almost) all shell commands which take strings (file names, directory names, search strings etc) for an argument.

Let's play a bit more with the '*' wildcard. You have a directory which contains the files 124.bak, 346.bak and 583.bak. You want to keep 583.bak. What you do is this

Image:Konsole.png
[usuario@computadora ~]$ rm *4*.bak

The shell expands '*4*.bak' to "all file names which contain the number '4' and the end on the string .bak".

Notice that rm 4*.bak would not have worked, since this would only have encompassed file names beginning with the number '4'. Since there are no such files in this directory, the shell expands this pattern to an empty string and rm issues an error message:

Image:Konsole.png
[usuario@computadora ~]$ rm: cannot remove `4*.bak': No such file or directory

Now you want to keep the file 346.bak but delete 124.bak and 583.bak. That's trickier since the files which are to be deleted have nothing in common except the ending. But lucky as you are, you can also define files by what they not have:

Image:Konsole.png
[usuario@computadora ~]$ rm *[!6].bak

This reads: "delete all files which end on the string .bak except for those which end on the string 6.bak". You have to put the negation sign '1.1 ' and the character to be negated (here '6') into brackets, because otherwise the shell interprets the exclamation mark as the beginning of a history substitution. Negation works with all globbing patterns introduced in this article.

Notice that it is very easy to shoot yourself in the foot with the '*' wildcard and negation. Guess what

Image:Konsole.png
[usuario@computadora ~]$ rm *[!6]*.bak

does? It deletes all the files, even the one which does contain a '6' in its filename. If you put '*' wildcards before and after a negation, it renders the negation practically useless, because the shell expands this to "all file names which do not have that character at any given position". In our example, the only file name on which that pattern would not have matched, would have been 666.bak.

The second wildcard is the question mark, '?'. In a globbing pattern, a question mark represents exactly one character. To demonstrate its use, let's add two new files to the three example files, 311.bak~ and 'some.text'. Now list all files, which have exactly four characters after the dot:

Image:Konsole.png
[usuario@computadora ~]$ ls *.????

does this. The question mark wildcard is also a useful means to avoid the 'negation trap' mentioned above:

Image:Konsole.png
[usuario@computadora ~]$ rm *[!4]?.*

This expands to "all files except for those with a '4' in the second to last position before the dot" and deletes all files except for 346.bak.

Is there more? You bet. So far, you've only seen globbing patterns which match one character at a certain position. But nothing keeps you from matching more than one:

Image:Konsole.png
[usuario@computadora ~]$ ls [13]*

lists all files which either begin with the character '1' or the character '3'; in our test case the file 124.bak, 311.bak~ and 346.bak match. Notice that you have to enclose the pattern in brackets, otherwise the pattern would match only files which begin with the string '13'.

Now all that's left for ultimate happiness to ensue is the possibility to define ranges of matches:

Image:Konsole.png
[usuario@computadora ~]$ ls *[3-8]?.*

lists all files whose second to last character before the dot is a number between '3' and '8'. In our example, this matches the files 346.bak and 583.bak.

Quoting Special Shell Characters

These powerful mechanisms have one drawback, though: the shell will always try to expand them, and it will do so before the command. There are several cases in which this can get in your way:

  • File names with special characters. Assume you have another file in that directory with the name 1.1 56.bak. Try to match it with a globbing pattern:
Image:Konsole.png
[usuario@computadora ~]$ rm !*

rm

rm: too few arguments

The shell interprets '1.1*' as a history substitution ('insert all arguments from previous command'), not as a globbing pattern.

  • Commands which take special characters as arguments themselves. A row of Linux command line tools like (e)grep, sed, awk, find and locate for example use their own set of what is then called 'regular expressions'. These expressions may look strikingly similar to globbing patterns but are in some cases interpreted differently.
    But in order to enable the command to interpret them in the first place, the shell must be prevented from interpreting them as globbing patterns first:
Image:Konsole.png
[usuario@computadora ~]$ find . -name [1-9]* -print
find: paths must precede expression

Properly:

Image:Konsole.png
[usuario@computadora ~]$ find . -name '[1-9]*' -print

./346.bak
./124.bak
./583.bak

./311.bak~

You can quote such special characters like 1.1 , $, ? or the empty space either with a back slash:

Image:Konsole.png
[usuario@computadora ~]$ ls \!*
!56.bak

or with (single) quotes

Image:Konsole.png
[usuario@computadora ~]$ ls '!'*
!56.bak

Notice that using quotes may need some deliberation on where to put them.

Image:Konsole.png
[usuario@computadora ~]$ ls '1.1 *'

would look for file called 1.1 \* since the second wildcard is now quoted, too, and thus interpreted literally.

Redirección de salida

La filosofía de Unix es tener muchos programas pequeños, cada uno brillando en una tarea. Las tareas complejas no son realizadas por programas complejos sino mediante la unión de muchos programas con un puñado de mecanismos shell. Uno de ellos es la redirección de salida.

Redireccionando entre dos o más comandos

Ésto se hace mediante 'tuberías', denotadas mediante el símbolo de cañería | ('pipe' en inglés). La syntaxis es:

[usuario@computador ~]$ comando1 | comando2 | comando3

Etc.

Seguramente ya las ha visto. Son usualmente utilizadas para redireccionar la salida de un programa a un paginador como 'more' o 'less'.

Image:Konsole.png
[usuario@computadora ~]$ ls -l

El primer comando provee el listado del directorio y el segundo lo despliega de una manera navegable en pantalla. Un ejmplo mas complejo:

Image:Konsole.png
[usuario@computadora ~]$ rpm -qa

El primer comando lista todos los paquetes RPM instalados, el segundo filtra (grep) aquellos que comienzan ('^') con una 'x' y el tercero muestra los resultados paginados en una lista navegable.

Redirección desde o hacia archivos

A veces se quiere guardar la salida de un comando en un archivo o alimentar ese comando desde una archivo. Esto se hace por medio de los operadores '>' y '<'.

Image:Konsole.png
[usuario@computadora ~]$ comando > archivo

guarda la salida del comando en el archivo, sobreescribiendo todo el contenido previo del archivo:

Image:Konsole.png
[usuario@computadora ~]$ ls > listadodir

guarda el listado de el directorio actual a un archivo llamado listadodir.

Image:Konsole.png
[usuario@computadora ~]$ comando < archivo

utiliza el archivo como entrada para el comando:

Image:Konsole.png
[usuario@computadora ~]$ sort < listadodir > slistadodir

pasa el contenido de listadodir al comando sort, el cual lo ordena y lo entrega el contenido ordenado en el archivo slistadodir. Por supuesto, si usted es inteligente, hará lo mismo con un paso:

Image:Konsole.png
[usuario@computadora ~]$ ls

Un caso especial es command 2> archivo. Esto pune sólo los mensajes de error en el archivo. Puede ser necesario de cuando en cuando...

Otro operador es '>>'. Éste agrega la salida a un archivo existente, es decir, no borra el contenido previamente existente.

Image:Konsole.png
[usuario@computadora ~]$ echo "texto" >> archivo

Esto agregaría texto al contenido del archivo archivo. Una manera rápida de editar un archivo sin abrir un editor antes.

Existe una restricción importante a los operadores '>' y '<': Algo como

Image:Konsole.png
[usuario@computadora ~]$ comando < archivo1 > archivo2

borará el contenido de archivo1. Sin embargo,

Image:Konsole.png
[usuario@computadora ~]$ comando < archivo1 >> archivo2

funcionará bien y agregará el contenido procesado de archivo1 al mismo archivo.

Esto es mucho, ¿no es cierto?. No hay que entrar en pánico. Se puede aprender todo paso a paso a tu propio paso. La práctica hace al maestro.

Una vez que esté familiarizado con los mecanismos shell más comunes, sentirá el deseo de personalizar su ambiente. Encontrará algunas ideas en las siguientes secciones. En la última parte de este artículo también encontrará un pequeño listado de preguntas frecuentes que tratan sobre los mensajes de error más comunes de la consola y algunas configuraciones menores.

Using The Shell VI

Archivos de configuración bash

Cuando se hace un

Image:Konsole.png
[usuario@computadora ~]$ ls .bash*

en el directorio home, se verá una lista de archivos:

  • .bash_history contiene un listado de los comandos que se han ingresado.
  • .bash_logout contiene un listado de los comandos a ser ejecutados al abandonar una shell.
  • .bash_profile contiene una lista de comandos a ser ejecutados cuando se ingresa al sistema.
  • .bashrc contiene el listado de comandos a ser ejecutados cada vez que se abre una nueva shell.

Nótese que existe una diferencia entra las dos últimas: .bash_profile es leído una vez al comienzo de una sesión, mientras que .bashrc es leído cada vez que se abre un nuevo terminal (por ejemplo, una nueva ventana de xterm). En una configuración tradicional se definirían variables como PATH en .bash_profile, y cosas como aliases y funciones en .bashrc. Pero ya que .bash_profile es usualmente pre-configurado para leer el contenido de .bashrc de todas maneras, se podría también ahorrar un poco de esfuerzo y poner toda la información de configuración en .bashrc.

Estos archivos definen las configuraciones por usuario. Las configuraciones de sistema se almacenan en /etc/profile, /etc/bashrc y en los archivos ubicados en /etc/profile.d. Usted debería preferir el uso de los archivos de configuración por usuario, ya que su edición no requiere permisos de 'root', y también permiten hacer configuraciones diferentes para 'root' y para cada cuenta de usuario, lo cual puede ser algo bueno. En caso de conflictos entre configuraciones de usuario y de sistema, las configuraciones de usuario prevalecen.

The Prompt

The prompt is the first thing you see every time you open a console or an xterm. It looks like this:

Image:Konsole.png
[usuario@computadora ~]$

In its default setting it shows your user name, the hostname of your machine (or 'localhost' is you haven't assigned one) and the current working directory ('~' is the Unix shortcut for your home directory).

Traditionally, the last character is set up to indicate whether you are a user ($) or 'root', in which case it changes to a hash (#).

You can set or change your prompt via changing the content of the $PS1 variable. The command

Image:Konsole.png
[usuario@computadora ~]$ echo $PS1

displays the current setting. Available special characters and their meaning are listed in man bash, section PROMPTING.

Need some ideas on what might be a better prompt? Well, for starters the default setting isn't very friendly to forgetful people, since it only shows the last part of your current path. If you see a prompt like

[tom@localhost bin] $

your current working directory could be /bin, /usr/bin, /usr/local/bin or /usr/X11R6/bin. Sure, you can type

Image:Konsole.png
[usuario@computadora ~]$ pwd

to find out where you are, but shouldn't there be a way to tell the shell to do that on its own accord?

There is. The appearance of the prompt - and for most of the other settings discussed here - is set in /etc/bashrc. You may also change it on a per user basis by editing .bash_profile and .bashrc in your home directory.

Parameters are described in man bash, chapter 'PROMPTING'. You can add nifty things like the current time in different formats or the history number of the command, even different colors are possible.

My currently favored setting in my user ~/.bashrc is:

PS1="PS1="\[\033[1m\][\w]\[\033[0m\] "

'root's ~/.bashrc has:

PS1="\[\033[0;31m\][\w]\[\033[0m\] "

And the prompt I get, is this:

[/usr/bin]

And this when I'm 'root':

[/usr/bin]

I've chopped the host- and user name part, since I have no need for it. But I want to see at first glance if I am logged in as a user or as 'root' on this console. Note that the user prompt will be white on dark backgrounds and black on light ones.

A more moderate setting might be

PS1="\u: \w\\$ "

which will result in prompts like these:

user_name: /usr/bin$

but who cares about being moderate? :-)

You can test various settings on the fly by using the export command e.g.: export PS1="\u: \w\\$ ". If you've found a prompt command which suits you, put it into your .bashrc. That way it will be applied automatically to every console or terminal window you open.

You may even 'theme' your prompt, i.e. use different colors or make it look like an good ol' C64 prompt. If you are interested in this, have a look at Bashish.

Modificar $PATH

'$PATH', como '$PS1', pertenece al grupo de variables de entorno. Escriba

Image:Konsole.png
[usuario@computadora ~]$ set

para obtener un listado completo de todas las variables de entorno actualmente definidas.

Las variables de entorno que se ven aquí están definidas en los archivos de configuración de la shell, ya sea por el conjunto de archivos de configuración de shell de los usuarios, o por los archivos de configuración de shell de root a nivel de sistema, localizados en /etc. Si está en X, mas variables son configuradas por los archivos de inicio de X de su administrador de ventanas o ambiente de escritorio.

Usted no debería complicarse con las configuraciones de la mayoría de estas variables a menos que sepa lo que está haciendo y por qué. Sin embargo, saber cómo cambiar la variable $PATH puede ser de utilidad ya que determina los nombres de directorios donde la shell busca por comandos o programas, es decir, por archivos ejecutables. Si el comando que quiere ejecutar está dentro de un directorio que es listado en $PATH, no necesita entregar la ruta completa al comando, sólo el nombre de él. Algunas aplicaciones de terceros no instalan sus archivos ejecutables en los directorios estándares de comandos y programas de Linux. Agregar sus ubicaciones de instalación no estándares a $PATH es una alternativa posible. Mas aún, esto también te enseñará a trabajar con variables de ambiente en general.

Primero que todo habrá notado que los nombres de las variables de entorno están escritas en letras mayúsculas. Esto es sólo una convención, pero es importante tenerlo en mentet ya que Linux hace la diferencia entre letras mayúsculas y minúsculas. Usted puede definir variables como '$path' o '$pAth', pero la shell no las utilizará.

Lo segundo es que los nombres de variables son precedidos por un signo '$' algunas veces, aunque otras no. Para setear una variable, se usa el nombre sin el signo '$' precediéndola:

PATH=/usr/bin:/bin:/usr/local/bin:/usr/X11R6/bin

para accesar la variable y su valor, necesita poner el signo '$' en frente de ella:

Image:Konsole.png
[usuario@computadora ~]$ echo $PATH
/usr/bin:/bin:/usr/local/bin:/usr/X11R6/bin

porque, de otra manera, el nombre de la variable es tratado como una simple cadena de texto:

Image:Konsole.png
[usuario@computadora ~]$ echo PATH
PATH

El tercer punto es especialmente importante para trabajar con la variable $PATH. No sólo se pueden reemplazar variables, sino también agregar nuevas cadenas de texto a sus valores. La mayor parte del tiempo, no querrá hacer algo como 'PATH=/some/directory' porque ello borraría los otros directorios de su $PATH y lo forzaría a proveer la ruta completa a cada comando que quiera ejecutar en esa terminal. En vez de eso, sólo agregue:

PATH=$PATH:/un/directorio

Aquí PATH es seteado a su valor actual, representado por $PATH, más un directorio adicional.

Hasta ahora sólo se ha intentado setear la variable $PATH para el terminal en el cual se ha escrito el comando. Si abre un nuevo terminal y se ejecuta echo $PATH, verá la $PATH antigua, sin el directorio que se agregó. Se ha definido una variable de entorno local, restringida al terminal en el que definió esa variable.

Para definir una variable global que sea reconocida por todos los terminales que abrirá en esta sesión, se debe exportar la variable local con el comando 'export':

export PATH=$PATH:/un/directorio

Si ahora abre un nuevo terminal y escribe echo $PATH, verá el nuevo valor de $PATH en este terminal. Note, sin embargo, que el comando 'export' sólo setea o cambia las variables para el terminar que está corriendo y en terminales que se inicien después de que ha sido ejecutado. Los terminales que están ya abiertos aún tendrán el viejo $PATH.

Para agregar un directorio de manera permanente a su $PATH, solo agregue el comando 'export' anterior a su {file|.bash_profile}}.

No utilice .bashrc para configuraciones de PATH que involucren la adición de directorios al PATH existente. .bashrc es ejecutado cada vez que abre una nueva shell, así que si agrega un directorio al PATH en él, será agregado nuevamente y cada vez que abra un terminal. Esto causa que la variable PATH contenga un número siempre creciente de entradas de directorio duplicadas.

La última parte de este artículo introducirá dos métodos de configuración, más avanzados, y un FAQ que trata sobre problemas menores de mensajes de errores de configuración.

Usar la Shell VII

Recordar todos los tipos de comandos y sus opciones y escribirlos todo el tiempo es un trabajo tedioso. Afortunadamente usted no tiene que hacerlo. Puede definir atajos para comandos de uso frecuente. Éstos atajos pueden ser definidos de forma relativamente simple por medio de aliases de comandos o de forma un poco mas compleja con funciones shell.


Command Aliases And Shell Functions

Command Aliases

For example, I use this command to upload my stuff to MUO:

Image:Konsole.png
[usuario@computadora ~]$ rsync -e ssh -z -t -r -vv ––progress /home/tom/web/muo/rsmuo/docs muo:/www/mandrakeuser/docs

Obviously I'd go nuts if I had to type this command line each time. So I have defined what is called an 'alias' in ~/.b/fre/ashrc:

alias upmuo='rsync -e ssh -z -t -r -vv --progress /home/tom/web/muo/rsmuo/docs muo:/www/mandrakeuser/docs'

Now all I have to do to upload my stuff is to type upmuo.

The syntax for defining an alias is:

alias shortcut='command'

The quotes are necessary when the command contains empty spaces (e.g. between command and option). Notice that you either quote using single quotes or using double quotes. If you've got a hitch that there's a difference between those two, then you are right ;-).

Single quotes strip the special meaning from all characters included, double quotes from all characters except for '$' (parameter substitution) and '`' (command substitution). Which means in order to use variables or command substitution in aliases, you have to use double quotes. If you look at the example above, I could define a variable called MUOHOME in .bashrc:

export MUOHOME=$HOME/web/muo/rsmuo/docs

To use that variable in the alias above, I would have to use double quotes:

alias upmuo="rsync -e ssh -z -t -r -vv ––progress $MUOHOME muo:/www/mandrakeuser/docs"

because otherwise the alias would search for an directory or file called $MUOHOME.

You can create aliases 'on the fly' with the alias command on the command line, or list them in ~/.bashrc (per user), or in /etc/profile.d/alias.sh (for every user and 'root'), in pre-8 Mandrake Linux releases, /etc/bashrc fulfills that function. To delete an alias, simply type: unalias alias. Just running alias will list all the defined aliases on your system.

If you have a look at ~/.bashrc and /etc/profile.d/alias.sh, you'll see that there are already some aliases defined. You can define more than one alias for the same command. Of course, you must make sure that your alias isn't the name of some other program, something like alias rm='ls -l' won't work. You can try this by typing the shortcut you want to use on the command line. If the shell can't find a command with this name, you can use it as an alias.


Some aliases that might be useful (don't forget the quotes1.1 ):

  • alias rpmq='rpm -qa | grep': Now rpmq string will list all installed RPMs which contain string in their name.
  • alias ls='ls -ho ––color | more': ls will now print a colored and paged listing with file sizes in KB.
  • alias use='du ––max-depth=1 | sort -n | more': use gives you a paged list of subdirectory sizes ordered by size.
  • alias dkd='cd /usr/src/linux/Documentation': Frequently used directories can be aliased as well. Other prospective candidates are for example the subdirectories of '/mnt'.

Aliased directories may also be on removable media: alias dlm='/mnt/cdrom/Mandrake/RPMS/'.

One mnemonic hint: try to start aliases with a similar function always with the same letter. For instance, begin all your directory aliases with a 'd'.

I am sure you will find lots of possibilities for using this feature.

Shell Functions

Writing shell functions already boarders on the topic of shell scripting, which is beyond the scope of this article (and mine ;-)). In fact, shell functions are shell scripts, but they have the advantage of being preloaded and being executed in the same shell (whereas a shell script opens at least one sub-shell).

With shell functions, you can do a lot of things you can't do with aliases. One example:


function apros() { apropos $1 | egrep -v '(3|\(n\)'; }


This defines a new command, called 'apros'. apros name will execute 'apropos name' (i.e. a search command for man pages) and pipe (|) the output of that command through 'egrep' which filters out all man pages from sections '3' and 'n', which usually are not of interest, but tend to mess up the output of the apropos command.

Functions allow you to use arguments given to the function name at any place of the function command. With aliases, only one argument is allowed and that argument has to be at the end of the command line (like in the 'rpmq' alias above).

'$1' is a so-called 'positional parameter', it's a placeholder for the first argument given to the function. Of course there are more.

function apros() { apropos $1 | egrep -v "\($2"; }

If you now run the apros command like this:

apros name man_section_number

it searches for name, but excludes all man pages from man_section_number:

apros menu 3

returns all man page titles which contain 'menu', except those from section 3 (programming). Notice that you have to quote twice and that you have to use double quotes:

  • You must quote the 'egrep' search pattern in order to protect it from the shell.
  • You must use double quotes to get the second positional parameter interpreted correctly.
  • You must quote the round bracket again in order to tell 'egrep' to take it literally and not as a special control character .

Tricky, ain't it? ;-).

Shell functions are handled just like aliases: put them into your .bashrc to have them around permanently.

A dónde ir desde aquí

Este artículo es sólo el comienzo. La programación de scripts en Shell le puede ayudar a automatizar muchas tareas, a corregir usted mismo errores en scripts de otros y a personalizar su sistema Mandriva Linux a gusto en (casi) todo aspecto. Si planea aprender alguno de los lenguajes de programación más complejos que existen, la programación en shell es un buen lugar para comenzar debido a que los conceptos básicos son similares.

El cómo en inglés BASH Programming - Introduction HOW-TO explicará en mayor profundidad los tópicos abordados en este artículo y lo introducirá en el mundo de la programación shell. Puede continuar con la muy recomendable, y también libre, Guía avanzada de programación en Bash (en inglés).

Si prefiere libros, le podemos recomendar Teach Yourself Shell Programming de S. Veeraraghavan, de Publicaciones Sams. También está Learning the Bash Shell de Newham/Rosenblatt, de la editorial O'Reilly.

Además de todo esto, practique, practique y practique. Lea programas de shell de otros e intente comprender lo que hacen, cómo y porqué. Un consejo importante: no ejecute sus programas bash como 'root' :D.

Preguntas frecuentes de Shell (FAQ)

¿Cómo apago ese &\*# pitido?

Con este comando:

Image:Konsole.png
[usuario@computadora ~]$ setterm -blength 0
¿Por qué obtengo "bash: command: command not found"?

Si no es un error de tipeo, lo mas probable es que el comando que esté intentando ejecutar se encuentre en un directorio que no es parte de su $PATH. Entregue la ruta completa al comando. Si está en el mismo directorio que el comando, escriba ./command.

¿Por qué me aparece "bash: command: Permission denied"?

Para que un archivo sea ejecutable, los [permisos | BasicsBpermis] de ejecución deben estar configurados para el usuario que quiera ejecutar el archivo. Escriba:

Image:Konsole.png
[usuario@computadora ~]$ chmod 755 archivo

Si eso no funciona, lea el artículo sobre permisos.

El bit de ejecución está habilidato, tengo permisos de ejecución pero el permiso es denegado, ¿por qué?

Chequea en '/etc/fstab' la entrada de la partición donde está el archivo. Asegúrate de que no contienen la opción 'noexec'. Si contiene la opción 'user', la opción 'exec' debe ser habilitada también.

¿Cómo cambio los colores de listado de archivos?

Copie '/etc/DIR_COLORS' a su directorio home y renómbrelo a '.dir_colors'. Todo lo que necesita está en ese archivo.

He puesto un script 'foo' en mi directorio ~/bin, pero cada vez que intento ejecutarlo, un comando distinto, también llamado 'foo', es iniciado. ¿Por qué?

Eche una mirada a su $PATH y verá que su directorio personal ~/bin es el último o al menos muy cerca del final de $PATH. La shell buscará los directorios listados en $PATH uno tras otro. Tan pronto como encuentre el primer comando que calce, ejecutará ese comando. Si hay un comando en su sistema con el mismo nombre que el script, ese comando será ejecutado, no su script. Renombre su script.

¿Qué significa "bash: command: bad interpreter"?

Esto sucede usualmente con binarios de instalación de terceros o aplicaciones Java. Estas aplicaciones necesitan una shell propia, así que en vez de

Image:Konsole.png
[usuario@computadora ~]$ command

usted tiene que ejecutar

Image:Konsole.png
[usuario@computadora ~]$ sh command
Mi terminal se congela cada vez que presiono "<CTRL s>"

Entonces no lo hagas! ;9. CTRL s envía un comando de bloqueo de desplazamiento al terminal. Para desbloquearlo, sólo presione CTRL q.

Related Resources

Jerry Peek: 'Why Use a Command Line Instead of Windows?'
Eric S. Raymond: 'A Brief History of Hackerdom'
Text-Terminal-HOWTO
~MdkRef. 3,3
~MdkRef. 3,4
Filename Expansion
~MdkRef, 3.5


Revision / Modified: Mark_1830 08:00, 13 July 2009 (UTC)
Revision / Modified: Feb. 28, 2002
Author: Tom Berger


Other resources


Author : ptyxs (march 2006)

Herramientas personales