Sei sulla pagina 1di 165

Traducción del

Manual de Referencia para Bash (version 4.1)


Edicion 0.9.1
Diciembre de 2010

Chet Ramey, Case Western Reserve University


Brian Fox, Free Software Foundation
Mario Piñar Ramírez (Traducción)
Esta es una traducción no autorizada de la Documentación de Referencia de Bash. Está basada en la
Edición 4.1, para Bash versión 4.1, de Diciembre de 2009.

La última versión original (en inglés) del Manual de Referencia de Bash se puede encontrar en el
sitio oficial del programa GNU Bash: http://www.gnu.org/software/bash/bash.html

Copyright © 1988–2009 Free Software Foundation, Inc.

Se autoriza a copiar, distribuir y/o modificar este documento bajo los términos de la GNU Free
Documentation License, Versión 1.3 o cualquier versión posterior publicada por la Free Software
Foundation; sin Secciones Invariantes, sin los textos de Portada y sin los textos de Contraportada. Se
incluye una copia de la licencia en la sección titulada “GNU Free Documentation License” en el
Apéndice C, seguida por una traducción de la misma (Apéndice D) obtenida de:

http://docs.danexlandia.com.mx/gfdl/gfdl_es.f.html

Puede comunicar sugerencias o errores en la dirección traduccionbash41@gmail.com

Página ii
Datos de la Edición original:

Bash Reference Manual -


Reference Documentation for Bash
Edition 4.1, for Bash Version 4.1.
December 2009

Chet Ramey, Case Western Reserve University


Brian Fox, Free Software Foundation

Bash - Manual de Referencia


Documentación de Referencia para Bash
Edición 4.1, para Bash versión 4.1
Diciembre de 2009

Chet Ramey, Case Western Reserve University


Brian Fox, Free Software Foundation

Página iii
Presentacion de la version original
This text is a brief description of the features that are present in the Bash shell (version 4.1, 23
December 2009).
This is Edition 4.1, last updated 23 December 2009, of The GNU Bash Reference Manual, for
Bash, Version 4.1.
Copyright © 1988–2009 Free Software Foundation, Inc.
Permission is granted to make and distribute verbatim copies of this manual provided the
copyright notice and this permission notice are preserved on all copies.
Permission is granted to copy, distribute and/or modify this document under the terms of the
GNU Free Documentation License, Version 1.3 or any later version published by the Free Software
Foundation; with no Invariant Sections, with the Front-Cover texts being “A GNU Manual”, and with
the Back-Cover Texts as in (a) below. A copy of the license is included in the section entitled “GNU
Free Documentation License”.
(a) The FSF’s Back-Cover Text is: You are free to copy and modify this GNU manual. Buying
copies from GNU Press supports the FSF in developing GNU and promoting software freedom.”
Published by the Free Software Foundation
59 Temple Place, Suite 330,
Boston, MA 02111-1307
USA

Presentacion de la version original (traducida)


Este texto es una breve descripción de las características que están presentes en la shell Bash (versión
4.1 de 23 de diciembre de 2009)
Esta es la edición 4.1, actualizada por última vez el 23 de diciembre de 2009, del Manual de
Referencia de GNU Bash para Bash Versión 4.1
Copyright © 1988-2009 Free Software Foundation, Inc.
Se concede permiso para hacer y distribuir copias literales de este manual manteniendo el aviso
de copyright y este aviso de autorización en todas las copias.
Se autoriza a copiar, distribuir y/o modificar este documento bajo los términos de la GNU Free
Documentation License, Versión 1.3 o cualquier versión posterior publicada por la Free Software
Foundation; sin Secciones Invariantes, con la portada “A GNU Manual”, y con los textos de contra-
portada como en el apartado (a) mostrado más abajo. Se incluye una copia de la licencia en la sección
titulada “GNU Free Documentation License”.
(a) El texto de contraportada de la FSF es: Eres libre de copiar y modificar este manual GNU.
Comprar copias en la GNU Press da soporte a la FSF para continuar desarrollando GNU y
promoviendo la libertad de software.

Publicado por la Free Software Foundation


59 Temple Place, Suite 330
Boston, MA 02111-1307
USA

Página iv
Índice de Contenido

Índice de contenido
1.-Introducción......................................................................................................................................9
1.1.-¿Qué es Bash?...........................................................................................................................9
1.2.-¿Qué es una shell?.....................................................................................................................9
2.-Definiciones....................................................................................................................................11
3.-Características Básicas de la Shell...................................................................................................13
3.1.-Sintaxis de la shell...................................................................................................................13
3.1.1.-Modo de operación de la shell.........................................................................................13
3.1.2.-Entrecomillado................................................................................................................14
3.1.2.1.-Carácter de Escape..................................................................................................14
3.1.2.2.-Comillas simples......................................................................................................14
3.1.2.3.-Comillas Dobles.......................................................................................................14
3.1.2.4.-Entrecomillado ANSI-C..........................................................................................14
3.1.2.5.-Traducciones Específicas de la Localización............................................................15
3.1.3.-Comentarios....................................................................................................................15
3.2.-Comandos de Shell..................................................................................................................16
3.2.1.-Comandos simples...........................................................................................................16
3.2.2.-Tuberías...........................................................................................................................16
3.2.3.-Listas de Comandos.........................................................................................................17
3.2.4.-Comandos Compuestos...................................................................................................17
3.2.4.1.-Construcciones Cíclicas...........................................................................................18
3.2.4.2.-Construcciones Condicionales..................................................................................18
3.2.4.3.-Agrupando Comandos.............................................................................................21
3.2.5.-Coprocesos......................................................................................................................22
3.3.-Funciones de Shell...................................................................................................................23
3.4.-Parámetros de Shell.................................................................................................................24
3.4.1.-Parámetros posicionales...................................................................................................25
3.4.2.-Parámetros Especiales.....................................................................................................25
3.5.-Expansiones de la shell............................................................................................................26
3.5.1.-Expansión de Llaves........................................................................................................27
3.5.2.-Expansión de Tildes.........................................................................................................27
3.5.3.-Expansión de Parámetros de Shell...................................................................................28
3.5.4.-Sustitución de Comandos................................................................................................31
3.5.5.-Expansión Aritmética......................................................................................................32
3.5.6.-Sustitución de Procesos...................................................................................................32
3.5.7.-Separación de palabras....................................................................................................33
3.5.8.-Expansión de Nombres de Fichero..................................................................................33
3.5.8.1.-Concordancia de Patrones........................................................................................34
3.5.9.-Eliminación del entrecomillado.......................................................................................35
3.6.-Redirecciones..........................................................................................................................35
3.6.1.-Redireccionando la entrada.............................................................................................36
3.6.2.-Redireccionando la salida................................................................................................36
3.6.3.-Anexando la salida redirigida...........................................................................................37
3.6.4.-Redirigiendo la Salida Estándar y la Salida de Error Estándar.........................................37
3.6.5.-Anexando la Salida Estándar y la Salida de Error Estándar.............................................37

Página v
Índice de Contenido

3.6.6.-Documentos Internos (Here Documents).........................................................................37


3.6.7.-Cadenas Internas (Here strings).......................................................................................38
3.6.8.-Duplicando Descriptores de Fichero................................................................................38
3.6.9.-Moviendo Descriptores de Fichero..................................................................................38
3.6.10.-Abriendo descriptores de fichero para lectura y escritura..............................................38
3.7.-Ejecutando comandos..............................................................................................................39
3.7.1.-Expansión de un comando simple....................................................................................39
3.7.2.-Búsqueda y Ejecución de Comandos...............................................................................39
3.7.3.-Entorno de Ejecución de Comandos................................................................................40
3.7.4.-Entorno............................................................................................................................41
3.7.5.-Estados de Salida.............................................................................................................42
3.7.6.-Señales.............................................................................................................................42
3.8.-Guiones de Shell......................................................................................................................43
4.-Comandos Internos de la Shell........................................................................................................44
4.1.-Comandos Internos de la Shell Bourne....................................................................................44
4.2.-Comandos Internos de Bash....................................................................................................51
4.3.-Modificando el Comportamiento de la Shell...........................................................................61
4.3.1.-El comando Interno Set...................................................................................................61
4.3.2.-El Comando Interno Shopt..............................................................................................66
4.4.-Comandos Internos Especiales................................................................................................71
5.-Variables de Shell............................................................................................................................73
5.1.-Variables de la Shell Bourne....................................................................................................73
5.2.-Variables de Bash....................................................................................................................74
6.-Características de Bash...................................................................................................................85
6.1.-Invocando a Bash....................................................................................................................85
6.2.-Ficheros de Inicio de Bash.......................................................................................................87
6.3.-Shells Interactivas....................................................................................................................89
6.3.1.-¿Qué es una Shell Interactiva?.........................................................................................89
6.3.2.-¿Es esta una shell Interactiva?..........................................................................................89
6.3.3.-Comportamiento de la Shell Interactiva...........................................................................89
6.4.-Expresiones Condicionales de Bash.........................................................................................91
6.5.-Aritmética de la Shell..............................................................................................................93
6.6.-Alias........................................................................................................................................94
6.7.-Arrays.....................................................................................................................................95
6.8.-La Pila de Directorios.............................................................................................................96
6.8.1.-Comandos Internos de la Pila de Directorios...................................................................96
6.9.-Controlando el Prompt............................................................................................................97
6.10.-La Shell Restringida..............................................................................................................99
6.11.-El Modo POSIX de Bash......................................................................................................99
7.-Control de Tareas..........................................................................................................................103
7.1.-Fundamentos del Control de Tareas......................................................................................103
7.2.-Comandos Internos para el Control de Tareas.......................................................................104
7.3.-Variables para el Control de Tareas.......................................................................................106
8.-Edición de la Línea de Comandos.................................................................................................107
8.1.-Introducción a la Edición de la Línea de Comandos..............................................................107
8.2.-Interacción con Readline.......................................................................................................107

Página vi
Índice de Contenido

8.2.1.-Los Fundamentos de Readline al Desnudo....................................................................108


8.2.2.-Comandos de Movimiento de Readline.........................................................................108
8.2.3.-Comandos para cortar texto de Readline.......................................................................109
8.2.4.-Argumentos de Readline...............................................................................................109
8.2.5.-Buscando Comandos en la Historia...............................................................................110
8.3.-El Fichero de Inicialización de Readline...............................................................................110
8.3.1.-La Sintaxis del Fichero de Inicialización de Readline....................................................111
8.3.2.-Construcciones de inicialización condicionales..............................................................117
8.3.3.-Ejemplo de Fichero de Inicialización.............................................................................118
8.4.-Comandos enlazables de Readline.........................................................................................120
8.4.1.-Comandos de Movimiento.............................................................................................120
8.4.2.-Comandos para Manipular la Historia...........................................................................121
8.4.3.-Comandos para Modificar el Texto................................................................................122
8.4.4.-Cortando y Pegando......................................................................................................123
8.4.5.-Especificando Argumentos Numéricos..........................................................................125
8.4.6.-Permitiendo que Readline introduzca caracteres por tí..................................................125
8.4.7.-Macros de Teclado........................................................................................................127
8.4.8.-Algunos comandos variados..........................................................................................127
8.5.-Modo vi de Readline.............................................................................................................130
8.6.-Completado Programable......................................................................................................130
8.7.-Comandos Internos para el Completado Programable...........................................................132
9.-Usando la Historia Interactivamente.............................................................................................137
9.1.-Características de Historia de Bash.......................................................................................137
9.2.-Comandos Internos para la Historia de Bash.........................................................................138
9.3.-Expansión de la Historia........................................................................................................139
9.3.1.-Designadores de Evento.................................................................................................140
9.3.2.-Designadores de Palabra................................................................................................140
9.3.3.-Modificadores................................................................................................................141
10.-Instalando Bash...........................................................................................................................143
10.1.-Instalación Básica................................................................................................................143
10.2.-Compiladores y Opciones....................................................................................................144
10.3.-Compilando para Múltiples Arquitecturas...........................................................................144
10.4.-Nombres de Instalación.......................................................................................................144
10.5.-Especificando el Tipo de Sistema........................................................................................145
10.6.-Compartiendo Valores por Defecto.....................................................................................145
10.7.-Controles de Operación.......................................................................................................145
10.8.-Características Opcionales...................................................................................................145
Apéndice A: Informando de errores.................................................................................................150
C.2.-Diferencias Principales con la Shell de Bourne.........................................................................151
B.1.-Diferencias de Implementación con la Shell SVR4.2...........................................................156
Apéndice C: GNU Free Documentation License.............................................................................157
C.0.-PREAMBLE........................................................................................................................157
C.1.-APPLICABILITY AND DEFINITIONS............................................................................157
C.2.-VERBATIM COPYING......................................................................................................158
C.3.-COPYING IN QUANTITY.................................................................................................159
C.4.-MODIFICATIONS..............................................................................................................159

Página vii
Índice de Contenido

C.5.-COMBINING DOCUMENTS.............................................................................................161
C.6.-COLLECTIONS OF DOCUMENTS..................................................................................161
C.7.-AGGREGATION WITH INDEPENDENT WORKS.........................................................161
C.8.-TRANSLATION..................................................................................................................162
D.0.1.-TERMINATION...............................................................................................................162
C.9.-FUTURE REVISIONS OF THIS LICENSE.......................................................................162
C.10.-RELICENSING.................................................................................................................163
C.11.-ADDENDUM: How to use this License for your documents.............................................163
Apéndice D: Licencia de Documentación Libre de GNU (Traducción)...........................................164
D.0.-PREÁMBULO.....................................................................................................................164
D.1.-APLICABILIDAD Y DEFINICIONES..............................................................................164
D.2.-COPIA LITERAL................................................................................................................166
D.3.-COPIADO EN CANTIDAD...............................................................................................166
D.4.-MODIFICACIONES...........................................................................................................167
D.5.-COMBINACIÓN DE DOCUMENTOS..............................................................................168
D.6.-COLECCIONES DE DOCUMENTOS...............................................................................169
D.7.-AGREGACIÓN CON TRABAJOS INDEPENDIENTES..................................................169
D.8.-TRADUCCIÓN...................................................................................................................169
D.9.-TERMINACIÓN.................................................................................................................169
D.9.1.-REVISIONES FUTURAS DE ESTA LICENCIA............................................................170
D.10.-RE-LICENCIAMIENTO...................................................................................................170
D.11.-ADDENDUM: Cómo usar esta Licencia en sus documentos.............................................171
D.12.-Notas:.................................................................................................................................171
D.13.-Referencias:........................................................................................................................171
Apéndice E: Índices.........................................................................................................................172
E.1.-Índice de Comandos Internos de la Shell.............................................................................172
E.2.-Índice de Palabras Reservadas de la Shell............................................................................173
E.3.-Índice de Parámetros y Variables.........................................................................................173
E.4.-Índice de Funciones.............................................................................................................175

Página viii
Capítulo 1: Introducción

1.- Introducción

1.1.- ¿Qué es Bash?


Bash es la shell, o interprete de comandos, para el sistema operativo GNU. El nombre es un acrónimo
para el 'Bourne-Again Shell', un juego de palabras de Stephen Bourne, el autor del predecesor directo
del actual shell Unix sh, que apareció en la Séptima Edición de la versión de Unix de los Bell Labs
Research (Laboratorios de Investigación de Bell).
Bash es ampliamente compatible con sh e incorpora características muy útiles de la Korn shell
ksh y la C shell csh. Busca ser una implementación conforme al IEEE POSIX Shell y Herramientas
parte de la especificación POSIX del IEEE (estándar IEEE 1003.1). Ofrece mejoras funcionales frente
a sh tanto para uso interactivo como de programación.
Aunque el sistema operativo GNU proporciona otras shells, incluida una versión de csh, la shell
Bash es la shell por defecto. Al igual que el resto del software GNU, Bash es bastante portable.
Actualmente corre en casi todas las versiones de Unix y en algunos sistemas operativos más – existen
implementaciones independientes para las plataformas MS-DOS, OS/2, y Windows.

1.2.- ¿Qué es una shell?


En esencia una shell es simplemente un procesador de macros que ejecuta comandos. El término
procesador de macros indica una funcionalidad donde se expanden texto y símbolos para crear
expresiones más largas.
Una shell de Unix es a la vez un interprete de comandos y un lenguaje de programación. Como
interprete de comandos, la shell proporciona una interfaz de usuario para el amplio juego de utilidades
GNU. Las capacidades de lenguaje de programación permiten combinar estas utilidades. Se pueden
crear archivos que contengan comandos, y que lleguen a ser comandos por si mismos. Estos nuevos
comandos tienen la misma categoría que los comandos del sistema situados en directorios como '/bin',
permitiendo a los usuarios o grupos establecer entornos personalizados para automatizar sus tareas
comunes.
Las shells se pueden utilizar de modo interactivo o no-interactivo. En modo interactivo aceptan
entradas desde el teclado. Cuando se ejecutan en modo no-interactivo, las shells ejecutan comandos
leídos desde un fichero.
Una shell permite la ejecución de comandos GNU tanto de forma síncrona como asíncrona. La
shell espera hasta que se completan los comandos síncronos antes de aceptar más entradas; los
comandos asíncronos continúan ejecutándose paralelamente a la shell mientras que esta lee y ejecuta
otros comandos. La redirección permite un control detallado de la entrada y la salida de estos
comandos. Más aún, la shell permite controlar el contenido de los entornos de los comandos.
Las shells también proporcionan un pequeño juego de comandos internos (builtins) implemen-
tando funcionalidades que mediante utilidades separadas serían imposibles de obtener o lo harían de
forma poco apropiada. Por ejemplo, no se puede implementar a cd, break, continue y exec fuera
de la shell porque estas manipulan directamente la propia shell. Los comandos internos history,
getopts, kill o pwd, a parte de otros, pueden ser implementados en utilidades separadas, pero son
más convenientes usados como comandos internos. Todos los comandos internos de la shell serán
descritos en las secciones siguientes.
Mientras que la ejecución de comandos es esencial, gran parte del poder (y complejidad) de la
shell se debe a los lenguajes de programación embebidos en ella. Como cualquier lenguaje de alto
nivel, la shell proporciona variables, construcciones de control del flujo, entrecomillado y funciones.
Las shells ofrecen características orientadas específicamente para el uso interactivo más que para

Página 9
Capítulo 1: Introducción

aumentar el lenguaje de programación. Estas características interactivas incluyen control de tareas,


edición de la linea de comandos, historia de comandos y alias. Cada una de estas características son
descritas en este manual.

Página 10
Capítulo 2: Definiciones

2.- Definiciones
Estas definiciones son usadas a lo largo de este manual
POSIX
Una familia de estándares libres basados en Unix. Bash se ve afectado principalmente por
la parte Shell y Utilidades del estándar POSIX 1003.1.
blanco (blank)
Un carácter espacio o tabulador
comando interno o builtin
Un comando que es implementado internamente por la shell, en vez de por un programa
ejecutable en algún lugar del sistema de ficheros.
operadores de control
Un token que realiza una función de control. Es una nueva linea o alguno de los siguientes:
‘||’, ‘&&’, ‘&’, ‘;’, ‘;;’, ‘|’, ‘|&’, ‘(’, o ‘)’.
estado de salida
El valor retornado por un comando a su llamador. Este valor está restringido a ocho bits,
así que el valor máximo es 255.
campo
Una unidad de texto que es el resultado de una de las expansiones de la shell. Tras la
expansión, cuando se ejecuta un comando, los campos resultantes se utilizan como
nombre de comando y argumentos
nombre de archivo
Una cadena de caracteres usada para identificar un archivo.
tarea
Un juego de procesos que componen una tubería, y los procesos que descienden de estos,
que están todos en el mismo grupo de procesos.
control de tareas
Un mecanismo por el cual los usuarios pueden parar (suspender) y reiniciar (reanudar)
selectivamente la ejecución de procesos.
metacaracter
Un carácter que, cuando se encuentra sin entrecomillar, separa palabras. Un metacaracter
es un blanco o uno de los siguientes caracteres: ‘|’, ‘&’, ‘;’, ‘(’, ‘)’, ‘<’, o ‘>’.
nombre
Una palabra consistente únicamente en letras, números y caracteres de subrayado, y que
comienza con una letra o un carácter de subrayado. Los nombres se usan como nombres
de variables de shell y de funciones. También se le llama identificador.
operador
Un operador de control o un operador de redirección. Vea en la sección 3.6 [Redirec-
ciones], una lista de operadores de redirección. Los operadores contienen al menos un
metacaracter sin entrecomillar.
grupo de procesos
Una colección o procesos relacionados cada uno de los cuales tiene el mismo identificador

Página 11
Capítulo 2: Definiciones

de grupo de procesos.
identificador (o ID) de grupo de procesos
Un identificador único que representa un grupo de procesos durante su tiempo de vida.
palabra reservada
Una palabra que tiene un significado especial para la shell. La mayoría de las palabras
reservadas introducen en la shell construcciones de control de flujo, como for y while.
estado de retorno
Un sinónimo para el estado de salida.
señal
Un mecanismo por el que cualquier proceso puede ser notificado por el kernel de un
evento ocurrido en el sistema.
comandos internos especiales
Un comando interno de la shell que ha sido clasificado como especial por el estándar
POSIX
token (o componente léxico)
Una secuencia de caracteres considerados una unidad única por el shell. Puede ser bien
una palabra o un operador.
palabra
Una secuencia de caracteres tratados como una unidad por el shell. Las palabras no
pueden incluir metacaracteres sin entrecomillar.

Página 12
Capitulo 3: Características Básicas del Shell

3.- Características Básicas de la Shell


Bash es un acrónimo para 'Bourne-Again Shell'. La shell Bourne es la shell Unix tradicional escrita
originalmente por Stephen Bourne. Todos los comandos internos de la shell Bourne están disponibles
en Bash. Las reglas para evaluación y entrecomillado están tomadas de la especificación POSIX para
la shell Unix 'estándar'.
Este capítulo resume brevemente los 'bloques de construcción' de la shell: comandos, estructuras
de control, funciones de shell, parámetros de shell, expansiones de shell, redirecciones, que son un
modo de dirigir la entrada y la salida desde y hacia un nombre de archivo, y la forma en la que la shell
ejecuta comandos.

3.1.- Sintaxis de la shell


Cuando la shell lee una entrada, procede a realizar una secuencia de operaciones. Si la entrada indica
el principio de un comentario, la shell ignora el signo de comentario ('#') y el resto de esa línea.
En caso contrario, hablando de forma aproximada, la shell lee su entrada y divide esta en palabras
y operadores, empleando las reglas de entrecomillado para seleccionar qué significado debe asignar a
las palabras y caracteres.
La shell luego analiza esos tokens en comandos y otras construcciones, elimina el significado
especial de ciertas palabras o caracteres, expande otras, redirecciona la entrada y la salida según sea
necesario, ejecuta los comandos especificados, espera por el estado de salida de los comandos, y pone
disponible ese estado de salida para favorecer su inspección o procesamiento.
3.1.1.- Modo de operación de la shell
Lo que sigue es una breve descripción del modo en que trabaja la shell cuando esta lee y ejecuta un
comando. Básicamente, la shell hace lo siguiente:
1. Lee su entrada desde un archivo (vea la Sección 3.8 [Guiones de shell]), desde una cadena
suministrada como un argumento a la opción de invocación ' -c' (vea la Sección 6.1
[Invocando a Bash], o desde la terminal del usuario.
2. Rompe la entrada en palabras y operadores, obedeciendo las reglas de entrecomillado des-
critas en la Sección 3.1.2 [Entrecomillado]. Estos tokens están separados por metacaracteres.
La expansión de Alias se realiza en este paso (vea Sección 6.6 [Alias]
3. Analiza sintácticamente los tokens en comandos simples y compuestos (vea Sección 3.2
[Comandos de Shell])
4. Realiza varias expansiones de shell (vea la Sección 3.5 [Expansiones de la Shell], rompe los
tokens expandidos en listas de nombres de ficheros (vea Sección 3.5.8 [Expansión de Nombres
de Fichero]) y comandos y argumentos.
5. Realiza cualquier redirección que sea necesaria (vea la Sección 3.6 [Redirecciones]) y elimina
los operadores de redirección y sus operandos de la lista de argumentos.
6. Ejecuta el comando (vea la Sección 3.7 [Ejecutando Comandos]).
7. Opcionalmente espera hasta que se complete la ejecución del comando y recolecta su estado
de salida (vea la Sección 3.7.5 [Estados de salida]).
3.1.2.- Entrecomillado
El entrecomillado se utiliza para eliminar el significado especial a ciertos caracteres o palabras para la
shell. El entrecomillado se puede utilizar para eliminar el tratamiento especial para los caracteres
especiales, o para prevenir a las palabras reservadas de ser reconocidas como tales, y para prevenir la
expansión de parámetros.

Página 13
Capitulo 3: Características Básicas del Shell

Cada uno de los metacaracteres de shell (vea el Capítulo 2 [Definiciones]) tiene un significado
especial para el shell y debe ser entrecomillado si se representa a sí mismo. Cuando se está usando las
habilidades de expansión de la historia de comandos (vea la Sección 9.3 [Interacciones con la
Historia]), el carácter de expansión de la historia, normalmente '!', debe ser entrecomillado para
prevenir la expansión de la historia. Vea la Sección 9.1 [Características de Historial de Bash], para
más detalles concernientes a la expansión de la historia.
Hay tres mecanismos de entrecomillado: El carácter de escape, las comillas simples y las comillas
dobles.
3.1.2.1.- Carácter de Escape
El carácter de escape consiste en una barra invertida sin entrecomillar '\'. Esta mantiene el valor literal
del carácter que le sigue, con la excepción de la nueva línea. Si aparece una pareja \nueva_linea esta es
tratada como una continuación de línea (esto es, esta es eliminada del flujo de entrada e ignorada
completamente).
3.1.2.2.- Comillas simples
Encerrar caracteres en comillas simples (''') mantiene el valor literal de cualquier carácter situado
entre las comillas. Una comilla simple no puede aparecer encerrada entre comillas simples, incluso
cuando es precedida por una barra invertida.
3.1.2.3.- Comillas Dobles
Encerrar caracteres entre comillas dobles ('”') mantiene el valor literal de todos los caracteres dentro
de las comillas, con la excepción de '$', ''', '\' y, cuando la expansión de la historia está habilitada,
'!'. Los caracteres '$' y ''' mantienen su significado especial dentro de comillas dobles (Vea la Sección
3.5 [Expansiones de Shell]). La barra invertida mantiene su significado especial sólo cuando es seguida
por uno de los siguientes caracteres: '$', ''', '\', o nueva linea. Dentro de comillas dobles, las
barras invertidas que son seguidas por uno de estos caracteres son eliminadas. Las barras invertidas
que preceden caracteres sin un significado especial permanecen como tales. Una comilla doble puede
ser entrecomillada dentro de dobles comillas precediéndola con una barra invertida. Si está habilitada
la expansión de la historia de comandos esta se realizará a menos que el signo '!' que aparece entre las
comillas dobles sea escapado usando una barra invertida. La barra invertida precediendo al '!' no es
eliminada.
Los parámetros especiales '*' y '@' tienen un significado especial cuando aparecen encerrados
entre comillas dobles (vea la sección 3.5.3 [Expansión de parámetros de la Shell]).
3.1.2.4.- Entrecomillado ANSI-C
Las palabras de la forma $'cadena' son tratadas de forma especial. La palabra se expande a cadena,
con los caracteres escapados por barras invertidas reemplazados como se especifica por el estándar
ANSI C. Las secuencias de escape con barra invertida, si están presentes, son decodificadas como
sigue:
\a alerta(campana)
\b retroceso (elimina el carácter anterior)
\e
\E un carácter de escape (no ANSI C)
\f carácter de alimentación de línea (form feed)

Página 14
Capitulo 3: Características Básicas del Shell

\n carácter de nueva línea


\r carácter de retorno de carro
\t tabulador horizontal
\v tabulador vertical
\\ carácter barra invertida
\' carácter comilla simple
\” carácter comilla doble
\nnn el carácter de 8 bits cuyo valor es el número octal nnn (de uno a tres dígitos).
\xHH el carácter de 8 bits cuyo valor es el número hexadecimal HH (uno o dos
dígitos hexadecimales)
\cx un carácter control-x
El resultado expandido se encuentra entrecomillado con comilla simple, como si el signo '$' no
estuviese presente.
3.1.2.5.- Traducciones Específicas de la Localización
Una cadena entrecomillada con comillas dobles precedida por un signo ('$') causará que la cadena sea
traducida de acuerdo a la localización actual. Si la localización actual es C o POSIX, el signo dólar es
ignorado. Si la cadena es traducida y reemplazada, el sustituto es entrecomillado con comillas dobles.
Algunos sistemas usan el catálogo de mensajes seleccionado por la variable de shell
LC_MESSAGES . Otros crean el nombre del catálogo de mensajes a partir del valor de la variable del
shell TEXTDOMAIN , posiblemente añadiendo un sufijo o '.mo'. Si usa la variable TEXTDOMAIN ,
puede necesitar ajustar la variable TEXTDOMAINDIR a la localización de los archivos del catálogo de
mensajes. Otros incluso usan ambas variables de la forma:
TEXTDOMAINDIR/LC_MESSAGES/TEXTDOMAIN.mo.
3.1.3.- Comentarios
En una shell no-interactiva, o en una shell interactiva en la que la opción interactive_comments
para el comando interno shopt está activada (vea la sección 4.3.2 [ El Comando Interno Shopt]), una
palabra comenzando con '#' provoca que la palabra y todos los caracteres que le siguen en esa línea
sean ignorados. Una shell interactiva sin la opción interactive_comments activada no permite
comentarios. La opción interactive_coments está establecida por defecto en las shells
interactivas. Vea la sección 6.3 [Shells Interactiva], para una descripción de qué hace una shell
interactiva.

3.2.- Comandos de Shell


Un comando de shell simple como echo a b c consiste en el propio comando seguido por argu-
mentos separados por espacios.
Comandos de shell más complejos están compuestos de comandos simples situados juntos de
varias formas; en una tubería en la cual la salida de un comando se convierte en la entrada del
segundo, en una construcción tipo bucle o condicional, o en algunas otras agrupaciones.
3.2.1.- Comandos simples
Un comando simple es el tipo de comando que se encuentra con más frecuencia. Este es sólo una

Página 15
Capitulo 3: Características Básicas del Shell

secuencia de palabras separadas por blancos, terminada por uno de los operadores de control de la
shell (vea el Capítulo 2 [Definiciones]). La primera palabra generalmente especifica un comando para
ser ejecutado, con el resto de las palabras como argumentos del comando.
El estado de retorno (vea la Sección 3.7.5 [Estado de salida]) de un comando simple es su estado
de salida como viene especificado por la función POSIX 1003.1 waitpid, o 128+n si el comando fue
terminado por la señal n.
3.2.2.- Tuberías
Una tubería es una secuencia de comandos simples separados por uno de los operadores de control '|'
o '|&'.
El formato de uso de una tubería es:
[time [-p]] [!] comando1 [ [| o |&] comando2 … ]
La salida de cada comando en la tubería es conectado a través del cauce a la entrada del siguiente
comando. Esto es, cada comando lee la salida del comando previo. Esta conexión se establece antes de
realizar cualquier redirección especificada por el comando.
Si se usa '|&' la salida de error estándar del comando1 es conectada a la entrada estándar del
comando2 a través del cauce; es una forma corta para 2>&1. Esta redirección implícita de la salida de
error estándar se realiza después de cualquier redirección especificada en el comando.
La palabra reservada time produce que se impriman estadísticas de tiempo para la tubería una
vez que esta finaliza. Las estadísticas actualmente consisten en el tiempo transcurrido y tiempo de
usuario y de sistema consumidos por la ejecución del comando. La opción ' -p' cambia el formato de
salida por el especificado por POSIX. La variable TIMEFORMAT puede ser ajustada a una cadena de
formato que especifique como se debe mostrar la información de los tiempos. Vea la Sección 5.2
[Variables de Bash] para obtener una descripción de los formatos disponibles. El uso de time como
palabra reservada permite el cronometrado de los comandos internos de la shell, las funciones de shell
y las tuberías. Un comando externo time no podría hacer esto fácilmente.
Si la tubería no se ejecuta de forma asíncrona (vea la Sección 3.2.3 [Listas]) la shell espera hasta
que se completen todos los comandos de la tubería.
Cada comando en una tubería se ejecuta en su propia subshell (vea la Sección 3.7.3 [Entorno de
Ejecución de Comandos]). El estado de salida de una tubería es el estado de salida de el último
comando en la tubería, a menos que la opción pipefail esté activada (vea la Sección 4.3.1 [El
Comando Interno Set]) Si pipefail está activado, el estado de retorno de la tubería es el valor del
último comando (el más a la derecha) en salir con un estado distinto de cero, o cero si todos los
comandos salen satisfactoriamente. Si la palabra reservada '!' precede a la tubería, el estado de salida
es la negación lógica del estado de salida como se describió más arriba. El shell espera hasta que todos
los comandos en la tubería terminen antes de retornar un valor.
3.2.3.- Listas de Comandos
Una lista es una secuencia de una o más tuberías separadas por uno de los siguientes operadores: ';',
'&', '&&', o '||', y opcionalmente terminada por uno de los siguientes: ';', '&', o una nueva línea.
De estos operadores de lista '&&' y '||' tienen igual precedencia, seguidos por ';' y '&', que tienen
igual precedencia.
Una secuencia de una o más nuevas líneas pueden aparecer en una lista para delimitar
comandos, esto equivale a un punto y coma.
Si un comando termina con el operador de control '&' la shell ejecuta el comando de forma
asíncrona en una subshell. Esto es conocido como ejecutar el comando en segundo plano. La shell no

Página 16
Capitulo 3: Características Básicas del Shell

espera a que el comando finalice, y el estado de retorno es 0 (verdadero). Cuando el control de tareas
no está activado (vea el Capítulo 7 [Control de Tareas]), la entrada estándar para los comandos
asíncronos, en ausencia de alguna redirección explícita, es redirigida desde /dev/null.
Los comandos separados por un ';' se ejecutan secuencialmente; la shell espera para que cada
comando finalice turnándose con el siguiente. El estado de retorno es el estado de retorno del último
comando ejecutado.
Las listas Y (AND) y O (OR) son secuencias de una o más tuberías separadas por los operadores
de control '&&' y '||' respectivamente. Las listas AND y OR son ejecutadas con asociatividad a la
izquierda
Una lista AND tiene la forma
comando1 && comando2
comando2 se ejecuta sí y sólo sí el comando1 retorna un estado de salida de cero.
Una lista OR tiene la forma
comando1 || comando2
comando2 se ejecuta sí y sólo sí, el comando1 retorna un valor de salida distinto de cero.
El estado de retorno de las listas AND y OR es el estado de salida del último comando ejecutado
en la lista.
3.2.4.- Comandos Compuestos
Los comandos compuestos son las construcciones de programación de la shell. Cada construcción
comienza con una palabra reservada o un operador de control y termina con otra correspondiente
palabra reservada u operador. Cualquier redirección (vea la Sección 3.6 [Redirecciones]) asociada con
un comando compuesto se aplica a todos los comandos dentro de ese comando compuesto, a menos
que sea sobreescrito explícitamente.
Bash proporciona construcciones cíclicas, comandos condicionales y mecanismos para agrupar
comandos y ejecutarlos como una unidad.
3.2.4.1.- Construcciones Cíclicas
Bash soporta las siguientes construcciones cíclicas (en forma de bucle).
Note que en cualquier lugar en el que aparezca un ';' en la descripción de la sintaxis de un
comando este puede ser reemplazado por una o más nuevas líneas.
until
La sintaxis del comando until es:
until comandos-test; do comandos-consiguientes; done
Ejecuta los comandos-consiguientes mientras que los comandos-test tengan un estado de
salida distinto de cero. El estado de retorno es el estado de salida del último comando
ejecutado en comandos-consiguientes, o cero si no se ejecutó ninguno.
while
La sintaxis del comando while es:
while comandos-test; do comandos-consiguientes; done
Ejecuta los comandos-consiguientes mientas que los comandos-test tengan un estado de
salida igual a cero. El estado de retorno es el estado de salida del último comando
ejecutado en comandos-consiguientes, o cero si no se ejecutó ninguno.
for
La sintaxis del comando for es:

Página 17
Capitulo 3: Características Básicas del Shell

for nombre [ [in [palabras …] ] ; ] do comandos; done


Expande las palabras y ejecuta los comandos uno por cada miembro en la lista resultante,
con nombre asignado al miembro actual. Si 'in palabras' no está presente, el comando
for ejecuta los comandos uno por cada parámetro posicional que se le pase, como si se
hubiera especificado 'in $@' (vea la Sección 3.4.2 [Parámetros Especiales]). El estado de
retorno es el estado de salida del último comando que ejecuta. Si no hay miembros en la
expansión de palabras, no se ejecuta ningún comando y el estado de retorno es cero.
Bash también soporta una forma alternativa para el comando for:
for (( expr1 ; expr2 ; expr3 )) ; do comandos ; done
Primero se evalúa la expresión aritmética expr1 de acuerdo con las reglas descritas más
abajo (vea la Sección 6.5 [Aritmética de la Shell]). A continuación se evalúa
repetidamente la expresión aritmética expr2 hasta que su valor sea cero. Cada vez que
expr2 se evalúa con un valor distinto de cero, se ejecutan los comandos y se evalúa la
expresión expr3 .Si se omite alguna expresión se toma como si esta se evaluara a 1. El
valor devuelto es el estado de salida del último comando que se ejecuta en la lista, o false
si alguna de las expresiones es inválida.
Los comandos internos break y continue (vea la Sección 4.1 [Comandos internos de la Shell
Bourne]) pueden ser usados para controlar la ejecución del bucle.
3.2.4.2.- Construcciones Condicionales
if
La sintáxis del comando if es:
if comandos-test; then
comandos-consiguientes
[elif mas-comandos-test; then
más-siguientes;]
[else alternativas-consiguientes; ]
fi
Se ejecuta la lista de comandos-test y si esta retorna un estado igual a cero se ejecuta la
lista de comandos-consiguientes. Si los comandos-test retornan un estado distinto de cero,
se ejecuta cada lista elif en turnos, y si su estado de salida es igual a cero, se ejecutan los
correspondientes mas-consiguientes y el comando finaliza. Si la construcción 'else
alternativas-consiguientes' está presente y el comando final en la última clausula if o elif
tiene un estado de salida distinto de cero, entonces se ejecutan las alternativas-
consiguientes. El estado de retorno es el estado de salida del último comando ejecutado o
cero si ninguna condición fue evaluada como true.
case
La sintaxis del comando case es:
case palabra in [ [(] patrón [| patrón] ….) lista-
comandos ;;]... esac
case ejecutará selectivamente la lista-comandos correspondiente al primer patrón que se
ajusta con palabra. Si la opción de shell nocasematch (vea la descripción de shopt en
la Sección 4.3.2 [El Comando Interno Shopt]) está activada, el ajuste se realiza sin
diferenciar entre mayúsculas y minúsculas para los caracteres alfabéticos. El '|' se usa
para separar patrones múltiples, y el operador ')' termina una lista de patrones. Una lista
de patrones y su lista de comandos asociada se conoce como una clausula.
Cada clausula debe terminar con ';;', ';&' o ';;&'. La palabra sufre expansión de tildes,
expansión de parámetros, sustitución de comandos, expansión aritmética y eliminación de

Página 18
Capitulo 3: Características Básicas del Shell

entrecomillado antes de intentar el ajuste. Cada patrón sufre expansión del tildes,
expansión de parámetros, sustitución de comandos y expansión aritmética.
Puede haber un número arbitrario de clausulas case, cada una terminada con un ';;',
';&' o ';;&'. El primer patrón que ajusta determina la lista-comandos que será ejecutada.
Aquí hay un ejemplo usando case en un guión que se puede utilizar para describir una
interesante característica de un animal:
echo -n "Introduzca el nombre de un animal: "
read ANIMAL
echo -n "El $ANIMAL tiene "
case $ANIMAL in
caballo | perro | gato) echo -n "cuatro";;
hombre | canguro ) echo -n "dos";;
*) echo -n "un número desconocido de";;
esac
echo " patas."
Si se utiliza el operador ';;' no se intenta ningún ajuste adicional tras el primer patrón
encontrado. Usar ';&' en vez de ';;' produce que la ejecución continúe con la
lista-comandos asociada con la siguiente clausula, si hay alguna. Usar ';;&' en vez de ';;'
produce que la shell pruebe a ajustar los patrones en la siguiente clausula, si hay alguna, y
ejecuta cualquier lista-comandos asociada a los ajustes conseguidos.
El estado de retorno es cero si no se ajusta a ningún patrón. De otro modo, el estado de
retorno es la salida del estado de la lista-comandos ejecutada.
select
La construcción select permite generar menús fácilmente. Esta tiene casi la misma
sintaxis que el comando for:
select nombre [ in palabras …]; do comandos; done
Se expande la lista de palabras que siguen a in, generando una lista de items. El juego de
palabras expandidas se imprime en el flujo de la salida de error estándar, cada una
precedida por un número. Si se omite la construcción ' in palabras' se imprimen los
parámetros posicionales, como si se hubiese especificado 'in “$@”'. A continuación se
muestra el prompt PS3 y se lee una línea desde la entrada estándar. Si la linea consiste en
un número correspondiente a una de las palabras mostradas, entonces el valor de nombre
es ajustado a esa palabra. Si la linea está vacía, las palabras y el prompt se muestran de
nuevo. Si se lee EOF (fin de fichero), el comando select finaliza. Cualquier otro valor
leído produce que nombre se establezca a null. La linea leída es salvada en la variable
REPLY .
Los comandos son ejecutados después de cada selección hasta que se ejecuta un comando
break, punto en el que el comando select finaliza.
A continuación tenemos un ejemplo que permite al usuario elegir un nombre de fichero
del directorio actual y mostrar el nombre y el índice del archivo seleccionado:
select fname in *;
do
echo usted seleccionó $fname \($REPLY\)
break;
done
(( … ))
(( expresión ))
La expresión aritmética se evalúa de acuerdo a las reglas descritas más abajo (vea la
sección 6.5 [Aritmética del Shell]). Si el valor de la expresión es distinta de cero, el estado

Página 19
Capitulo 3: Características Básicas del Shell

de retorno es 0; de otro modo el estado de retorno es 1. Esto es exactamente equivalente a


let “expresión”
Vea la Sección 4.2 [Comandos Internos de Bash] para una descripción completa del
comando interno let.
[[ … ]]
[[ expresión ]]
Devuelve un estado de 0 ó 1 dependiendo de la evaluación de la expresión condicional
expresión. Las expresiones se componen de expresiones fundamentales descritas más
abajo en la Sección 6.4 [Expresiones Condicionales de Bash]. La división de palabras y la
expansión de nombres de archivo no se realiza en las palabras encerradas entre '[[' y ']]'; se
realizan la expansión de tildes, la expansión de parámetros y variables, la expansión
aritmética, la sustitución de comandos, la sustitución de procesos y la eliminación del
entrecomillado. Los operadores condicionales como '-f' deben ser desentrecomillados
para que sean reconocidos como primarios. Cuando se usan con '[[', los operadores '<' y
'>' ordenan lexicográficamente usando la localización actual.
Cuando se usan los operadores '==' y '!=' la cadena a la derecha del operador se
considera como un patrón y ajusta conforme a las reglas descritas más abajo, en la Sección
3.5.8.1 [Ajuste a Patrones]. Si la opción de shell nocasematch (vea la descripción de
shopt en la Sección 4.3.2 [El Comando Interno Shopt]) está activada, el ajuste se realiza
sin diferenciar entre minúsculas y mayúsculas en el caso de caracteres alfabéticos. El valor
devuelto es 0 si las cadenas ajustan ('==') o no ajustan ('!=') al patrón, y 1 de otro modo.
Cualquier parte del patrón puede ser entrecomillada para forzar a que sea ajustada como
una cadena.
Hay un operador binario adicional '=~ ', con la misma precedencia que '==' y '!=' .
Cuando se utiliza este la cadena a la derecha del operador es considerada como una
expresión regular extendida y ajustada en consecuencia (como en regex3). El valor
devuelto es 0 si la cadena ajusta al patrón, y 1 en otro caso. Si la expresión regular es
incorrecta sintácticamente el valor devuelto de la expresión condicional es 2. Si la opción
de la shell nocasematch (vea la descripción de shopt en la Sección 4.3.2 [El Comando
Interno Shopt]) está activada, el ajuste se realiza sin diferenciar entre mayúsculas y
minúsculas para los caracteres alfabéticos. Cualquier parte del patrón puede ser
entrecomillado para forzar a que este ajuste como una cadena. Las subcadenas ajustadas
por subexpresiones parentizadas dentro de la expresión regular son guardadas en la
variable de tipo array BASH_REMATCH . Los elementos de BASH_REMATCH con
índice 0 será la porción de la cadena que ajusta con la expresión regular completa. El
elemento de BASH_REMATCH con el índice n es la porción de la cadena que encaja con
la n-ésima subexpresión parentizada.
Las expresiones se pueden combinar usando los siguientes operadores, listados en orden
de precedencia decreciente:
( expresión )
Devuelve el valor de expresión. Este se puede utilizar para sobrescribir la
precedencia normal de los operadores.
! expresión
Devuelve true si la expresión es false

Página 20
Capitulo 3: Características Básicas del Shell

expresión1 && expresión2


Devuelve true si tanto expresión1 como expresión2 son true.
expresión1 || expresión2
Devuelve true si expresión1 o expresión2 son true.
Los operadores && y || no evalúan expresión2 si el valor de expresión1 es suficiente para
determinar el valor devuelto por la expresión condicional completa.
3.2.4.3.- Agrupando Comandos
Bash proporciona dos maneras de agrupar una lista de comandos para ser ejecutada como una unidad.
Cuando los comandos se agrupan, las redirecciones pueden ser aplicadas a la lista de comandos
completa. Por ejemplo, la salida de todos los comandos en la lista puede ser redirigida a un único
flujo.
()
( lista )
Encerrar una lista de comandos entre paréntesis produce que se cree un entorno de
subshell (vea la Sección 3.7.3 [Entorno de Ejecución de Comandos]), y cada uno de los
comandos en lista será ejecutado en ese subshell. Puesto que la lista se ejecuta en una
subshell, el efecto de la asignación de variables no permanece tras la finalización de la
subshell.
{}
{ lista; }
Encerrar una lista de comandos entre llaves produce que lista sea ejecutada en el contexto
de shell actual. No se crea ningún subshell. El punto y coma (o nueva línea) que sigue a
lista es obligatorio.
A parte de la creación de la subshell hay una sutil diferencia entre el uso de estas dos construc -
ciones debido a razones históricas. Las llaves son palabras reservadas, así que deben ser separadas de
la lista de comandos por blancos u otros metacaracteres de shell. Los paréntesis son operadores, y son
reconocidos como tokens separados por la shell incluso si no están separados de la lista de comandos
por espacios en blanco.
El estado de salida de ambas construcciones es el estado de salida de la lista de comandos.
3.2.5.- Coprocesos
Un coproceso es un comando de shell precedido por la palabra reservada coproc. Un coproceso se
ejecuta asíncronamente en un subshell, como si el comando hubiese terminado con el operador de
control '&', con un cauce de dos sentidos establecido entre el shell en ejecución y el coproceso.
El formato de ejecución de un coproceso es:
coproc [NOMBRE] comando [redirecciones]
Esto crea un coproceso llamado NOMBRE. Si no se proporciona NOMBRE, el nombre por defecto es
COPROC. No se debe proporcionar NOMBRE si el comando es un comando simple (vea la Sección
3.2.1 [Comandos Simples]); de otro modo, se interpretará este como la primera palabra del comando
simple.
Cuando se ejecuta el coproceso, la shell crea una variable de tipo array (vea la Sección 6.7
[Arrays]), llamada NOMBRE en el contexto de la shell en ejecución. La salida estándar del comando
se conecta a través de un cauce a un descriptor de fichero en la shell en ejecución, y este descriptor de
fichero se asigna a NOMBRE[0] . La entrada estándar del comando se conecta a través de un cauce a
un descriptor de fichero en la shell en ejecución, y ese descriptor de fichero se asigna a NOMBRE[1] .

Página 21
Capitulo 3: Características Básicas del Shell

Este cauce es establecido antes de cualquier redirección especificada por el comando (vea la Sección
3.6 [Redirecciones]). El descriptor de fichero se puede utilizar como argumento para los comandos de
shell y las redirecciones usando expansiones de palabra estándar.
El identificador de proceso de la shell engendrada para ejecutar el coproceso está disponible en el
valor de la variable NAME_PID . Se puede utilizar el comando interno wait para esperar hasta que el
coproceso termine.
El valor devuelto por un coproceso es el estado de salida del comando.

3.3.- Funciones de Shell


Las funciones de shell son una manera de agrupar comandos para ejecutarlos más tarde usando un
único nombre para todo el grupo. Estas se ejecutan justo igual que un comando “regular”. Cuando se
utiliza el nombre de una función de shell como un simple nombre de comando, se ejecuta la lista de
comandos asociados con ese nombre de función. Las funciones de shell son ejecutadas en el contexto
actual de la shell; no se crea ningún nuevo proceso para interpretarlas.
Las funciones se declaran usando la siguiente sintaxis:
[ function ] nombre () comando-compuesto [ redirecciones ]
Esto define una función de shell llamada nombre. La palabra reservada function es opcional. Si
se suministra la palabra reservada function, los paréntesis son opcionales. El cuerpo de la función es
el comando compuesto comando-compuesto (vea la Sección 3.2.4 [Comandos Compuestos]). Este
comando es normalmente una lista encerrada entre { y }, pero puede ser cualquier comando
compuesto listado más arriba. El comando-compuesto se ejecuta en cualquier lugar donde se
especifique nombre como nombre de un comando. Cualquier redirección (vea la Sección 3.6
[Redirecciones]) asociada con la función de shell se lleva a cabo cuando se ejecuta la función.
Una definición de función se puede eliminar usando la opción ' -f' con el comando interno unset
(vea la Sección 4.1 [Comandos Internos de la Shell Bourne]).
El estado de salida de una definición de función es cero a menos que ocurra un error de sintaxis o
que previamente exista una función de sólo lectura con el mismo nombre.
Cuando se ejecuta la función, el estado de salida de esta es el estado de salida del último comando
ejecutado en el cuerpo de su definición.
Advierta que por razones históricas, en su uso más común las llaves que rodean el cuerpo de la
función deben estar separadas del cuerpo mediante caracteres blancos o nuevas lineas. Este es debido
a que las llaves son palabras reservadas y son sólo reconocidas como tales cuando están separadas de
la lista de comandos por espacios en blanco o cualquier otro metacaracter de shell. También, cuando
usamos llaves, la lista de comandos debe terminar en un punto y coma, un '&', o una nueva línea.
Cuando se ejecuta una función, los argumentos pasados a la función se convierten en parámetros
posicionales durante su ejecución (vea la Sección 3.4.1 [Parámetros Posicionales]). El parámetro
especial '#' que se expande al número de parámetros posicionales, es actualizado para reflejar el
cambio. El parámetro especial 0 permanece sin cambios. El primer elemento de la variable
FUNCNAME se asigna al nombre de la función mientras que la función está en ejecución.
Todos los demás aspectos del entorno de ejecución de la shell son los mismos para la función y su
llamador con estas excepciones: las trampas DEBUG y RETURN no son heredades a menos que se le
haya dado a la función el atributo trace usando el comando interno declare o se haya activado la
opción '-o functrace' con el comando interno set (en cuyo caso todas las funciones heredan las
trampas DEBUG y RETURN), y la trampa ERR no es heredada a menos que la opción de shell ' -o
errtrace' haya sido activada. Vea la Sección 4.1 [Comandos Internos de la Shell Bourne], para una
descripción del comando interno trap.

Página 22
Capitulo 3: Características Básicas del Shell

Si se ejecuta el comando interno return en una función, la función termina y la ejecución


continua con el siguiente comando después de la llamada a la función. Cuando una función termina,
los valores de los parámetros posicionales y el parámetro especial ' #' son restaurados a los valores que
tenían antes de la ejecución de la función. Si se proporciona a return un argumento numérico, este es
el estado devuelto por la función; de otro modo el estado devuelto por la función es el estado de salida
del último comando ejecutado antes del return;
Se pueden declarar variables locales a la función utilizando el comando interno local. Estas
variables son visibles sólo para la función y los comandos que esta invoca.
Los nombres de función y sus definiciones pueden ser listadas con la opción ' -f' de los comandos
internos declare o typeset (vea la Sección 4.2 [Comandos Internos de Bash]). La opción ' -F' de los
comandos internos declare o typeset listará únicamente los nombres de las funciones (y
opcionalmente el archivo fuente y el número de línea, si la opción de shell extdebug está activada).
Las funciones pueden ser exportadas con la opción ' -f' del comando interno export (vea la Sección
4.1 [Comandos Internos de la Shell]), de forma que los subshells las tengan definidas
automáticamente. Advierta que tener funciones y variables de shell con el mismo nombre puede llevar
a tener múltiples entradas con el mismo nombre en el entorno pasado a las shells hijas. Debe tenerse
especial cuidado en aquellos casos donde esto puede causar problemas.
Las funciones pueden ser recursivas. No existe límite en el número de llamadas recursivas
posibles.

3.4.- Parámetros de Shell


Un parámetro es una entidad que almacena valores. Este puede ser un nombre, un número o uno de
los caracteres especiales listados más abajo. Una variable es un parámetro identificado por un nombre.
Una variable tiene un valor y cero o más atributos. Los atributos son asignados usando el comando
interno declare. (vea la descripción del comando interno declare en la Sección 4.2 [Comandos
Internos de Bash]).
Un parámetro está establecido si le ha sido asignado un valor. La cadena nula es un valor válido.
Una vez que una variable está establecida puede ser eliminada únicamente usando el comando interno
unset.
Una variable puede ser asignada mediante una sentencia de la forma:
nombre=[valor]
Si no se da el valor, se asigna a la variable la cadena nula. Todos los valores sufren expansión de
tilde, expansión de parámetros y variables, sustitución de comandos, expansión aritmética y
eliminación de entrecomillado (detallado más abajo). Si la variable tiene establecido su atributo
integer, entonces su valor se evalúa como una expresión aritmética incluso si no se ha usado la
expansión $(( … )) (vea la Sección 3.5.5 [Expansión Aritmética]. La división de palabras no se
realiza, con la excepción de “$@” como se explica más abajo. No se realiza la expansión de nombres
de fichero. Las sentencias de asignación pueden aparecer también como argumentos en los comandos
internos alias, declare, typeset, export, readonly y local.
En el contexto donde una sentencia de asignación está asignando un valor a una variable de la
shell o un índice de un array (vea la Sección 6.7 [Arrays]), el operador '+=' se puede utilizar para
agregar o añadir el valor dado al valor previo de la variable. Cuando se aplica el operador '+=' a una
variable para la cual se ha establecido el atributo integer (entero), el valor se evalúa como una
expresión aritmética y se añade al valor actual de la variable, la cual también se evalúa. Cuando se
aplica el operador '+=' a una variable de tipo array usando una asignación compuesta (vea la Sección
6.7 [Arrays]), el valor de la variable no es eliminado (como sí lo es cuando se usa '='), y se agregan

Página 23
Capitulo 3: Características Básicas del Shell

nuevos valores al array comenzando por el inmediatamente mayor al máximo índice del array (para
arrays indexados), o añadido como pares llave-valor adicionales en un array asociativo. Cuando se
aplica sobre una variable de tipo cadena, el valor se expande y se agrega al valor de la variable.
3.4.1.- Parámetros posicionales
Un parámetro posicional es un parámetro denotado por uno o más dígitos, distintos al dígito 0. Los
parámetros posicionales se asignan desde los argumentos de la shell cuando esta es invocada, y pueden
ser reasignados usando el comando interno set. El parámetro posicional N puede ser referenciado
como ${N} , o como $N cuando N consiste en un único dígito. Los parámetros posicionales no pueden
ser asignados con sentencias de asignación. Se utilizan los comandos internos set y shift para
establecer y eliminar estos parámetros (vea el Capítulo 4 [Comandos Internos de la Shell]). Los
parámetros posicionales son reemplazados temporalmente cuando se ejecuta una función de shell (vea
la Sección 3.3 [Funciones de la Shell]).
Cuando se expande un parámetro posicional consistente en más de un único dígito, este debe ser
encerrado entre llaves.
3.4.2.- Parámetros Especiales
La shell trata a varios parámetros de forma especial. Estos parámetros únicamente pueden ser refe-
renciados; la asignación a ellos no está permitida.
* Se expande a los parámetros posicionales, comenzando por el uno. Cuando la expansión
ocurre entre dobles comillas se expande a una única palabra con el valor de cada uno de
los parámetros separados por el primer carácter de la variable especial IFS. Esto es, “$* ”
es equivalente a “$1c$2c... ”, donde c es el primer carácter del valor de la variable IFS . Si
la variable IFS no está establecida, los parámetros se separan con espacios. Si IFS es
nulo, los parámetros se unen sin utilizar ningún tipo de separador.
@ Se expande a los parámetros posicionales, empezando por el uno. Cuando la expansión
ocurre entre comillas dobles cada parámetro es expandido a una palabra separada del
resto. Esto es, “$@” es equivalente a “$1 ” “$2 ” ….Si la expansión con comillas dobles
ocurre dentro de una palabra, la expansión del primer parámetro se une con la parte
inicial de la palabra original, y la expansión del último parámetro se une con la última
parte de la palabra original. Cuando no hay parámetros posicionales “ $@” y $@ se
expanden a nada (es decir, son eliminados).
# Se expande al número de parámetros posicionales en el sistema decimal
? Se expande al estado de salida de la tubería ejecutada en primer plano más reciente-
mente.
- (Un guión). Se expande a las banderas de opción actuales como se especificó en la
invocación, mediante el comando interno set, o aquellas especificadas por la propia shell
(como la opción '-i').
$ Se expande al id de proceso de la shell. En una subshell dada por ( ), esta variable se
expande a la id del proceso de la shell padre, no de la subshell.
! Se expande al id del proceso del comando ejecutado en segundo plano más reciente-
mente (de forma asíncrona).
0 Se expande al nombre de la shell o del guión de shell. Este se establece en el inicio de la

Página 24
Capitulo 3: Características Básicas del Shell

shell. Si Bash es invocado con un archivo de comandos (vea la Sección 3.8 [Guiones de
Shell]), $0 se asigna al nombre de ese archivo. Si Bash se inicia con la opción ' -c' (vea la
Sección 6.1 [Invocando a Bash]), entonces $0 se asigna al primer argumento tras la
cadena a ser ejecutada, si hay alguna presente. De otro modo, se asigna al nombre de
archivo usado para invocar Bash, dado por el argumento cero.
_ (Un carácter de subrayado). Al inicio de la shell, contiene la ruta absoluta usada para
invocar la shell o el guión de shell que está siendo ejecutado tal cómo se pasó en el
entorno o en la lista de argumentos. Posteriormente, expande al último argumento del
comando previo, tras la expansión. También contiene la ruta completa usada para invocar
cada comando ejecutado y situado en el entorno que se ha exportado para ese comando.
Cuando comprobamos el correo, este parámetro mantiene el nombre del archivo de
correo.

3.5.- Expansiones de la shell


La expansión se realiza en la línea de comandos después de que esta haya sido dividida en tokens. Se
realizan siete tipos de expansiones:
• expansión de llaves
• expansión de tildes
• expansión de parámetros y variables
• sustitución de comandos
• expansión aritmética
• división de palabras
• expansión de nombres de archivo.
El orden de las expansiones es: expansión de llaves, expansión de tildes, expansión de parámetros
y variables, expansión aritmética y sustitución de comandos (realizada de izquierda a derecha),
división de palabras y expansión de nombres de archivo.
En sistemas que lo soporten hay disponible un tipo adicional de expansión: la sustitución de
procesos. Esta se realiza al mismo tiempo que la expansión de parámetros y variables, la expansión
aritmética y la sustitución de comandos.
Sólo la expansión de llaves, la división de palabras y la expansión de nombres de fichero pueden
cambiar el número de palabras de la expansión; otras expansiones expanden de palabra a palabra. La
única excepción a esto son las expansiones de “$@” (vea la Sección 3.4.2 [Parámetros Especiales]) y
“${nombre[@]} ” (vea la Sección 6.7 [Array])
Después de realizar todas las expansiones se realiza la eliminación del entrecomillado (vea la
Sección 3.5.9 [Eliminación del Entrecomillado]).
3.5.1.- Expansión de Llaves
La expansión de llaves es un mecanismo por el cual se pueden generar cadenas arbitrarias. Este
mecanismo es similar a la expansión de nombres de fichero (vea la Sección 3.5.8 [Expansión de
Nombres de Fichero]), pero los nombres de archivo generados no existen. Los patrones para la
expansión de llaves tienen la forma de un preámbulo opcional, seguido por o bien una serie de cadenas
separadas por comas o bien una expresión secuencia encerrada entre llaves, seguido por un epílogo
opcional. El preámbulo se usa como prefijo para cada una de las cadenas contenidas entre las llaves, y
el epílogo se añade al final de cada cadena resultante, expandiendo de derecha a izquierda.
Las expansiones de llaves pueden ser anidadas. No se ordena el resultado de cada cadena

Página 25
Capitulo 3: Características Básicas del Shell

expandida; se mantiene el orden de izquierda a derecha. Por ejemplo:


bash$ echo a{d,c,b}e
ade ace abe
Una expresión secuencia tiene la forma {x..y[..incr]}, donde x e y son enteros o caracteres
únicos, e incr, es un incremento opcional, dado como un valor entero. Cuando se suministran enteros,
la expresión expande a cada número entre x e y, ambos inclusive. Los enteros suministrados pueden ir
precedidos de '0' para forzar a que cada término tenga la misma longitud. Cuando x o y comienzan
con un cero, la shell intenta forzar a todos los términos generados a contener el mismo número de
dígitos, añadiendo ceros a la izquierda cuando sea necesario. Cuando se suministran caracteres, la
expresión se expande lexicográficamente a cada carácter entre x e y, ambos inclusive. Advierta que
tanto x como y deben ser del mismo tipo. Cuando se utiliza el incremento este se usa como la
diferencia entre cada uno de los términos. El incremento por defecto es 1 o -1 según corresponda.
La expansión de llaves se realiza antes de cualquier otra expansión, y cualquier carácter especial
para otras expansiones se mantiene en el resultado. Esto es estrictamente textual. Bash no aplica
ninguna interpretación sintáctica al contexto de la expansión o al texto entre los corchetes. Para evitar
conflictos con la expansión de parámetros, la cadena '${' no se considera apta para la expansión de
llaves.
Una expansión de llaves formada correctamente debe contener las llaves de apertura y de cierre
sin entrecomillar, y al menos una coma o una expresión secuencia sin entrecomillar en ambos casos.
Cualquier expansión de llaves formada incorrectamente permanecerá sin cambios.
Un '{' o una ',' pueden ser entrecomilladas con una barra invertida para prevenir que sea consi-
derada como parte de una expresión de llaves.
Esta construcción es frecuentemente usada como una abreviatura cuando el prefijo común de la
cadena a generar es mayor que en el ejemplo siguiente:
mkdir /usr/local/src/bash/{old,new,dist,bugs}
o
chown root /usr/{ucb/{ex,edit},lib/{ex?.?*,how_ex}}

3.5.2.- Expansión de Tildes


Si una palabra comienza con un carácter tilde ('~ ') sin entrecomillar todos los caracteres anteriores a
la primera barra no entrecomillada (o todos los caracteres si no hay barras sin entrecomillar) son
considerados como un prefijo-tilde. Si ninguno de los caracteres en el prefijo-tilde están entrecomi-
llados, los caracteres en el prefijo-tilde que siguen a la tilde son tratados como un posible nombre de
inicio de sesión. Si este nombre de inicio de sesión es la cadena nula, la tilde es reemplazada por el
valor de la variable de shell HOME . Si HOME no está establecida, en su lugar se utiliza el directorio
home del usuario que está ejecutando la shell. De otro modo, el prefijo-tilde es reemplazado con el
directorio home asociado con el nombre de inicio de sesión especificado.
Si el prefijo-tilde es '~+', el valor de la variable PWD reemplaza al prefijo-tilde. Si el prefijo-tilde
es '~-' se sustituye por el valor de la variable OLDPWD , si esta está establecida.
Si los caracteres que siguen a la tilde en el prefijo-tilde consisten en un número N, opcionalmente
precedido por '+' o '-', el prefijo-tilde se sustituye por el correspondiente elemento de la pila de
directorios, como si fuera mostrado por el comando interno dirs invocado con los caracteres que
siguen al prefijo-tilde como argumento (vea la Sección 6.8 [La Pila de Directorios]). Si el prefijo-tilde,
sin la tilde, consiste en un número sin que vaya acompañado de '+' o '-', se asume que va acompañado
del signo '+'.

Página 26
Capitulo 3: Características Básicas del Shell

Si el nombre de inicio de sesión es inválido, o la expansión de tilde falla, la palabra se mantiene


sin cambios.
Cada asignación de variables se comprueba inmediatamente en busca de prefijos-tilde sin
entrecomillar siguiendo al ':' o al primer '='. En estos casos, la expansión tilde es inmediata. Por
consiguiente, uno pude usar los nombres de fichero con tildes en asignaciones a PATH, MAILPATH y
CDPATH , y la shell asigna el valor expandido.
La siguiente tabla muestra como Bash trata los prefijos-tilde sin entrecomillar:
~ El valor de $HOME
~/foo '$HOME /foo'
~fred/foo El subdirectorio foo del directorio home del usuario fred
~+foo '$PWD /foo'
~-/foo '${OLDPWD-'~-'} /foo'
~N La cadena que sería mostrada por 'dirs +N'
~+N La cadena que sería mostrada por 'dirs +N'
~-N La cadena que sería mostrada por 'dirs +N'

3.5.3.- Expansión de Parámetros de Shell


El carácter '$' inicia la expansión de parámetros, la sustitución de comandos o la expansión aritmética.
El nombre del parámetro o el símbolo a expandir puede ser encerrado entre llaves, lo que es opcional,
pero sirve para proteger la variable a ser expandida de que los caracteres inmediatamente siguientes a
ella puedan ser interpretados como parte del nombre.
Cuando se usan las llaves, la llave de cierre que se utiliza es la primera '}' no escapada mediante
una barra invertida o encerrada en una cadena entrecomillada, y no encerrada en una expansión
aritmética, sustitución de comandos o expansión de parámetros embebidas.
La forma básica de la expansión de parámetros es ${parámetro} . Se sustituye el valor de
parámetro. Las llaves son obligatorias cuando el parámetro es un parámetro posicional con más de un
dígito o cuando el parámetro es seguido por un carácter que no debe ser interpretado como parte de su
nombre.
Si el primer carácter del parámetro es una exclamación de cierre (!), se realiza una indirección de
variables de un nivel. Bash utiliza el valor de la variable formada con el resto del parámetro como el
nombre de la variable; esta variable entonces se expande y ese valor se utiliza en el resto de la
sustitución, en vez del valor del parámetro por sí mismo. Esto se conoce como expansión indirecta.
Las excepciones a esto son las expansiones ${!prefijo*} y ${!nombre[@]} descritas más abajo. La
exclamación de cierre debe ir inmediatamente a continuación de la llave izquierda para que indique la
indirección.
En todos los casos que se dan más abajo, palabra se somete a expansión de tildes, expansión de
parámetros, sustitución de comandos y expansión aritmética.
Cuando no se realiza la expansión de subcadenas, usando la forma descrita más abajo, Bash
analiza en busca de un parámetro que no esté establecido o sea nulo. Omitir el dos puntos resulta en
que el chequeo se realiza sólo en busca de un parámetro que no esté establecido. Dicho de otro modo,
si se incluye el dos puntos, el operador chequea tanto la existencia del parámetro como que su valor no
sea nulo; si el dos puntos se omite, el operador chequea únicamente la existencia.

Página 27
Capitulo 3: Características Básicas del Shell

${parámetro:-palabra}
Si el parámetro no está establecido o es nulo, se sustituye por la expansión de palabra. De
otro modo, se sustituye por el valor de parámetro.
${parámetro:=palabra}
Si el parámetro no está establecido o es nulo se asigna a parámetro la expansión de
palabra. Luego se sustituye por el valor de parámetro. Los parámetros posicionales y los
parámetros especiales no pueden ser asignados de este modo.
${parámetro:?palabra}
Si el parámetro es nulo o no está establecido, se escribe en la salida de error estándar la
expansión de palabra (o un mensaje a tal efecto si palabra no está presente) y la shell, si no
es interactiva, termina. De otro modo, se sustituye por el valor de parámetro.
${parámetro:+palabra}
Si el parámetro es nulo o no está establecido, no realiza ninguna sustitución, de otro modo
se sustituye por la expansión de palabra
${parámetro:desplazamiento}
${parámetro:desplazamiento:longitud}
Expande hasta longitud caracteres del parámetro comenzando por el carácter especificado
por desplazamiento. Si se omite longitud, expande a la subcadena de parámetro que
comienza en el carácter especificado por desplazamiento. longitud y desplazamiento son
expresiones aritméticas (vea la Sección 6.5 [Aritmética de la Shell]). Esto es conocido
como Expansión de Subcadenas.
longitud debe evaluarse a un número mayor o igual que cero. Si el desplazamiento se
evalúa como un número menor que cero, entonces el valor del desplazamiento se cuenta
desde el final del valor de parámetro. Si el parámetro es '@', el resultado es longitud
parámetros posicionales comenzando en desplazamiento. Si el parámetro es el nombre de
un array indexado seguido por '@' o '*', el resultado es de longitud miembros del array
comenzando con ${parámetro[desplazamiento]} . Un desplazamiento negativo se toma
como relativo al índice inmediatamente superior al mayor índice del array especificado. La
expansión de subcadenas aplicada a un array asociativo produce resultados no definidos.
${!prefijo*}
${!prefijo@}
Expande a nombres de variables cuyos nombres comiencen con prefijo, separados por el
primer carácter de la variable especial IFS . Cuando se usa '@' y la expansión aparece
encerrada entre dobles comillas, cada nombre de variable se expande a una palabra
separada del resto.
${!nombre[@]}
${!nombre[*]}
Si nombre es una variable de tipo array, expande a la lista de índices del array (claves)
asignada en nombre. Si nombre no es un array, expande a 0 si nombre está establecido y a
nulo en caso contrario. Cuando se usa '@' y la expansión aparece encerrada entre comillas
dobles, cada clave se expande en una palabra separada.

Página 28
Capitulo 3: Características Básicas del Shell

${#parámetro}
Se sustituye por la longitud en caracteres del valor expandido de parámetro. Si el
parámetro es '*' o '@', el valor sustituido es el número de parámetros posicionales. Si
parámetro es un nombre de array seguido de '* ' o '@', el valor sustituido es el número de
elementos del array.
${parámetro#palabra}
${parámetro##palabra}
La palabra se expande para producir un patrón al igual que en la expansión de nombres de
fichero (vea la Sección 3.5.8 [Expansión de Nombres de Fichero]). Si el patrón encaja con
el principio del valor expandido de parámetro, entonces el resultado de la expansión es el
valor expandido de parámetro en el que se elimina el ajuste más corto al patrón (en el caso
de usar '#') o el ajuste más largo al patrón (en el caso de '##'). Si el parámetro es '@' o '*'
la operación de eliminación del patrón se aplica a cada parámetro posicional
sucesivamente, y la expansión es la lista resultante. Si el parámetro es una variable de tipo
array indexada por '@' o '*' la operación de eliminación del patrón se aplica a cada
miembro del array en turnos, y la expansión es la lista resultante.
${parámetro%palabra}
${parámetro%%palabra}
La palabra es expandida para producir un patrón como en la expansión de nombres de
fichero. Si el patrón encaja en una porción final del valor expandido de parámetro,
entonces el resultado de la expansión es el valor de parámetro con el ajuste más corto que
concuerde con el patrón (en el caso de '%') o el ajuste más largo (en el caso de '%%')
eliminados. Si el parámetro es '@' o '*' la operación de eliminación del patrón se aplica a
cada parámetro posicional en turnos y la expansión es la lista resultante. Si el parámetro es
una variable de tipo array indexada por '@' o '*', la operación de eliminación del patrón se
aplica a cada miembro del array secuencialmente, y la expansión es la lista resultante.
${parámetro/patrón/cadena}
patrón se expande para producir un patrón como en la expansión de nombres de archivo.
parámetro se expande y el ajuste más largo al patrón de este valor es sustituido por
cadena. Si el patrón comienza con '/', todos los ajustes al patrón son reemplazados por
cadena. Normalmente sólo se reemplaza el primer ajuste. Si el patrón comienza con '#',
este debe encajar al principio del valor expandido de parámetro. Si el patrón comienza con
'%' este debe ajustar al final del valor expandido de parámetro. Si la cadena es nula los
ajustes al patrón serán eliminados y se puede omitir la '/' posterior al patrón. Si el
parámetro es '@ ' o '* ', la operación de sustitución se aplica a cada parámetro posicional
por turnos, y la expansión es la lista resultante. Si parámetro es una variable de tipo array
indexada con '@' o '*', la operación de sustitución se aplica a cada uno de los miembros
del array en turnos, y la expansión es la lista resultante.

Página 29
Capitulo 3: Características Básicas del Shell

${parámetro^patrón}
${parámetro^^patrón}
${parámetro,patrón}
${parámetro,,patrón}
Esta expansión modifica las mayúsculas-minúsculas en los caracteres alfabéticos de
parámetro. patrón se expande para producir un patrón como en la expansión de nombres
de fichero. El operador '^' convierte las letras minúsculas que encajen con el patrón a
letras mayúsculas; el operador ';' convierte las letras mayúsculas que ajusten con el patrón
a letras minúsculas. Las expansiones con '^^' y ',,' convierten cada carácter que encaje
en el valor expandido; Las expansiones con '^' y ',' encajan y convierten únicamente el
primer carácter en el valor expandido. Si se omite el patrón se considera que este es igual
a '?', con el que encaja cualquier carácter. Si el parámetro es '@' o '*' las modificaciones
de mayúsculas y minúsculas se aplican a cada carácter posicional en turnos y la expansión
es la lista resultante. Si parámetro es una variable de tipo array indexada con ' @' o '*', las
modificaciones se aplican a cada miembro del array en turnos, y la expansión es la lista
resultante.

3.5.4.- Sustitución de Comandos.


La sustitución de comandos permite que la salida de un comando sustituya al propio comando. La
sustitución de comandos ocurre cuando un comando es encerrado de la siguiente manera:
$(comando)
o
`comando`
Bash realiza la expansión ejecutando el comando y reemplazando la sustitución del comando con
la salida estándar del comando, con cualquier carácter nueva línea marginal eliminado. Las
nuevas líneas embebidas en el interior no son eliminadas, pero pueden ser eliminadas durante la
división de palabras. La sustitución del comando $(cat archivo) puede ser reemplazada por su
equivalente mucho más rápido $(< archivo).
Cuando se utiliza la forma antigua, encerrada entre tildes invertidas ('`'), las barras invertidas
mantienen su significado literal excepto cuando van seguidas de '$', ''', o '\'. La primera tilde inver-
tida no precedida por una barra invertida termina la sustitución de comandos. Cuando se usa la forma
$(comando), todos los caracteres entre los paréntesis forman el comando; ninguno se trata de forma
especial.
La sustitución de comandos puede ser anidada. Para anidar cuando se utiliza la forma antigua, se
debe escapar las tildes inversas internas con barras invertidas.
Si la sustitución aparece entre dobles comillas, no se realiza la separación de palabras y la
expansión de nombres de ficheros en los resultados.
3.5.5.- Expansión Aritmética
La expansión aritmética permite la evaluación de una expresión aritmética y la sustitución del resul-
tado. El formato para la expansión aritmética es:
$(( expresión ))
La expresión se trata como si estuviera encerrada entre dobles comillas, pero unas comillas
dobles encerradas entre los paréntesis no se tratan de forma especial. Todos los tokens en la expre sión
sufren expansión de parámetros, sustitución de comandos y eliminación del entrecomillado. La

Página 30
Capitulo 3: Características Básicas del Shell

expansión aritmética puede ser anidada.


La evaluación se realiza de acuerdo con las reglas listadas más abajo (vea la Sección 6.5
[Aritmética de la Shell]). Si la expresión es inválida, Bash imprime un mensaje indicando el fallo en la
salida de error estándar y no se produce ninguna sustitución.
3.5.6.- Sustitución de Procesos.
La sustitución de procesos está soportada en sistemas que permiten tuberías con nombre (FIFOs) o el
método de denominar los archivos abiertos con '/dev/fd'. Esta toma la forma:
<(lista)
o
>(lista)
La lista de procesos se ejecuta con su entrada o su salida conectada a un FIFO o a un archivo del
tipo '/dev/fd'. El nombre de este archivo se pasa como argumento al comando actual como resultado
de la expansión. Si se utiliza la forma >(lista) la escritura en el archivo proporcionará entrada para
la lista. Si se utiliza la forma <(lista) el archivo pasado como un argumento debe leer para obtener
para obtener la salida de la lista. Advierta que no deben aparecer espacios entre < o > y el paréntesis
izquierdo, de otro modo la construcción se interpretará como una redirección.
Cuando está disponible, la sustitución de procesos se realiza de forma simultanea con la expan-
sión de parámetros y variables, la sustitución de comandos y la expansión aritmética.
3.5.7.- Separación de palabras
La shell escanea los resultados de la expansión de parámetros, la sustitución de comandos y la
expansión aritmética que no ocurren entre dobles comillas para separar palabras.
La shell trata cada carácter de $IFS como un delimitador, y separa los resultados de otras
expansiones en palabras mediante estos caracteres. Si la variable IFS no está establecida, o su valor es
exactamente <espacio><tabulación><nueva linea>, el valor por defecto, entonces se ignoran las
secuencias de <espacio>, <tabulación> y <nueva linea> al principio y al final de los resultados de las
expansiones previas, y cualquier secuencia de caracteres del I FS que no estén situados al principio o al
final sirven para delimitar palabras. Si IFS tiene algún otro valor distinto al valor por defecto, las
secuencias de los caracteres espacio y tabulación son ignoradas al principio y al final de la palabra,
siempre que el carácter de espacio en blanco esté en el valor de IFS (un carácter de espacio en blanco
de IFS). Cualquier carácter en IFS que no sea espacio en blanco de IFS, junto con cualquier carácter
de espacio en blanco adyacente de IFS, delimita un campo. Una secuencia de caracteres de espacio en
blanco de IFS también se trata como un delimitador. Si el valor de IFS es nulo, no se realiza la
división de palabras. Se mantienen los valores explícitamente nulos (“” o ''). Los argumentos
implícitamente nulos no entrecomillados, resultantes de la expansión de parámetros que no tengan
valor, son eliminados. Si se expande un parámetro sin valor dentro de comillas dobles, el argumento
nulo resultante se mantiene. Advierta que si no se realiza ninguna expansión tampoco hay separación
de palabras.
3.5.8.- Expansión de Nombres de Fichero.
Tras la separación de palabras, a menos que se haya establecido la opción ' -f' (vea la Sección 4.3.1
[El Comando Interno Set]), Bash escanea cada palabra en busca de los caracteres '*', '?' y '['. Si
aparece alguno de estos caracteres la palabra es considerada como un patrón, y reemplazada con una
lista alfabéticamente ordenada de nombres que se ajustan al patrón. Si no se encuentra ningún nombre
concordante con el patrón, y la opción de shell nullglob está deshabilitada, la palabra permanece sin
cambios. Si la opción nullglob está establecida, y no se encuentran concordancias, la palabra es

Página 31
Capitulo 3: Características Básicas del Shell

eliminada. Si la opción de shell failglob está establecida, y no se encuentran concordancias, se


imprime un mensaje de error y el comando no se ejecuta. Si la opción de shell nocaseglob está
establecida, se realiza el ajuste sin tener en cuenta la diferencia entre mayúsculas y minúsculas para los
caracteres alfabéticos.
Cuando se utiliza un patrón para la expansión de nombres de fichero, el carácter '.' al principio
del nombre de archivo o inmediatamente después de una barra inclinada '/' debe concordar siempre
de forma explícita, a menos que la opción dotglob esté establecida. Cuando se ajustan nombres de
ficheros el carácter barra invertida siempre debe hacerse concordar explícitamente. En otros casos el
carácter '.' no se trata de forma especial.
Vea la descripción de shopt en la Sección 4.3.2 [El Comando Interno Shopt] para una
descripción de las opciones nocaseglob, nullglob, failglob y dotglob.
La variable de shell GLOBIGNORE se puede utilizar para restringir el juego de nombres de
archivo que concuerdan con un patrón. Si GLOBIGNORE está establecida cada nombre concordante
que también concuerden con alguno de los patrones contenidos en GLOBIGNORE es eliminado de la
lista de concordancias. Los nombres de fichero '.' y '..' son siempre ignorados cuando GLOBIGNORE
está establecida y no es nula. Sin embargo, asignar a GLOBIGNORE un valor no nulo tiene el efecto
de activar la opción de shell dotglob, de forma que todos los demás nombres de archivo que
comiencen con '.' serán concordantes con el patrón. Para obtener el comportamiento anterior de
ignorar los nombres de fichero que comiencen con '.', añada el patrón '.*' a los patrones contenidos en
GLOBIGNORE . La opción dotglob se desactiva cuando GLOBIGNORE no está establecido.
3.5.8.1.- Concordancia de Patrones
Cualquier carácter que aparece en un patrón, distinto de los caracteres especiales para patrones
descritos más abajo, concuerda con sí mismo. El carácter NUL no puede ocurrir en un patrón. Una
barra invertida escapa al carácter que le sigue. La barra invertida de escape es ignorada cuando se
realiza el ajuste. Los caracteres especiales para patrones deben ser entrecomillados para que sean
ajustados literalmente.
Los caracteres especiales para patrones tienen los siguientes significados.

Página 32
Capitulo 3: Características Básicas del Shell

* Concuerda con cualquier cadena, incluida la cadena nula. Cuando la opción de shell
globstar está activada, y se utiliza el '*' en un contexto de expansión de nombre de
ficheros, dos '*' adyacentes se usan como un único patrón que concuerda con todos los
archivos y cero o más directorios y subdirectorios. Si están seguidos por un '/', dos '*'
adyacentes concordarán sólo con directorios y subdirectorios.
? Concuerda con cualquier carácter individual.

[…] Concuerda con cualquiera de los caracteres encerrados. Un par de caracteres sepa-
rados por un guión '-' indican una expresión de rango; cualquier carácter que por
orden se sitúe entre esos dos caracteres, usando la secuencia de ordenación de la
localización actual y su juego de caracteres, incluyendo a ambos, concuerda con la
expresión. Si el primer carácter que sigue al '[' es un '!' o un '^'entonces concuerda
con cualquier carácter no encerrado entre los corchetes. Un '_' puede concordar
incluyéndolo como el primer o el último carácter en el conjunto de caracteres
incluido. Un ']' puede ser concordante incluyéndolo como el primer carácter en el
conjunto. El orden de ordenación de los caracteres en las expresiones de rango se
determina mediante la localización actual y el valor de la variable de shell
LC_COLLATE , si está establecida.
Por ejemplo en la localización por defecto, C, '[a-dx-z]' es equivalente a '[abcdxyz]'.
Muchas localizaciones ordenan los caracteres en orden de diccionario, y en estas
normalmente '[a-dx-z]' no es equivalente a '[abcdxyz]'; podría ser equivalente a, por
ejemplo, '[aBbCcDdxXyYz]'. Para obtener la interpretación tradicional de los rangos en
expresiones entre corchetes, se puede forzar a utilizar la localización de C
estableciendo la variable de entorno LC_COLLATE o LC_ALL al valor 'C'.
Dentro de '[' y ']' se pueden especificar clases de caracteres usando la sintaxis
[:clase:], donde clase es una de las siguientes clases definidas en el estándar POSIX:
alnum alpha ascii blank cntrl digit graph lower print punct space upper word xdigit
Una clase de caracteres concuerda con cualquier carácter que forme parte de esa
clase. La clase word concuerda con letras, dígitos y el carácter '_'.
Se puede especificar una clase de equivalencia encerrada entre '[' y ']' utilizando la
sintaxis [=c=], la cual concuerda con cualquier carácter con el mismo peso de clasi-
ficación (como se define por la localización actual) que el carácter c
Entre '[' y ']' la sintaxis [.símbolo.] concuerda con el símbolo de clasificación símbolo.
Si la opción de shell extglob está activada usando el comando interno shopt, se reconocerán
varios operadores de patrones extendidos. En la descripción siguiente, una lista-patrones es una lista de
uno o más patrones separados por un '|'. Se pueden formar patrones compuestos usando uno o más de
los siguientes sub-patrones:
?(lista-patrones)
Concuerda con cero o una ocurrencia de los patrones dados.
*(lista-patrones)
Concuerda con cero o más ocurrencias de los patrones dados
+(lista-patrones)
Concuerda con una o más ocurrencias de los patrones dados.
@(lista-patrones)
Concuerda con uno de los patrones dados.

Página 33
Capitulo 3: Características Básicas del Shell

!(lista-patrones)
Concuerda con cualquier cosa que no se ajuste a los patrones dados.

3.5.9.- Eliminación del entrecomillado.


Tras las expansiones precedentes, todas las ocurrencias no entrecomilladas de los caracteres '\',''', y
'”' que no resultaron de las expansiones anteriores son eliminadas.

3.6.- Redirecciones
Antes de que un comando sea ejecutado, su entrada y su salida pueden ser redireccionadas usando una
notación especial interpretada por la shell. La redirección también se puede utilizar para abrir y cerrar
archivos por el entorno de ejecución actual de la shell. Los siguientes operadores de redirección
pueden preceder o aparecer en cualquier lugar en medio de un comando simple o pueden seguir a un
comando. Las redirecciones son procesadas en el orden en el que aparecen, de izquierda a derecha.
Cada redirección puede ser precedida por un número de descriptor de fichero o puede estar
precedida por una palabra de la forma {nombre_de_variable} . En este caso, para cada operador
redirección exceptuando >&- y <&-, la shell asignará un descriptor de fichero mayor de 10 y asignará
este a {nombre_de_variable} . Si >&- o <&- están precedidos de {nombre_de_variable} , el valor de
nombre_de_variable define el descriptor a cerrar.
En las descripciones siguientes, si se omite el número de descriptor de fichero, y el primer
carácter del operador de redirección es '<', la redirección hace referencia a la entrada estándar
(descriptor de archivo 0). Si el primer carácter del operador de redirección es '>', la redirección hace
referencia al la salida estándar (descriptor de archivo 1).
La palabra que sigue al operador de redirección en las descripciones siguientes, salvo que se
especifique lo contrario, está sujeta a expansión de llaves, expansión de tildes, expansión de pará-
metros, sustitución de comandos, expansión aritmética, eliminación de entrecomillado, expansión de
nombres de fichero, y separación de palabras. Si esta se expande a más de una palabra, Bash informa
de un error.
Advierta que el orden de las redirecciones es importante. Por ejemplo, el comando
ls > listadir 2>&1
direcciona tanto la salida estándar (descriptor de fichero 1) y la salida de error estándar (descriptor de
fichero 2) al archivo listadir, mientras que el comando
ls 2>1& > listadir
direcciona únicamente la salida estándar al archivo listadir, ya que el error estándar se hizo una copia
de la salida estándar antes de que la salida estándar fuera redireccionada a listadir.
Bash maneja varios nombres de fichero especialmente cuando se utilizan en redirecciones, como
se describe en la tabla siguiente:
/dev/fd/fd
Si fd es un entero válido, el descriptor de fichero fd es duplicado
/dev/stdin
Se duplica el descriptor de fichero 0
/dev/stdout
Se duplica el descriptor de fichero 1
/dev/stderr
Se duplica el descriptor de fichero 2

Página 34
Capitulo 3: Características Básicas del Shell

/dev/tcp/host/puerto
Si host es un nombre de anfitrión válido o una dirección de internet y puerto es un número
de puerto de tipo entero o un nombre de servicio, Bash intenta abrir una conexión TCP al
socket correspondiente.
/dev/udp/host/puerto
Si host es un nombre de anfitrión válido o una dirección de internet y puerto es un número
de puerto de tipo entero o un nombre de servicio, Bash intenta abrir una conexión UDP al
socket correspondiente.
Un error al abrir o crear un archivo provoca que la redirección falle.
Las redirecciones con descriptores de fichero mayores de 9 deben ser usadas con cuidado, ya que
pueden entrar en conflicto con los descriptores de archivo que la shell usa internamente.
3.6.1.- Redireccionando la entrada
La redirección de la entrada provoca que el archivo cuyo nombre resulta de la expansión de palabra
sea abierto para lectura en un descriptor de fichero n, o la entrada estándar (descriptor de fichero 0) si
no se especifica el valor de n.
El formato general para la redirección de la entrada es:
[n]<palabra

3.6.2.- Redireccionando la salida


La redirección de la salida produce que el archivo cuyo nombre resulta de la expansión de palabra sea
abierto para escritura en el descriptor de fichero n, o la salida estándar (descriptor de fichero 1) si no
se especifica n. Si el fichero no existe se crea; si existe se trunca a tamaño cero.
El formato general para redireccionar la salida es:
[n]>[|]palabra
Si el operador de redirección es '>' y la opción noclobber del comando interno set está
activada, la redirección fallará si el nombre de archivo que resulta de la expansión de palabra existe y
es un archivo regular. Si el operador de redirección es '>|' o '>' y la opción noclobber no está
activada, la redirección se intenta incluso si el archivo nombrado por palabra existe.
3.6.3.- Anexando la salida redirigida
La redirección de la salida llevada a cabo de esta forma causa que el archivo cuyo nombre resulta de la
expansión de la palabra se abra para anexar (añadir) en el descriptor de fichero n, o la salida estándar
(descriptor de fichero 1) si no se especifica el valor de n. Si el archivo no existe se crea.
El formato general para anexar la salida es:
[n]>>palabra

3.6.4.- Redirigiendo la Salida Estándar y la Salida de Error Estándar


Esta construcción permite que tanto la salida estándar (descriptor de fichero 1) como la salida de error
estándar (descriptor de fichero 2) sean redireccionadas al archivo cuyo nombre es la expansión de
palabra. Hay dos formatos para redireccionar la salida estándar y la salida de error estándar:
&>palabra
y
>&palabra
De las dos formas, es preferible la primera. Esto equivale semánticamente a

Página 35
Capitulo 3: Características Básicas del Shell

>palabra 2>&1

3.6.5.- Anexando la Salida Estándar y la Salida de Error Estándar.


Esta construcción permite que tanto la salida estándar (descriptor de fichero 1) como la salida de error
estándar (descriptor de fichero 2) se anexen al archivo cuyo nombre es la expansión de palabra.
El formato para anexar la salida estándar y la salida de error estándar es:
&>>palabra
Esto es semánticamente equivalente a
>>palabra 2>&1

3.6.6.- Documentos Internos (Here Documents)


Este tipo de redirección ordena a la shell leer la entrada desde la fuente actual hasta encontrar una
línea que contenga únicamente a palabra (sin espacios en blanco en los márgenes). Todas las lineas
leídas hasta ese punto son luego usadas como entrada estándar para un comando.
El formato es:
<<[-]palabra
documento-interno
delimitador
En palabra no se realiza la expansión de parámetros, la sustitución de comandos, la expansión
aritmética o la expansión de nombres de fichero. Si algunos caracteres en palabra están entrecomi-
llados, el delimitador es el resultado de la eliminación de entrecomillado en palabra, y no se expanden
las líneas en el documento interno. Si palabra no está entrecomillada, todas las líneas del documento
interno son sometidas a expansión de parámetros, sustitución de comandos y expansión aritmética. En
el último caso, se ignora la secuencia de caracteres \nueva_linea, y se debe usar '\' para entrecomillar
los caracteres '\', '$' y '''.
Si el operador de redirección es '<<-' entonces se eliminan todos los caracteres de tabulación
marginales de las líneas de entrada y de la línea que contiene a delimitador. Esto permite indentar de
forma natural los documentos internos usados en guiones de shell.
3.6.7.- Cadenas Internas (Here strings)
Son una variante de los documentos internos, el formato es:
<<< palabra
La palabra es expandida y suministrada al comando en su entrada estándar.
3.6.8.- Duplicando Descriptores de Fichero
El operador de redirección
[n]<&palabra
se utiliza para duplicar descriptores de fichero de entrada. Si palabra se expande a uno o más dígitos,
el descriptor de fichero denotado por n es hecho una copia de ese descriptor de fichero. Si los dígitos
en palabra no especifican un descriptor de fichero abierto para entrada, se produce un error de
redirección. Si palabra se evalúa a '-' se cierra el descriptor de fichero n. Si no se especifica el valor n
se utiliza la entrada estándar (descriptor de fichero 0).
El operador
[n]>&palabra
se utiliza de forma similar para duplicar los descriptores de fichero de salida. Si no se especifica n se
utiliza la salida estándar (descriptor de fichero 1). Si los dígitos en palabra no especifican un

Página 36
Capitulo 3: Características Básicas del Shell

descriptor de fichero abierto para salida, se produce un error de redirección. Como caso especial, si se
omite n y palabra no se expande a uno o más dígitos, la salida estándar y el error estándar son
redireccionados como se describió anteriormente.
3.6.9.- Moviendo Descriptores de Fichero
El operador de redirección
[n]<&dígito-
mueve el descriptor de fichero dígito al descriptor de fichero n, o la entrada estándar (descriptor de
fichero 0) si no se especifica el valor de n. Dígito es cerrado después de haber sido duplicado a n.
De forma similar el operador de redirección
[n]>&dígito-
mueve el descriptor de fichero dígito al descriptor de fichero n, o la salida estándar (descriptor de
fichero 1) si no se especifica n.
3.6.10.- Abriendo descriptores de fichero para lectura y escritura
El operador de redirección
[n]<>palabra
causa que el archivo cuyo nombre es la expansión de palabra se abra tanto para lectura como para
escritura en el descriptor de fichero n, o en el descriptor de fichero 0 si no se especifica n. Si el archivo
no existe se crea.

3.7.- Ejecutando comandos


3.7.1.- Expansión de un comando simple
Cuando se ejecuta un comando único la shell realiza las siguientes expansiones, asignaciones y
redirecciones de izquierda a derecha.
1. Las palabras que el analizador ha marcado como asignaciones de variables (las que preceden al
nombre de comando) y las redirecciones se guardan para su posterior procesado.
2. Las palabras que no son asignaciones de variables o redirecciones se expanden (vea la Sección
3.5 [Expansiones de la Shell]). Si queda alguna palabra tras la expansión, la primera palabra se
toma como el nombre del comando y el resto de palabras son los argumentos.
3. Las redirecciones se realizan como se describió anteriormente (vea la Sección 3.6 [Redirec-
ciones]).
4. El texto después del '=' en cada asignación de variable sufre expansión de tilde, expansión de
parámetros, sustitución de comandos, expansión aritmética y eliminación de entrecomillado
antes de ser asignado a la variable.
Si no se obtiene ningún nombre de comando, la asignación de variables afectará al entorno actual
de la shell. En caso contrario, las variables se añaden al entorno del comando ejecutado y no afectan al
entorno actual de la shell. Si alguna de las asignaciones intenta asignar un valor a una variable de sólo
lectura se produce un error y el comando termina con un estado distinto de cero.
Si no se obtiene ningún nombre de comando, se llevan a cabo las redirecciones, pero no afectan
al entorno actual de la shell. Un error de redirección provoca que el comando finalice con un estado
distinto de cero.
Si queda algún nombre de comando tras la expansión, se procede a su ejecución como se describe
más abajo. En caso contrario el comando finaliza. Si una de las expansiones contenían una sustitución
de comandos, el estado de salida del comando es el estado de salida de la última sustitución de

Página 37
Capitulo 3: Características Básicas del Shell

comandos realizada. Si no hubo sustitución de comandos, el comando finaliza con un estado igual a
cero.
3.7.2.- Búsqueda y Ejecución de Comandos
Después de que un comando haya sido separado en palabras, si esto resulta en un comando único y
una lista de comandos opcional, se realizan las siguientes acciones:
1. Si el nombre del comando no contiene barras inclinadas, la shell intenta localizar el comando.
Si existe una función de shell con ese nombre se invoca a dicha función como se describe en la
Sección 3.3 [Funciones de Shell].
2. Si el nombre no encaja con ninguna función, la shell busca en la lista de comandos internos de
la shell. Si encuentra alguna concordancia se invoca a ese comando interno.
3. Si el nombre no es una función de shell ni un comando interno y no contiene barras inclinadas,
Bash busca en cada elemento de $PATH un directorio conteniendo un archivo ejecutable con
ese nombre. Bash usa una tabla hash para recordar la ruta completa de los archivos ejecutables
para evitar múltiples búsquedas en el PATH (vea la descripción de hash en la Sección 4.1
[Comandos Internos de la Shell]). Se realiza una búsqueda completa de los directorios
incluidos en el $PATH únicamente si el comando no se encuentra en la tabla hash. Si la
búsqueda es infructuosa, la shell busca una función de shell denominada
command_not_found_handle. Si esta función existe se le invoca con el comando original y los
argumentos originales del comando como sus argumentos, y el estado de salida de la función
se convierte en el estado de salida de la shell. Si esa función no está definida la shell imprime
un mensaje de error y devuelve un estado de salida igual a 127.
4. Si la búsqueda es exitosa o si el nombre del comando contiene una o más barras invertidas, la
shell ejecuta el nombre de programa en un entorno de ejecución separado. El argumento 0 se
asigna al nombre dado, y el resto de argumentos del comando se asignan a los argumentos que
se le suministran, si los hay.
5. Si esta ejecución falla debido a que el archivo no se encuentra en un formato ejecutable y el
archivo no es un directorio, se asume que es un guión de shell y la shell lo ejecuta como se
describe en la Sección 3.8 [Guiones de Shell].
6. Si el comando no fue iniciado de forma asíncrona, la shell espera a que el comando finalice y
recoge su estado de salida.
3.7.3.- Entorno de Ejecución de Comandos
La shell tiene un entorno de ejecución que consiste en lo siguiente:
• Los archivos abiertos heredados por la shell en la invocación con las modificaciones
suministradas por el comando interno exec.
• El directorio actual de trabajo como se estableció con cd, pushd o popd o se heredó de la
shell en su invocación.
• La máscara del modo de creación de ficheros como se estableció con umask o se heredó
desde el padre de la shell.
• Las trampas actuales establecidas mediante trap.
• Los parámetros de la shell que son establecidos mediante la asignación de variables, con set o
heredados en el entorno desde el padre de la shell.
• Las funciones de la shell definidas durante la ejecución o heredadas en el entorno desde el
padre de la shell.
• Las opciones activadas en la invocación (bien por defecto o con argumentos en la línea de
comandos) o mediante set.

Página 38
Capitulo 3: Características Básicas del Shell

• Las opciones activadas con shopt (vea la Sección 4.3.2 [El comando Interno Shopt])
• Los alias de shell definidos mediante alias (vea la Sección 6.6 [Alias])
• Varios Ids de proceso, incluidos los de las tareas en segundo plano (vea la Sección 3.2.3
[Listas]), el valor de $$ y el valor de $PPID .
Cuando un comando único distinto de un comando interno o una función de shell va a ser eje-
cutado, este se invoca en un entorno de ejecución separado que consisten en lo siguiente. A menos que
se advierta lo contrario, los valores son heredados de la shell.
• Los archivos abiertos de la shell, más cualquier modificación y adición al comando
especificada mediante redirecciones.
• El directorio de trabajo actual.
• La máscara de modo de creación de ficheros.
• Las variables de shell y las funciones marcadas para exportar, junto con variables exportadas
por el comando, pasadas en el entorno (vea la Sección 3.7.4 [Entorno])
• Las trampas capturadas por la shell son reiniciadas a los valores heredados desde el padre de la
shell y las trampas ignoradas por la shell son ignoradas.
Un comando invocado en este entorno separado no puede afectar al entorno de ejecución de la
shell.
La sustitución de comandos, los comandos agrupados con paréntesis y los comandos asíncronos
se invocan en un entorno de subshell que es un duplicado del entorno de la shell, excepto que las
trampas capturadas por la shell se reinician a los valores que la shell heredó de su padre en la
invocación. Los comandos internos que se invocan como parte de una tubería también se ejecutan en
un entorno de subshell. Los cambios hechos al entorno de la subshell no puede afectar a entorno de
ejecución de la shell.
Las subshells engendradas para ejecutar la sustitución de comandos heredan el valor de la opción
'-e' desde la shell padre. Cuando no se encuentra en modo POSIX, Bash limpia la opción ' -e' en
dichas subshells.
Si un comando es seguido por un '&' y el control de tareas no está activo, la entrada estándar por
defecto para el comando es el archivo vacío '/dev/null'. En caso contrario, el comando invocado
hereda los descriptores de fichero de la shell invocante con las modificaciones realizadas por las
redirecciones.
3.7.4.- Entorno
Cuando se invoca un programa se le proporciona un array de cadenas llamado el entorno. Esto es una
lista de pares nombre-valor, de la forma nombre=valor.
Bash proporciona varias maneras de manipular el entorno. En la invocación, la shell escanea su
propio entorno y crea un parámetro para cada nombre que encuentra, marcándolo automáticamente
para exportarlo a los procesos hijo. Los comandos ejecutados heredan el entorno. Los comandos
export y 'declare -x' permiten que los parámetros y funciones sean añadidos o eliminados del
entorno. Si se modifica el valor de un parámetro en el entorno, el nuevo valor se convierte en parte del
entorno, reemplazando al valor anterior. El entorno heredado por cualquier comando ejecutado
consiste en el entorno inicial de la shell, cuyos valores pueden ser modificados en la shell, menos los
pares eliminados mediante los comandos unset y 'export -n', más cualquier adición mediante los
comandos export y 'declare -x'.
Se puede incrementar temporalmente el entorno para un comando único o una función ante-
poniendole asignaciones de parámetros, como se describe en la Sección 3.4 [Parámetros de Shell].
Estas sentencias de asignación afectan únicamente al entorno visto por ese comando.

Página 39
Capitulo 3: Características Básicas del Shell

Si la opción '-k' está establecida (vea la Sección 4.3.1 [El Comando Interno Set]), entonces todas
las asignaciones de parámetros se emplazan en el entorno para el comando, no sólo las que preceden
al nombre del comando.
Cuando Bash invoca un comando externo, la variable ' $_ ' se asigna al nombre de ruta completo
del comando y se pasa a dicho comando en su entorno.
3.7.5.- Estados de Salida
El estado de salida de un comando ejecutado es el valor retornado por la llamada al sistema waitpd o
alguna función equivalente. Los estados de salida tienen valores entre 0 y 255, aunque, como se
explica más abajo, la shell puede usar de forma especial valores superiores a 125. Los estados de
salida de los comandos internos de la shell y los comandos compuestos están también limitados a este
rango. Bajo ciertas circunstancias, la shell puede usar valores especiales para indicar modos de fallo
específicos.
Para los propósitos de la shell un comando que finaliza con un estado de salida igual a cero ha
tenido éxito. Un estado de salida distinto de cero indica que se ha producido un fallo. Este esquema
aparentemente intuitivo se usa de forma que existe un modo bien definido para indicar el éxito y una
variedad de formas para indicar varios modos de fallo. Cuando un comando termina con una señal de
error fatal cuyo número es N, Bash usa el valor 128+N como estado de salida.
Si no se encuentra un comando, el proceso hijo creado para ejecutarlo devuelve un estado de 127.
Si se encuentra un comando pero este no es ejecutable, el estado de retorno es 126.
Si un comando falla debido a un error durante la expansión o la redirección el estado de salida es
mayor que cero.
El estado de salida es usado por los comandos condicionales de Bash (vea la Sección 3.2.4.2
[Construcciones Condicionales) y algunas de las construcciones de listas (vea la Sección 3.2.3
[Listas]).
Todos los comandos internos de Bash devuelven un estado igual a cero si se ejecutan con éxito y
un estado distinto de cero en caso de fallo, de forma que se pueden usar en las construcciones
condicionales y de listas. Todos los comandos internos devuelven un estado de salida igual a 2 para
indicar un uso incorrecto.
3.7.6.- Señales
Cuando Bash es interactivo, en ausencia de cualquier trampa, este ignora SIGTERM ( de forma que
'kill 0' no destruye a las shells interactivas), y SIGINT es capturada y manejada (de forma que el
comando interno wait es interrumpible). Cuando Bash recibe una SIGINT, este detiene cualquier
bucle en ejecución. En todos los casos Bash ignora SIGQUIT. Si el control de tareas está habilitado
(vea el Capítulo 7 [Control de Tareas] Bash ignora SIGTTIN, SIGTTOU y SIGTSTP.
Los comandos no internos iniciados por Bash tienen manejadores de señales establecidos a los
valores heredados por la shell desde su padre. Cuando el control de tareas no está activado, los
comandos asíncronos ignoran SIGINT y SIGQUIT en adición a esos manejadores heredados. Los
comandos se ejecutan como resultado de una sustitución de comandos ignoran las señales de control
de tareas SIGTTOU y SIGTSTP generadas por el teclado.
La shell finaliza por defecto tras recibir un SIGHUP. Antes de terminar, una shell interactiva
reenvía el SIGHUP a todas sus tareas, tanto suspendidas como en ejecución. Se envía SIGCONT a las
tareas suspendidas para asegurarse de que reciben la señal SIGHUP. Para prevenir que la shell envíe la
señal SIGHUP a una tarea en particular esta debería ser eliminada de la tabla de tareas con el comando
interno disown (vea la Sección 7.2 [Comandos Internos para el Control de Tareas] o marcada para
que no reciba SIGHUP usando 'disown -h'.

Página 40
Capitulo 3: Características Básicas del Shell

Si la opción de shell huponexit ha sido establecida con shopt (vea la Sección 4.3.2 [El
Comando Interno Shopt]) Bash envía un SIGHUP a todas las tareas cuando una shell de inicio de
sesión interactiva finaliza.
Si Bash está esperando a que un comando finalice y recibe una señal para la cual tiene establecida
una trampa, la trampa no se ejecutará hasta que el comando finalice. Cuando Bash está esperando a un
comando asíncrono mediante el comando interno wait, la recepción de una señal para la cual tiene
establecida una trampa provoca que el comando interno wait finalice inmediatamente con un estado
de salida mayor que 128, justo después de la ejecución de la trampa.

3.8.- Guiones de Shell


Un guión de shell es un archivo de texto que contiene comandos de shell. Cuando se usa este tipo de
fichero como el primer argumento no opción en la invocación de Bash y no se suministran ni la opción
'-c' ni la '-s' (vea la Sección 6.1 [Invocando a Bash]), Bash lee y ejecuta comandos del fichero y
luego finaliza. Este modo de operación crea una shell no interactiva. La shell busca primero el fichero
en el directorio actual y después en los directorios de $PATH si no lo encuentra allí.
Cuando Bash ejecuta un guión de shell, este establece el parámetro especial 0 al nombre del
fichero, en vez de al nombre de la shell, y el resto de argumentos, si se da alguno, se asignan a los
parámetros posicionales. Si no se proporcionan argumentos adicionales, se desactivan los parámetros
posicionales.
Un guión de shell se puede convertir en ejecutable usando el comando chmod para activar el bit
de ejecución. Si Bash encuentra este tipo de ficheros mientras busca un comando en $PATH , este
genera una subshell para ejecutarlo. En otras palabras, ejecutar
nombre_de_archivo argumentos
es equivalente a ejecutar
bash nombre_de_archivo argumentos
Si el nombre_de_archivo es un guión de shell ejecutable. Este subshell se reinicializa a sí mismo,
de forma que el efecto es como si se hubiese invocado una nueva shell para interpretar el guión, con la
excepción de que las localizaciones de comandos recordadas por el padre (vea la descripción de hash
en la Sección 4.1 [Comandos Internos de la Shell Bourne]) se mantienen en el hijo.
La mayoría de las versiones de Unix hacen de esto una parte del mecanismo de ejecución de
comandos del sistema operativo. Si la primera línea de un guión comienza con los caracteres '#!', el
resto de la línea especifica un intérprete para el programa. Esto es, usted puede especificar Bash, awk,
Perl o algún otro intérprete y escribir el resto del guión en ese lenguaje.
Los argumentos para el interprete consisten en un único argumento opcional a continuación del
nombre del interprete en la primera línea del archivo del guión, seguido por el nombre del archivo de
guión, seguido por el resto de los argumentos. Bash realizará esta acción en sistemas operativos que no
manejan esto por sí mismos. Advierta que algunas versiones antiguas de Unix limitan el nombre del
intérprete y los argumentos a un máximo de 32 caracteres.
Los guiones de Bash a menudo comienzan con #! /bin/bash (asumiendo que Bash ha sido
instalado en '/bin'), puesto que esto asegura que se usará Bash para interpretar el guión, incluso si es
lanzado bajo cualquier otra shell.

Página 41
Capítulo 4: Comandos Internos de la Shell

4.- Comandos Internos de la Shell


Los comandos internos están contenidos dentro de la propia shell. Cuando se usa el nombre de un
comando interno como la primera palabra de un comando único (vea la Sección 3.2.1 [Comandos
Únicos]), la shell ejecuta el comando directamente, sin invocar a ningún otro programa. Los comandos
internos son necesarios para implementar funcionalidades que son imposibles o poco prácticas de
obtener con utilidades separadas.
Esta sección describe resumidamente tanto los comandos internos que Bash hereda de la Shell
Bourne como los comandos internos que son exclusivos o que han sido extendidos en Bash.
Varios comandos internos se describen en otros capítulos: comandos internos que proporcionan la
interfaz de Bash para las características de control de tareas (vea la Sección 7.2 [Comandos Internos
para el Control de Tareas]), la pila de directorios (vea la Sección 6.8.1 [Comandos Internos para la
Pila de Directorios]), la historia de comandos (vea la Sección 9.2 [Comandos Internos para la Historia
de Comandos]) y las características de completado programable (vea la Sección 8.7 [Comandos
Internos para el Completado Programable]).
Muchos de los comandos internos han sido extendido por POSIX o Bash.
A menos que se especifique lo contrario, cada comando interno que se indique que acepta las
opciones precedidas por '-' aceptará '--' para indicar el fin de la lista de opciones. Los comandos
internos :, true, false y test no aceptan opciones y no tratan el '--' de forma especial. Los comandos
internos exit, logout, break, continue, let y shift aceptan y procesan argumentos que comienzan
con '-' sin necesidad del '--'. Otros comandos internos que aceptan argumentos pero que no se
especifica que acepten opciones interpretan los argumentos que comienzan con '-' como una opción
inválida y requieren el uso de '--' para prevenir tal interpretación.

4.1.- Comandos Internos de la Shell Bourne


Esta sección describe los comandos internos que son heredados de la Shell Bourne. Estos comandos se
implementan como se especifica por el estándar POSIX.
: (dos puntos)
:[argumentos]
No hace nada más que expandir los argumentos y realizar las redirecciones. El estado de
retorno es cero.
. (un punto)
.nombre_de_archivo [argumentos]
Lee y ejecuta los comandos del argumento nombre_de_archivo en el contexto actual de la
shell. Si nombre_de_archivo no contiene un barra inclinada, se utiliza la variable PATH
para encontrar a nombre_de_archivo. Cuando Bash no se encuentra en modo POSIX, si el
nombre_de_archivo no se encuentra en $PATH busca en el directorio actual . Si se
suministran argumentos adicionales estos se convierten en parámetros posicionales cuando
se ejecuta nombre_de_archivo. En caso contrario los parámetros posicionales no son
alterados. El estado de retorno es el estado de salida del último comando ejecutado, o cero
si no se ejecutó ningún comando. Si no se encuentra nombre_de_archivo o no se puede
leer, el estado de retorno es distinto de cero. Este comando interno es equivalente a
source.
break
break[n]
Sale de un bucle for, while, until o select. Si se suministra n, se sale del bucle de nivel
n. n debe ser mayor o igual que 1. El estado de retorno es cero a menos que n no sea

Página 42
Capítulo 4: Comandos Internos de la Shell

mayor o igual que 1.


cd
cd [-L|-P] [directorio]
Cambia el directorio de trabajo actual a directorio. Si no se suministra directorio se utiliza
el valor de la variable de la shell HOME . Si existe la variable de shell CDPATH , esta se usa
como una ruta de búsqueda. Si directorio comienza con una barra invertida no se utiliza
CDPATH. La opción '-P' significa que no se deben seguir a los enlaces simbólicos; Los
enlaces simbólicos se siguen por defecto o si se utiliza la opción '-L'. Si el directorio es '-',
esto equivale a $OLDPWD. Si se utiliza un nombre de directorio no vacío procedente de
CDPATH o si '-' es el primer argumento y el cambio de directorio se realiza con éxito, se
escribe en la salida estándar la ruta absoluta del nuevo directorio de trabajo.
El estado de retorno es cero si el cambio de directorio tiene éxito y distinto de cero en
caso contrario.
continue
continue [n]
Reanuda la siguiente iteración de un bucle for, while, until o select. Si se suministra n,
se reanuda la ejecución del bucle de nivel n. n debe ser mayor o igual a 1. El estado de
retorno es cero a menos que n no sea mayor o igual que 1.
eval
eval [argumentos]
Los argumentos se concatenan juntos en un único comando, que luego se lee y ejecuta, y
su estado de salida se devuelve como el estado de salida de eval. Si no hay argumentos o
sólo se proporcionan argumentos vacíos, el estado de retorno es cero.
exec
exec [-cl] [-a nombre] [comando [argumentos]]
Si se suministra comando, este reemplaza la shell sin crear un nuevo proceso. Si se
suministra la opción '-l' la shell pone un guión al comienzo del argumento número 0 que
se pasa al comando. Esto es lo que hace el programa de inicio de sesión. La opción ' -c'
produce que el comando se ejecute en un entorno vacío. Si se suministra ' -a' la shell pasa
el nombre como el argumento 0 del comando. Si no se especifica ningún comando se
pueden usar las redirecciones para afectar al entorno de shell actual. Si no hay errores de
redirección, el estado de retorno es cero; en caso contrario el estado de retorno es distinto
de cero.
exit
exit [n]
Hace que la shell finalice, devolviendo un estado n al padre de la shell. Si se omite n el
estado de salida es el estado de salida del último comando ejecutado. Cualquier trampa en
EXIT se ejecuta antes de que la shell finalice.
export
export [-fn] [-p] [nombre[=valor]]
Marca cada nombre para pasarlo a los procesos hijos en el entorno. Si se suministra la
opción '-f', los nombres se refieren a funciones de shell; en caso contrario los nombres se
refieren a variables de shell. La opción ' -n' significa que se debe dejar de marcar cada
nombre dado para exportar. Si no se suministran nombres o si se pasa la opción '-p', se
muestra una lista de nombres exportados. La opción ' -p' muestra la salida de forma que
puede ser reutilizada como entrada. Si un nombre de variable es seguido por =valor, el

Página 43
Capítulo 4: Comandos Internos de la Shell

valor de la variable se establece en valor.


El estado de retorno es cero a menos que se suministre alguna opción inválida, que alguno
de los nombres no sea un nombre de variable de shell válida o que se proporcione la
opción '-f' con un nombre que no sea una función de shell.
getopts
getopts cadena_de_opciones nombre [args]
getopts se utiliza en los guiones de shell para analizar los parámetros posicionales. La
cadena_de_opciones contiene los caracteres de opción que deben ser reconocidos; si un
carácter es seguido por un signo de dos puntos, se espera que la opción tenga un
argumento, el cual debe estar separado de esta por un espacio. El dos puntos (':') y la
interrogación de cierre ('?') no se pueden usar como caracteres de opción. Cada vez que
se invoca, getopts sitúa la siguiente opción en la variable de shell nombre, inicializando
nombre si este no existe, y el índice al siguiente argumento a ser procesado dentro de la
variable OPTIND . OPTIND se inicializa a 1 cada vez que se invoca a la shell o a un guión
de shell. Cuando una opción requiere un argumento, getopts sitúa ese argumento en la
variable OPTARG . La shell no reinicia OPTIND automáticamente; este se debe reiniciar
manualmente entre las múltiples llamadas a getopts dentro de la misma invocación de
shell si se va a usar un nuevo juego de parámetros.
Cuando se encuentra el final de las opciones, getopts sale con un valor de retorno mayor
que cero. OPTIND se ajusta al índice del primer argumento que no sea una opción y
nombre se ajusta a '?'.
getopts normalmente analiza los parámetros posicionales, pero si se dan más argumentos
en args, getopts analiza estos en su lugar.
getopts puede informar de errores de dos formas. Si el primer carácter de la
cadena_de_opciones es un dos puntos, se utiliza el informe de errores silencioso. En el
modo normal de funcionamiento de la shell se imprimen mensajes de diagnóstico cuando
se encuentran opciones inválidas o faltan argumentos de opción Si la variable OPTERR
está establecida a 0, no se mostraran mensajes de error, incluso si el primer carácter de
cadena_de_opciones no es un dos puntos.
Si se encuentra una opción inválida, getopts sitúa '?' en nombre y, si no es silencioso,
imprime un mensaje de error y OPTARG se anula. Si getopts es silencioso, el carácter
de opción encontrado se sitúa en OPTARG y no se imprime ningún mensaje de
diagnóstico.
Si no se encuentra un argumento obligatorio, y getopts no es silencioso, se sitúa una
marca de interrogación de cierre ('?') en nombre, se elimina OPTARG , y se imprime un
mensaje de diagnóstico. Si getopts es silencioso, entonces se sitúa un dos puntos (':') en
nombre y OPTARG toma al carácter de opción encontrado.
hash
hash [-r] [-p nombre_de_archivo] [-dt] [nombre]
Recuerda las rutas completas de los comandos especificados como argumentos nombre, de
forma que estos no necesitan buscarse en las siguientes invocaciones. Los comandos se
encuentran buscando a través de los directorios listados en $PATH. La opción '-p' inhibe
la búsqueda de rutas, y se utiliza nombre_de_archivo como la localización de nombre. La
opción '-r' produce que la shell olvide todas las localizaciones registradas. La opción ' -d'
produce que la shell olvide las rutas registradas para cada nombre. Si se suministra la

Página 44
Capítulo 4: Comandos Internos de la Shell

opción '-t' se imprime la ruta completa correspondiente a cada nombre. Si se


proporcionan múltiples argumentos nombre con la opción '-t' el nombre se imprime antes
de las rutas completas. La opción ' -l' produce que la salida sea mostrada en un formato
que pueda ser reutilizado como entrada. Si no se dan argumentos o si sólo se suministra
'-l' se imprime la información sobre los comandos registrados. El estado de retorno es
cero a menos que no se encuentre a nombre o se suministre una opción inválida.
pwd
pwd [-LP]
Imprime la ruta absoluta del directorio de trabajo actual. Si se proporciona la opción ' -P'
la ruta imprimida no contendrá enlaces simbólicos. Si se suministra la opción ' -L', la ruta
imprimida puede contener enlaces simbólicos. El estado de retorno es cero a menos que
se encuentre un error mientras se determina el nombre del directorio actual o que se
proporcione una opción inválida.
readonly
readonly [-aApf] [nombre[=valor]] …
Marca cada nombre como de sólo lectura. Los valores de estos nombres no pueden ser
modificados en posteriores asignaciones. Si se proporciona la opción ' -f' los nombres se
refieren a funciones de shell. La opción ' -a' significa que cada nombre se refiere a una
variable de tipo array indexado; la opción '-A' significa que cada nombre se refiere a una
variable de tipo array asociativo. Si no se proporcionan argumentos nombre, o si se
suministra la opción '-p', se imprime la lista de todos los nombres de sólo lectura. La
opción '-p' produce que la salida sea mostrada en un formato que pueda ser reutilizado
como entrada. Si un nombre de variable es seguido por =valor, el valor de la variable es
puesto a valor. El estado de retorno es cero a menos que se proporcione una opción
inválida o que uno de los argumentos nombre no sea un nombre de variable o función de
shell válidos, o que se proporcione la opción ' -f' con un nombre que no es una función de
shell.
return
return [n]
Produce que una función de shell finalice con el valor de retorno n. Si no se suministra n,
el valor de retorno es el estado de salida del último comando ejecutado en la función. Esto
también se puede utilizar para terminar la ejecución de un guión que está siendo ejecutado
con el comando interno . (o source), devolviendo bien n o bien el estado de salida del
último comando ejecutado dentro del guión como estado de salida del guión de comandos.
Cualquier comando asociado con la trampa RETURN se ejecuta antes de que la ejecución
continúe tras la función o el guión de comandos. El estado de retorno es distinto de cero si
return se utiliza fuera de una función y no estamos ejecutando un guión de comandos con
. o source.
shift
shift [n]
Desplaza los parámetros posicionales a la izquierda en n posiciones. Los parámetros
posicionales desde n+1 … $# son renombrados a $1 … $#-n. Los parámetros repre-
sentados por los números $# hasta $# -n+1 se anulan. n debe ser un número no negativo
menor o igual a $#. Si n es cero o mayor que $# , los parámetros posicionales no se
modifican. Si no se proporciona el valor n, se asume que es igual a 1. El estado de retorno
es cero a menos que n sea mayor que $# o menor que cero y cero en caso contrario.

Página 45
Capítulo 4: Comandos Internos de la Shell

test
[
test expr o [ expr ]
Evalúa una expresión condicional expr. Cada operador y operando debe ser un argumento
separado. Las expresiones son composiciones de las expresiones primarias descritas más
abajo en la Sección 6.4 [Expresiones Condicionales de Bash]. test no acepta ninguna
opción y tampoco acepta un argumento '--' como señal del fin de las opciones; en caso de
darse el '--' será ignorado.
Cuando se usa la forma con [ el último argumento que se proporcione al comando debe
ser un ].
Las expresiones pueden combinarse usando los siguientes operadores, listados en orden de
precedencia decreciente. La evaluación depende del número de argumentos; véase más
abajo.
! expr
Devuelve verdadero (true) si expr es falso (false)
( expr )
Devuelve el valor de expr. Esto se puede utilizar para anular la precedencia
normal de los operadores.
expr1 -a expr2
Devuelve verdadero si tanto expr1 como expr2 son verdaderos.
expr1 -o expr2
Devuelve verdadero si expr1 o expr2 son verdaderos.
Los comandos internos test y [ evalúan expresiones condicionales usando un juego de
reglas basado en el número de argumentos.
0 argumentos
La expresión es falsa
1 argumento
La expresión es verdadera si y sólo si el argumento no es nulo.
2 argumentos
Si el primer argumento es '!', la expresión es verdadera si y sólo si el segundo
argumento es nulo. Si el primer argumento es alguno de los operadores
condicionales unarios (vea la Sección 6.4 [Expresiones Condicionales de
Bash]), la expresión es verdadera si el test unario es verdadero. Si el primer
argumento no es un operador unario válido, la expresión es falsa.
3 argumentos
Si el segundo argumento es uno de los operadores condicionales binarios (vea
la Sección 6.4 [Expresiones Condicionales de Bash]), el resultado de la
expresión es el resultado de el test binario usando el primer y el tercer argu-
mento como operandos. Los operadores '-a' y '-o' son considerados opera-
dores binarios cuando hay tres argumentos. Si el primer argumento es '!' el
valor es la negación de el resultado del test usando el segundo y el tercer
argumento. Si el primer argumento es exactamente '(' y el tercer argumento
es exactamente ')', el resultado es el test del segundo argumento. En caso
contrario la expresión es falsa.

Página 46
Capítulo 4: Comandos Internos de la Shell

4 argumentos
Si el primer argumento es '!' el resultado es la negación de la expresión de
tres argumentos compuesta del resto de argumentos. En caso contrario, la
expresión es analizada y evaluada de acuerdo con la precedencia usando las
reglas listadas anteriormente.
5 o más argumentos
La expresión es analizada y evaluada de acuerdo a la precedencia usando las
reglas listadas anteriormente.
times
times
Imprime el tiempo de usuario y de sistema usado por la shell y sus hijos. El estado de
retorno es cero.
trap
trap [-lp] [arg] [sigspec …]
Los comandos en arg son leidos y ejecutados cuando la shell recibe la señal sigspec. Si
arg está ausente (y hay un único sigspec) o es igual a '-', cada disposición de señal
especificada es reiniciada a los valores que tenía cuando la shell fue iniciada. Si arg es la
cadena nula, la señal especificada por cada sigspec es ignorada por la shell y los comandos
que esta invoca. Si arg no está presente y se ha suministrado la opción ' -p', la shell
muestra los comandos de la trampa asociada con cada sigspec. Si no se suministran
argumentos, o sólo se pasa la opción ' -p', trap imprime la lista de comandos asociados
con cada número de señal en un formato que puede ser reutilizado como entrada. La
opción '-l' causa que la shell imprima una lista de nombres de señal y sus
correspondientes números. Cada sigspec es o bien un nombre de señal o un número de
señal. Los nombres de señal son insensibles a mayúsculas y minúsculas y el prefijo SIG es
opcional.
Si un sigspec es 0 o EXIT, el argumento se ejecuta cuando la shell finaliza. Si un sigspec
es DEBUG, se ejecuta el comando arg antes de cada comando individual, para
command, comandos case, comandos select, todos los comandos for aritméticos, y
antes de que se ejecute el primer comando en una función de shell. Le remitimos a la
descripción de la opción extdebug para el comando interno shopt (vea la Sección 4.3.2
[El Comando Interno Shopt]) para obtener los detalles de su efecto en la trampa DEBUG.
Si un sigspec es RETURN el comando arg se ejecuta cada vez que una función de shell o
un guión de comandos ejecutado con los comandos internos . o source finalice su
ejecución.
Si un sigspec es ERR, el comando arg se ejecuta siempre que un comando individual
tenga un estado de salida distinto de cero, sujeto a las siguientes condiciones. La trampa
ERR no se ejecuta si el comando fallido es parte de la lista de comandos inmediatamente
posterior a una palabra clave until o while, es parte del test que sigue a las palabras
reservadas if o elif, es parte de un comando ejecutado en una lista && o || o si el estado
de retorno del comando está siendo invertido usando !. Estas son las mismas condiciones
que sigue la opción errexit.
Las señales ignoradas tras entrar en la shell no pueden ser atrapadas o reiniciadas. Las
señales capturadas que no están siendo ignoradas son reiniciadas a sus valores originales
en una subshell o un entorno de subshell cuando se crea alguno.

Página 47
Capítulo 4: Comandos Internos de la Shell

El estado de retorno es cero a menos que algún sigspec no especifique una señal válida.
umask
umask [-p] [-S] [modo]
Pone la mascara de creación de archivos de los procesos de shell a modo. Si modo
comienza con un dígito, se interpreta como un número octal; si no se interpreta como un
modo de máscara simbólica similar a la aceptada por el comando chmod. Si se omite
modo se imprime el valor actual de la máscara. Si se suministra la opción ' -S' sin un
argumento modo la máscara se imprime en formato simbólico. Si se suministra la opción
'-p' y se omite modo la salida se imprime en un formato que puede ser reutilizado como
entrada. El estado de retorno es cero si el modo se cambió con éxito o si no se suministró
el argumento modo, y distinto de cero en otro caso.
Advierta que cuando modo se interpreta como un número octal, cada número de umask
se resta de 7. Esto es, un valor de umask de 022 otorga los permisos 755.
unset
unset [-fv] [nombre]
Elimina cada variable o función nombre. Si no se suministran opciones o se suministra la
opción '-v' cada nombre se refiere a una variable de shell. Si se da la opción ' -f' los
nombres se refieren a funciones de shell y se elimina la definición de la función. Las
variables y funciones de sólo lectura no pueden ser eliminadas. El estado de retorno es
cero a menos que alguno de los nombres sea de sólo lectura.

4.2.- Comandos Internos de Bash


Esta sección describe los comandos internos que son únicos o han sido extendidos en Bash.
Algunos de estos comandos son especificados en el estandar POSIX.
alias
alias [-p] [nombre[=valor] …]
Sin argumentos o con la opción '-p', alias imprime la lista de alias en la salida estándar
en un formato que permite que sea reutilizado como entrada. Si se suministran
argumentos, se define un alias para cada nombre cuyo valor sea dado. Si no se da ningún
valor, se imprime el nombre y el valor del alias. Los alias se describen en la sección 6.6
[Alias]
bind
bind [-m mapaTeclas] [-lpsvPSV]
bind [-m mapaTeclas] [-q funcion] [-u funcion][-r secTeclas]
bind [-m mapaTeclas] -f nombre_de_archivo
bind [-m mapaTeclas] -x secTeclas:comando-shell
bind [-m mapaTeclas] secTeclas:nombre_funcion
bind comando-Readline
Muestra las asociaciones de teclas y funciones de Readline (vea el Capítulo 8 [Edición de
la Línea de Comandos]), asocia una secuencia de teclas a una función de Readline o a una
macro, o establece una variable de Readline. Cada argumento no opción es un comando
como podría aparecer en un archivo de inicialización de Readline (vea la Sección 8.3
[Archivo de inicialización de Readline]), pero cada asociación o comando debe ser pasado
como un argumento separado; por ejemplo, '“\C-x\C-r”:re-read-init-file'.
Las opciones, si son suministradas, tienen los siguientes significados:

-m mapaTeclas

Página 48
Capítulo 4: Comandos Internos de la Shell

Usa mapaTeclas como el mapa de teclas que será afectado por las siguientes
asociaciones. Los nombres de mapas de teclas aceptados son emacs, emacs-
standard, emacs-meta, emacs-ctls, vi, vi-move, vi-command y vi-insert. vi es
equivalente a vi-command; emacs es equivalente a emacs-standard.
-l Lista los nombres de todas las funciones de Readline
-p Muestra los nombres de las funciones de Readline y las asociaciones de tal
forma que se puedan utilizar como entrada en un archivo de inicialización de
Readline.
-P Muestra la lista actual de nombres de funciones de Readline y de
asociaciones.
-v Muestra los nombres de variables de Readline y sus valores de tal forma que
pueden ser usados como entrada o en un archivo de inicialización de la
Readline.
-V Lista los nombres de las variables actuales de Readline y sus valores.
-s Muestra las secuencias de teclas de Readline enlazadas a macros y las
cadenas que devuelven de tal modo que pueden ser usadas como entrada o en
un archivo de inicialización de Readline.
-S Muestra las secuencias de teclas de Readline asociadas a macros y las
cadenas que estas devuelven.
-f nombre_de_archivo
Lee las asociaciones de teclas a partir de nombre_de_fichero.
-q función
Consulta las teclas que invocan a la función pasada como argumento.
-u función
Desasocia todas las teclas enlazadas con la función
-r secTeclas
Elimina cualquier asociación para secTeclas.
-x secTeclas:comando-shell
Provoca que el comando-shell sea ejecutado cada vez que se introduce
secTeclas. Cuando se ejecuta el comando-shell, la shell pone en la variable
READLINE_LINE el contenido del buffer de Readline y en la variable
READLINE_POINT la localización actual del punto de inserción. Si el
comando ejecutado cambia el valor de READLINE_LINE o
READLINE_POINT, los nuevos valores se verán reflejados en el estado de
edición.
El estado de retorno es cero a menos que se suministre una opción inválida o que ocurra
un error.
builtin
builtin [comando-interno [args]]
Ejecuta un comando interno de la shell, le pasa args y devuelve su estado de salida. Esto

Página 49
Capítulo 4: Comandos Internos de la Shell

es útil cuando se define una función de shell con el mismo nombre que un comando
interno, manteniendo la funcionalidad del comando interno dentro de la función. El estado
de retorno es distinto de cero si el comando comando-interno no es un comando interno de
la shell.
caller
caller [expr]
Devuelve el contexto de cualquier llamada a subrutina activa (una función de shell o un
guión ejecutado con los comandos internos . o source).
Sin expr, caller muestra el número de línea y el nombre de archivo fuente de la llamada a
subrutina actual. Si se suministra un entero no negativo como expr, caller muestra el
número de línea, el nombre de subrutina y el archivo fuente correspondiente a esa
posición de la pila de llamadas de ejecución actual. Esta información extra se puede
utilizar, por ejemplo, para imprimir una traza de la pila. El cuadro actual es el cuadro 0.
El valor de retorno es 0 a menos que la shell no esté ejecutando una llamada a subrutina o
que expr no se corresponda con una posición válida de la pila de llamadas.
command
command [-pVv] comando [argumentos …]
Ejecuta comando con argumentos ignorando cualquier función llamada comando. Sólo se
ejecutan los comandos internos de la shell o los comandos localizados buscando en el
PATH. Si hay una función de shell llamada ls, ejecutar 'command ls' dentro de la
función ejecutará el comando externo ls en vez de llamar a la función recursivamente. La
opción '-p' significa que se debe usar el valor por defecto de PATH, el cual garantiza
encontrar todas las utilidades estándares. El estado de retorno en este caso es 127 si no se
puede encontrar el comando u ocurre algún error y el estado de salida de comando en otro
caso.
Si se suministra la opción '-v' o la opción '-V', se imprime una descripción de comando.
La opción '-v' produce que se muestre una única palabra indicando el comando o nombre
de archivo usado para invocar a comando; la opción '-V' produce una descripción más
detallada. En este caso, el estado de retorno es cero si se encuentra a comando, y distinto
de cero si no.
declare
declare [-aAfFilrtux] [-p] [nombre[=valor] …]
Declara variables y les da atributos. Si no se proporciona ningún nombre, se muestran los
valores de las variables.
La opción '-p' mostrará los atributos y los valores de cada nombre. Cuando se usa ' -p'
con argumentos nombre, se ignoran las opciones adicionales.
Cuando se suministra '-p' sin argumentos nombre, declare mostrará los atributos y
valores de todas las variables que tengan los atributos especificados por las opciones
adicionales. Si no se suministran más opciones con '-p', declare mostrará los atributos y
valores de todas las variables de shell. La opción '-f' restringirá los datos mostrados a las
funciones de shell.
La opción '-F' impide que se muestren las definiciones de función; sólo se imprimen el
nombre de la función y sus atributos. Si la opción de shell extdebug está activada usando
shopt (vea la Sección 4.3.2 [El Comando Interno Shopt]), también se mostrará el
nombre del archivo fuente y el número de línea donde se define la función. ' -F' implica a

Página 50
Capítulo 4: Comandos Internos de la Shell

'-f'. Las siguientes opciones se pueden usar para restringir la salida a las variables con los
atributos especificados o para dar atributos a las variables.
-a Cada nombre es una variable de tipo array indexado (vea la Sección 6.7
[Arrays])
-A Cada nombre es una variable de tipo array asociativo (vea la Sección 6.7
[Arrays]).
-f Usa sólo nombres de función.
-i La variable se trata como un entero; se realiza una evaluación aritmética
(vea la Sección 6.5 [Aritmética de la Shell]) cuando se asigna un valor a
la variable.
-l Cuando se asigna un valor a la variable, todos los caracteres mayúsculas
son convertidos a minúsculas. Se desactiva el atributo mayúsculas
(upper-case).
-r Convierte los nombres en de sólo lectura. A estos nombres no se les
puede asignar valores en sentencias de asignación posteriores ni se puede
eliminar su declaración.
-t Le da a cada nombre el atributo trace. Las funciones rastreadas heredan
las trampas DEBUG y RETURN de la shell que realizó la llamada. El
atributo trace no tiene un significado especial para las variables.
-u Cuando se asigna un valor a la variable, todos los caracteres minúsculas
son convertidos a mayúsculas. Se desactiva el atributo minúsculas (lower-
case).
-x Marca cada nombre para ser exportado a los comandos siguientes
mediante el entorno.
Usando '+' en vez de '-' se desactiva el atributo en vez de ser activado, con las excep-
ciones de que no se puede utilizar ' +a' para destruir variables de tipo array y ' +r' no
eliminará el atributo de sólo lectura. Cuando se usa en una función, declare hace que
cada nombre sea local a la función, como con el comando local. Si un nombre de variable
es seguido por =valor, el valor de la variable se pone a valor.
El estado de retorno es cero a menos que se encuentre una opción inválida, se intente
definir una función usando '-f foo=bar', se intente asignar un valor a una variable de
sólo lectura, se intente asignar un valor a una variable de tipo array sin usar la sintaxis de
asignación compuesta (vea la Sección 6.7 [Arrays]), alguno de los nombres no sea un
nombre de variable de shell válido, se intente desactivar el estado readonly (sólo lectura)
para una variable de sólo lectura, se intente desactivar el estado de array para una variable
de tipo array, o se intente mostrar una función inexistente con '-f'.
echo
echo [-neE] [arg …]
Devuelve los args separados por espacios y terminados con una nueva línea. El estado de
retorno es siempre 0. Si se especifica la opción ' -n' se eliminan los caracteres de
nueva_línea marginales. Si se da la opción '-e' se activa la interpretación de los caracteres
escapados por barras invertidas. La opción de shell xpg_echo se puede utilizar para

Página 51
Capítulo 4: Comandos Internos de la Shell

determinar dinámicamente cuando un echo expande estas cadenas de caracteres por


defecto o no. echo no interpreta '--' como el fin de las opciones.
echo interpreta las siguientes secuencias de escape:

\a alerta (campana)
\b retroceso
\c suprime el resto de la salida
\e escape
\f salto de página
\n nueva línea
\r retorno del carro
\t tabulación horizontal
\v tabulación vertical
\\ barra invertida
\0nnn El carácter de ocho bits cuyo valor es el valor octal nnn (cero a 3 dígitos
octales)
\xHH el carácter de ocho bits cuyo valor es el valor hexadecimal HH.
enable
enable [-a] [-dnps] [-f nombre_de_archivo] [nombre …]
Activa y desactiva los comandos internos de la shell. Desactivar un comando interno
permite ejecutar un comando en disco que tenga el mismo nombre que un comando
interno de la shell sin necesidad de especificar una ruta completa, incluso aunque la shell
normalmente busca los comandos internos antes que los comandos en disco. Si se usa ' -n'
los nombres son desactivados. En caso contrario los nombres son activados. Por ejemplo,
para usar el binario test encontrado mediante $PATH en vez del comando interno
correspondiente, escriba 'enable -n test'.
Si se suministra la opción '-p' o no aparecen argumentos nombre, se imprime una lista de
los comandos internos de shell. Sin ningún otro argumento, la lista consiste en todos los
comandos internos activados. La opción '-a' significa listar cada comando interno con una
indicación de si está activado o no.
La opción '-f' significa cargar el nuevo comando interno nombre desde el objeto
compartido nombre_de_archivo, en sistemas que permiten la carga dinámica. La opción ' -
d' borrará un comando interno cargado con '-f'.
Si no hay opciones se muestra una lista de todos los comandos internos. La opción ' -s'
restringe el estado activo a los comandos internos especiales POSIX. Si se usa ' -s' con '-
f' el nuevo comando interno pasa a ser un comando interno especial (vea la Sección 4.4
[Comandos Internos Especiales]).
El estado de retorno es cero a menos que nombre no sea un comando interno o que haya
un error en la carga de un nuevo comando interno desde un objeto compartido.

Página 52
Capítulo 4: Comandos Internos de la Shell

help
help [-dms] [patrón]
Muestra información útil acerca de los comandos internos. Si se especifica patrón help da
información detallada de todos los comandos que concuerdan con el patrón, de otro modo
imprime una lista de comandos internos.
Las opciones, si son suministradas, tienen los siguientes significados:
-d Muestra una descripción corta de cada patrón
-m Muestra la descripción de cada patrón en un formato similar al de las páginas
de man.
-s Muestra sólo un corto resumen de uso para cada patrón.
El estado de retorno es cero a no ser que ningún comando concuerde con patrón.
let
let expresión [expresión]
El comando interno let permite realizar operaciones aritméticas en las variables de shell.
Cada expresión se evalúa de acuerdo con las reglas dadas más abajo, en la Sección 6.5
[Aritmética de la Shell] Si la última expresion se evalúa a 0, let devuelve 1; en caso
contrario devuelve 0.
local
local [opción] nombre[=valor] ...
Para cada argumento se crea una variable local llamada nombre y se le asigna valor. La
opción puede ser cualquiera de las opciones aceptadas por declare. local sólo puede
utilizarse dentro de una función; esto hace que la variable nombre tenga un ámbito de
visión restringido a la función y a sus hijos. El estado de retorno es cero a menos que
local se utilice fuera de una función, que el nombre suministrado sea inválido o que
nombre sea una variable de sólo lectura.
logout
logout [n]
Finaliza un shell de inicio de sesión devolviendo un estado igual a n al padre de la shell.
mapfile
mapfile [-n cantidad] [-O origen] [-s cantidad] [-t] [-u fd]
[-C llamada_de_retorno] [-c salto] [array]
Lee líneas desde la entrada estándar hacia la variable de tipo array indexado array, o desde
el descriptor de fichero fd si se suministra la opción -u. La variable MAPFILE es el array
por defecto. Las opciones, si son suministradas, tienen los siguientes significados:
-n Copia hasta un máximo de cantidad líneas. Si cantidad es 0, se copian todas
las líneas.
-O Comienza asignando a array a partir del índice origen. El índice por defecto
es 0.
-s Descarta las primeras cantidad líneas leídas.
-t Elimina un carácter marginal nueva_línea para cada línea leída.
-u Lee líneas desde el descriptor fd en vez de la entrada estándar.
-C Evalúa la llamada_de_retorno cada vez que se leen el número de líneas dadas

Página 53
Capítulo 4: Comandos Internos de la Shell

por salto. La opción -c especifica el valor del salto.


-c Especifica el número de líneas leídas entre cada llamada a
llamada_de_retorno.

Si se especifica '-C' sin '-c' el salto por defecto es de 5000. Cuando se evalúa
llamada_de_retorno, esta suministra el índice del siguiente elemento del array para ser
asignado como un argumento adicional. La llamada_de_retorno se evalúa después de leer
la línea pero antes de que se asigne el elemento del array.
Si no se suministra con un origen explícito, mapfile limpiará el array antes de asignarle
valores.
mapfile retorna con éxito a menos que se le pase una opción inválida o un argumento de
opción inválido, que el array sea inválido o no asignable o que el array no sea de tipo
indexado.
print f
printf [-v var] formato [argumentos]
Escribe los argumentos formateados en la salida estándar bajo el control de formato. El
formato es una cadena de caracteres que contiene tres tipos de objetos: caracteres planos,
los cuales son simplemente copiados a la salida estándar, secuencias de caracteres de
escape, las cuales son convertidas y copiadas a la salida estándar, y especificaciones de
formato, cada una de las cuales produce la impresión del siguiente argumento sucesivo.
Adicionalmente a los formatos estándar de printf(1), ' %b ' produce que print f expanda las
secuencias de barras invertidas en el correspondiente argumento, (excepto el '\c' que
finaliza la salida, las barras invertidas en '\'', '\”' y '\?' no son eliminadas, y los dígitos
en octal escapados comenzando con '\0' pueden contener hasta cuatro dígitos), y ' %q '
produce que print f imprima la salida correspondiente a argumento en un formato que
pueda ser reutilizado como entrada de la shell.
La opción '-v' produce que la salida sea asignada a la variable var en vez de que sea
imprimida en la salida estándar.
El formato se reutiliza tantas veces como sea necesario para consumir todos los
argumentos. Si el formato requiere más argumentos de los que se suministran, las
especificaciones de formato adicionales se comportan como si se les hubiera suministrado
un argumento de valor cero o de cadena nula, lo que sea apropiado.
read
read [-ers] [-a anombre] [-d delim] [-i texto] [-n ncarac]
[-N carac] [-p prompt] [-t temporizador] [-u fd] [nombre
…]
Se lee una línea de la entrada estándar o desde el descriptor de fichero fd suministrado
como argumento a la opción -u y la primera palabra se asigna al primer nombre, la
segunda palabra al segundo nombre, y así de forma sucesiva, con el resto de palabras y sus
separadores intermedios asignadas al último nombre. Si hay pocas palabras leídas desde el
flujo de entrada, los nombres restantes son asignados a valores vacíos. Se utilizan los
caracteres en el valor de la variable IFS para separar la línea en palabras. El carácter barra
invertida '\' se puede utilizar para eliminar cualquier significado especial en el siguiente
carácter leído y para continuar la línea. Si no se suministran nombres la línea leída se
asigna a la variable REPLY . El código devuelto es cero a menos que se encuentre el
final_de_fichero, la lectura expire (en cuyo caso el código devuelto es mayor que 128), o

Página 54
Capítulo 4: Comandos Internos de la Shell

se suministre un descriptor de fichero inválido como argumento para '-u'.


Las opciones, si son suministradas, tienen los siguientes significados:
-a anombre
Se asignan las palabras a índices secuenciales de la variable de tipo array
anombre, empezando por 0. Se eliminan todos los elementos de anombre
antes de la asignación. El resto de argumentos nombre son ignorados.
-d delim
Se utiliza el primer carácter de delim para terminar la línea de entrada en
lugar de la nueva_línea.
-e Se utiliza Readline para obtener la línea (vea el Capítulo 8 [Edición de la
Línea de Comandos]). Readline usa los ajustes de edición actuales (o los
ajustes por defecto, si la edición no fue activada previamente).
-i texto
Si se está utilizando Readline para leer la línea, se sitúa texto dentro del
buffer de edición antes de que la edición comience.
-n ncarac
read retorna tras leer ncarac caracteres en vez de esperar a leer una línea
completa de la entrada, pero si encuentra un delimitador regresa aunque se
hayan leído menos de ncarac caracteres antes del delimitador.
-N ncarac
read retorna tras leer exactamente ncarac caracteres en vez de esperar por
una línea completa de entrada, a menos que se encuentre EOF o el tiempo
expire. Los caracteres delimitadores encontrados en la entrada no son
tratados de forma especial y no provocan que read regrese hasta que se leen
ncarac caracteres.
-p prompt
Muestra prompt sin una nueva_línea marginal, antes de intentar leer
cualquier entrada. El prompt se muestra sólo si la entrada proviene de una
terminal.
-r Si se da esta opción, la barra invertida no actúa como un carácter de escape.
La barra invertida se considera parte de la línea. En particular, no se puede
utilizar un par barra invertida-nueva_línea como continuación de línea.
-s Modo silencioso. Si la entrada proviene de un terminal, los caracteres
introducidos no son mostrados.
-t temporizador
Provoca que read expire y devuelva un fallo si no se ha completado la
lectura de una línea antes de temporizador segundos. temporizador puede ser
un número decimal con una parte fraccionaria siguiendo al punto decimal.
Esta opción sólo es efectiva si read está leyendo la entrada desde un
terminal, una tubería o un archivo especial; no tiene efecto cuando está
leyendo de archivos regulares. Si temporizador es 0, read retorna con éxito si

Página 55
Capítulo 4: Comandos Internos de la Shell

la entrada está disponible en el descriptor de fichero especificado, y falla en


caso contrario. El estado de salida es mayor que 128 si se excede a
temporizador.
-u fd lee la entrada desde el descriptor de archivo fd.
readarray
readarray [-n cantidad] [-O origen] [-s cantidad] [-t] [-u
fd] [-C llamada_de_retorno] [-c salto] [array]
Lee líneas desde la entrada estándar y las introducen en la variable de tipo array indexado
array, o desde el descriptor de fichero fd si se suministra la opción '-u'
Es un sinónimo para mapfile.
source
source filename
Un sinonimo para . (vea la Seccion 4.1 [Comandos Internos de la Shell Bourne]).
type
type [-afptP] [nombre …]
Para cada nombre, indica cómo se debe interpretar este si se utiliza como un nombre de
comando.
Si se usa la opción '-t', type imprime una única palabra que es una de las siguientes:
'alias', 'function', 'builtin', 'file' o 'keyword', si nombre es un alias, una función de shell, un
comando interno de la shell, un archivo del disco, o una palabra reservada de la shell
respectivamente. Si no se encuentra nombre entonces no se imprime nada y type
devuelve un estado de error.
Si se usa la opción '-p', type devuelve o el nombre del archivo de disco que se ejecutaría
si se especificara nombre o nada si la opción '-t' no devolviera 'file'.
La opción '-P' fuerza una búsqueda de ruta para cada nombre, incluso si la opción '-t' no
devolviera 'file'.
Si un comando está en la tabla hash '-p' y '-P' imprimen el valor de la tabla, no nece-
sariamente el archivo que aparece primero en $PATH.
Si se utiliza la opción '-a' type devuelve todos los lugares que contienen un ejecutable
llamado nombre. Esto incluye alias y funciones, si y sólo si no se usa también la opción ' -
p'
Si se usa la opción '-f', type no intenta encontrar las funciones de shell, como con el
comando interno builtin.
El estado de retorno es cero si se encuentran todos los nombres y distinto de cero si
alguno de ellos no se encuentra.
typeset
typeset [-afFrxi] [-p] [nombre[=valor] …]
El comando typeset se suministra por compatibilidad con la shell Korn; sin embargo, ha
sido despreciado en favor del comando interno declare.
ulimit
ulimit [-abcdefilmnpqrstuvxHST] [límite]
ulimit proporciona control sobre los recursos disponibles por los procesos iniciados por la
shell, en sistemas que permiten dicho control. Si se da una opción esta es interpretada
como sigue:

Página 56
Capítulo 4: Comandos Internos de la Shell

-S Carga e informa de los límites blandos asociados con un recurso.


-H Carga e informa de los límites duros asociados con un recurso.
-a Se informa de todos los límites actuales.
-b El tamaño máximo del buffer socket
-c El tamaño máximo de los archivos de volcado de memoria (cores) creados.
-d El tamaño máximo del segmento de datos de un proceso.
-e La prioridad máxima de planificación (“nice”).
-f El tamaño máximo de los archivos escritos por la shell y sus hijos.
-i El número máximo de señales pendientes
-l El tamaño máximo que puede ser bloqueado en memoria.
-m El tamaño máximo del conjunto residente (muchos sistemas no obedecen a
este límite).
-n El número máximo de descriptores de fichero abiertos (muchos sistemas no
permiten establecer este valor).
-p El tamaño del buffer de tuberías.
-q El número máximo de bytes en las colas de mensajes POSIX.
-r La prioridad máxima de planificación de tiempo real.
-s El tamaño máximo de la pila.
-t La cantidad máxima de tiempo de cpu en segundos
-u El número máximo de procesos disponibles para un único usuario.
-v La cantidad máxima de memoria virtual disponible para el proceso.
-x El número máximo de archivos bloqueados.
-T El número máximo de hebras.
Si se da límite este es el nuevo valor del recurso especificado; Se pueden usar los valores
de límites especiales hard, soft y unlimited para índicar los valores actuales del límite duro,
del límite blando y sin límite respectivamente. Un límite duro no puede ser incrementado
por un usuario no-root una vez que está establecido; un límite blando puede ser
incrementado hasta el valor del límite duro. De otro modo, se imprime el valor actual del
límite blando para el recurso especificado, a menos que se suministre la opción ' -H'.
Cuando establecemos nuevos límites, si no se suministra la opción ' -H' ni la opción '-S',
se establece tanto el límite duro como el límite blando. Si no se da ninguna opción,
entonces se asume la opción ' -f'. Los valores se dan en incrementos de 1024-bytes
excepto con la opción '-t' para la cual se dan en segundos, ' -p para la cual se dan en
bloques de 512-bytes y para '-n' y '-u' que usan valores sin escala.
El estado de retorno es cero a menos que se de una opción o un argumento inválidos, o
que ocurra algún error mientras se establece el nuevo límite.

Página 57
Capítulo 4: Comandos Internos de la Shell

unalias
unalias [-a] [nombre …]
Elimina cada nombre de la lista de alias. Si se suministra '-a' se eliminan todos los alias.
Los alias se describen en la Sección 6.6 [Alias].

4.3.- Modificando el Comportamiento de la Shell.


4.3.1.- El comando Interno Set
Este comando interno es tan complicado que se merece su propia sección. set le permite cambiar los
valores de las opciones de la shell y establecer parámetros posicionales, o mostrar los nombres y los
valores de las variables de la shell.
set
set [--abefhkmnptuvxBCEHPT] [-o opción] [argumento …]
set [+abefhkmnptuvxBCEHPT] [+o opción] [argumento …]
Si no se pasan opciones o argumentos, set muestra los nombres y valores de todas las
variables y funciones de la shell, ordenadas de acuerdo a la localización actual, en un
formato que puede ser reutilizado como entrada para establecer o reiniciar las variables
establecidas actualmente. Las variables de sólo lectura no pueden ser reiniciadas. En
modo POSIX, sólo se listan las variables de shell.
Cuando se suministran opciones, estas establecen o quitan atributos de la shell. Las
opciones, si se especifican, tienen los significados siguientes:

-a Marca las variables y funciones que están modificadas o creadas para


exportar al entorno de los siguientes comandos.
-b Produce que se reporte inmediatamente el estado de terminación de las
tareas en segundo plano, en vez de antes de imprimir el siguiente prompt
primario.
-e Sale inmediatamente si una tubería (vea la Sección 3.2.2 [Tuberías]), que
puede consistir en un único comando simple (vea la Sección 3.2.1
[Comandos Simples]), un comando de subshell encerrado entre paréntesis
(vea la Sección 3.2.4.3 [Agrupación de Comandos]) o uno de los comandos
ejecutados como parte de una lista de comandos encerrados entre llaves (vea
la Sección 3.2.4.3 [Agrupación de Comandos]) devuelve un estado distinto
de cero. La shell no sale si el comando que falla es parte de una lista de
comandos inmediatamente posterior a una palabra clave while o until,
parte de una comprobación en una sentencia if, parte de cualquier comando
ejecutado en una lista && o || excepto el comando que sigue al último && o
||, cualquier comando en una tubería menos el último, o si el estado de
retorno del comando está siendo invertido con !. Si está establecida una
trampa sobre ERR, esta se ejecuta antes de que la shell finalice.
Esta opción se aplica al entorno de la shell y a cada entorno de subshell
aisladamente (vea la Sección 3.7.3 [Entorno de Ejecución de Comandos]), y
puede causar que las subshells finalicen antes de ejecutar todos los
comandos.
-f Desactiva la expansión de nombres de fichero (globalmente).
-h Localiza y recuerda (mediante una tabla hash) los comandos después de que

Página 58
Capítulo 4: Comandos Internos de la Shell

sean buscados para ejecutarlos. Esta opción está activada por defecto.
-k Todos los argumentos en forma de sentencias de asignación se sitúan en el
entorno para un comando, no sólo aquellos que preceden al nombre del
comando.
-m Activa el control de tareas (vea el Capítulo 7 [Tareas de Control]).
-n Lee comandos pero no los ejecuta; esto se puede usar para comprobar un
guión de comandos en busca de errores sintácticos. Esta opción es ignorada
por las shells interactivas.
-o nombre-opción
Establece la opción correspondiente a nombre-opción:
allexport como -a.
braceexpand como -B.
emacs Utiliza un interfaz de edición de líneas al estilo emacs (vea
el Capítulo 8 [Edición de la Línea de Comandos]). Esto
también afecta al interfaz de edición usado por read -e.
errexit como -e.
errtrace como -E.
functrace como -T.
hashall como -h.
histexpand como -H.
history Activa la historia de comandos, como se describe en la
Sección 9.1 [Características de Historia de Bash]. Esta
opción está activada por defecto en las shells interactivas.
ignoreeof Una shell interactiva no saldrá tras leer un EOF.
keyword como -k.
monitor como -m.
noclobber como -C.
noexec como -n.
noglob como -f.
nolog Actualmente es ignorado.
notify como -b.
nounset como -u.
onecmd como -t.
physical como -P.
pipefail Si está establecido, el valor de retorno de una tubería es el
valor del último comando (el situado más a la derecha) que

Página 59
Capítulo 4: Comandos Internos de la Shell

finaliza con un estado distinto de cero, o cero si todos los


comandos en la tubería finalizan con éxito. Esta opción
está desactivada por defecto.
posix Cambia el comportamiento de Bash en las operaciones que
por defecto difieren del estándar POSIX para ajustarse al
estándar (vea la Sección 6.11 [El Modo POSIX de Bash]).
Esto se hace con la intención de hacer que Bash llegue a
ser un superconjunto estricto de ese estándar.
privileged como -p.
verbose como -v.
vi Utiliza una interfaz de edición de líneas al estilo vi. Esto
también afecta a la interfaz de edición usada con read -e.
xtrace como -x.
-p Activa el modo privilegiado. En este modo, los archivos $BASH_ENV y
$ENV no son procesados, las funciones de la shell no son heredadas desde el
entorno, y las variables SHELLOPTS , BASHOPTS , CDPATH y
GLOBIGNORE , si estas aparecen en el entorno, son ignoradas. Si la shell es
iniciada con el id de usuario (grupo) efectivo distinto al id de usuario (grupo)
real, y no se suministra la opción -p, se toman estas acciones y el id de
usuario efectivo es ajustado al valor del id de usuario real. Si la opción -p se
suministra al inicio, no se restablece el id de usuario efectivo. Desactivar esta
opción produce que los ids de usuario y de grupo efectivos sean ajustados a
los ids de usuario y grupo reales.
-t Finaliza después de leer y ejecutar un comando.
-u Cuando se realiza la expansión de parámetros trata las variables y parámetros
no definidos distintos de los parámetros especiales '@' o '*' como un error.
Se escribirá un mensaje de error en la salida de error estándar, y una shell
no-interactiva finalizará.
-v Imprime las líneas de entrada de la shell tal cómo son leídas.
-x Imprime una traza de los comandos simples, los comandos for, los
comandos select y los comandos aritméticos for y sus argumentos o listas
de palabras asociadas después de que estos sean expandidos y antes de que
sean ejecutados. Se expande el valor de la variable PS4 y el valor resultante
se imprime delante del comando y sus argumentos expandidos.
-B La shell realizará expansión de llaves (vea la Sección 3.5.1 [Expansión de
llaves]). Esta opción está activa por defecto.
-C Evita que la redirección de salida usando '>', '>&' y '<>' sobreescriba
archivos existentes.
-E Si está establecida, cualquier trampa en ERR es heredada por las funciones
de la shell, las sustituciones de comandos, y los comandos ejecutados en un
entorno de subshell. La trampa ERR normalmente no es heredada en tales

Página 60
Capítulo 4: Comandos Internos de la Shell

casos.
-H Activa la sustitución de la historia estilo '!' (vea la Sección 9.3
[Interaccionando con la Historia]). Esta opción está activada por defecto en
las shells interactivas.
-P Si está establecida, no sigue los enlaces simbólicos cuando ejecuta comandos
como cd el cual cambia el directorio actual. En su lugar se utiliza el
directorio físico. Por defecto Bash sigue la cadena lógica de directorios
cuando realiza comandos que cambian el directorio actual.
Por ejemplo si '/usr/sys' es un enlace simbólico a '/usr/local/sys' entonces:
$ cd /usr/sys; echo $PWD
/usr/sys
$ cd ..; pwd
/usr
Si set -P está activado:
$ cd /usr/sys; echo $PWD
/usr/local/sys
$ cd ..; pwd
/usr/local
-T Si está establecida, cualquier trampa en DEBUG y RETURN es heredada por
las funciones de shell, la sustitución de comandos y los comandos ejecutados
en un entorno de subshell. Las trampas DEBUG y RETURN normalmente no
son heredadas en tales casos.
-- Si ningún argumento sigue a esta opción, entonces se quitan los parámetros
posicionales. En caso contrario, los parámetros posicionales se asignan a los
argumentos incluso si alguno de ellos comienza con un '-'.
- Indica el final de las opciones, produce que todos los argumentos restantes
sean asignados a los parámetros posicionales. Las opciones ' -x' y '-v' son
desactivadas. Si no hay argumentos, los parámetros posicionales permanecen
sin cambios.
Usar '+' en vez de '-' produce que las opciones sean desactivadas. Las opciones también se
pueden usar en la invocación de la shell. Se puede encontrar el conjunto de opciones
actuales en $-.
Los N argumentos restantes son parámetros posicionales y se asignan, en orden, a $1 , $2 ,
…, $N . Al parámetro especial # se le asigna el valor N.
El estado de retorno es siempre cero a menos que se suministre alguna opción inválida.

4.3.2.- El Comando Interno Shopt


Este comando interno le permite cambiar un comportamiento adicional opcional de la shell.
shopt
shopt [-pqsu] [-o] [nombreopt …]
Conmuta los valores de las variables que controlan el comportamiento opcional de la shell.
Sin opciones o con la opción '-p' muestra una lista de todas las opciones que permiten ser
ajustadas, con una indicación de cuales están establecidas y cuales no. La opción ' -p'

Página 61
Capítulo 4: Comandos Internos de la Shell

produce que la salida sea mostrada en un formato que permite ser reutilizado como
entrada. El resto de opciones tienen los siguientes significados:
-s Activa cada nombreopt.
-u Desactiva cada nombreopt.
-q Elimina la salida normal; el estado de retorno indica si el nombreopt está
activado o desactivado. Si se dan múltiples argumentos nombreopt con '-q',
el estado de retorno es cero si todos los nombreopt están activados y distinto
de cero en caso contrario.
-o Restringe los valores de nombreopt a aquellos definidos para la opción ' -o'
para el comando interno set (vea la Sección 4.3.1 [El Comando Interno
Set]).
Si se utilizan las opciones '-s' o '-u' sin argumentos nombreopt, se muestran únicamente
aquellas opciones que están establecidas o no, respectivamente.
A menos que se avise de lo contrario, las opciones de shopt están desactivadas por
defecto.
El estado de retorno cuando se listan opciones es cero si todos los nombres_de_opción
están activados y distinto de cero en caso contrario. Cuando se establecen o borran
opciones, el estado de retorno es cero a menos que un nombreopt no sea una opción de
shell válida.
La lista de opciones de shopt es:
autocd
Si está establecida, se ejecuta un nombre de comando que coincida con el
nombre de un directorio como si fuera el argumento para el comando cd. Esta
opción sólo se usa en las shells interactivas.
cdable_vars
Si esta opción está establecida, se asume que un argumento para el comando
interno cd que no es un directorio es el nombre de una variable cuyo valor es
el directorio al que cambiar.
cdspell
Si está establecida, se corregirán pequeños errores en el deletreo de un
componente de directorio para el comando cd. Los errores que se buscan son
permutaciones de caracteres, caracteres perdidos y un carácter en exceso. Si
se encuentra una corrección se imprime la ruta correcta y el comando se
ejecuta. Esta opción sólo se usa en shells interactivas.
checkhash
Si está establecida, Bash chequea que un comando encontrado en la tabla hash
exista antes de intentar ejecutarlo. Si un comando de dicha tabla ahora no
existe se realiza una búsqueda de ruta de la forma habitual.
checkjobs
Si está establecida, Bash lista el estado de cualquier tarea detenida o en eje-
cución antes de terminar una shell interactiva. Si existen tareas en ejecución la
salida se retrasa hasta que se intenta una segunda salida sin que intervenga un

Página 62
Capítulo 4: Comandos Internos de la Shell

comando (vea el Capítulo 7 [Control de Tareas]). La shell siempre retrasa la


salida si existen tareas detenidas.
checkwinsize
Si está establecida, Bash comprueba el tamaño de ventana después de cada
comando y, si es necesario, actualiza el valor de LINES (líneas) y COLUMNS
(columnas).
cmdhist
Si está establecida, Bash intenta guardar todas las líneas de un comando
multilínea en la misma entrada de la historia. Esto permite reeditar fácilmente
los comandos multilínea.
compat31
Si está activada, Bash cambia su comportamiento con respecto a los
argumentos entrecomillados para el operador de comandos condicionales '=~'
al de la versión 3.1.
dirspell
Si está establecida, Bash intenta correcciones en el deletreo de los nombres de
directorio durante el completado de palabras si el nombre de directorio
suministrado inicialmente no existe.
dotglob
Si está establecida Bash incluye los nombres de archivo que comienzan con un
'.' en los resultados de la expansión de nombres de archivo.
execfail
Si esta opción está establecida, una shell no interactiva no finalizará si no
puede ejecutar el archivo especificado como argumento al comando interno
exec. Una shell interactiva no finaliza si exec falla.
expand_aliases
Si está establecida, los alias se expanden como se describe más abajo, en la
Sección 6.6 [Alias]). Esta opción está activada por defecto para las shells
interactivas.
extdebug
Si está establecida, se activa el comportamiento previsto para usar con depu-
radores:
1. La opción '-F' pasada al comando interno declare (vea la Sección 4.2
[Comandos Internos de Bash]) muestra el nombre del archivo fuente y
el número de línea correspondiente a cada nombre de función
suministrada como un argumento.
2. Si el comando ejecutado por la trampa DEBUG devuelve un valor
distinto de cero, el siguiente comando se ignora y no se ejecuta.
3. Si el comando ejecutado por la trampa DEBUG devuelve un valor de 2 y
la shell está ejecutando una subrutina (una función de shell o un guión
de comandos ejecutado mediante los comandos internos . o source), se
simula una llamada a return.
4. Se actualizan las variables BASH_ARGC y BASH_ARGV como se
describe en sus correspondientes descripciones (vea la Sección 5.2

Página 63
Capítulo 4: Comandos Internos de la Shell

[Variables de Bash]).
5. Se activa la traza de funciones: la sustitución de comandos, las funciones
de shell y las subshells invocadas con ( comando ) heredan las trampas
DEBUG y RETURN.
6. Se activa la traza de errores: la sustitución de comandos, las funciones
de shell y las subshells invocadas con ( comando ) heredan la trampa
ERROR.
extglob
Si está establecida, se activan las características de concordancia de patrones
extendidos (vea la Sección 3.5.8.1 [Concordancia de Patrones]).
extquote
Si está establecida, el entrecomillado $'cadena' y $”cadena” se realiza
dentro de las expansiones de ${parámetro} encerradas entre dobles comillas.
Esta opción está activada por defecto.
failglob
Si está establecida, los patrones que fallan al ajustar nombres de archivo
durante la expansión de nombres de archivo resultan en un error de expansión.
force-fignore
Si está establecida, los sufijos especificados por la variable de shell FIGNORE
producen que las palabras sean ignoradas cuando se realiza el completado de
palabras, incluso si las palabras ignoradas son los únicos resultados posibles
del completado. Vea la Sección 5.2 [Variables de Bash] para obtener una
descripción de FIGNORE. Esta opción está activada por defecto.
globstar
Si está establecida, el patrón '**' usado en un contexto de expansión de
nombres de fichero concordará con los ficheros y cero o más directorios y
subdirectorios. Si el patrón es seguido por una '/', sólo concordarán los
directorios y subdirectorios.
gnu_errfmt
Si está establecida, los mensajes de error de la shell se escribirán en el formato
de mensajes de error estándar de GNU.
histappend
Si está establecida, cuando la shell finaliza, la lista de historia se anexa al
archivo cuyo nombre se da en el valor de la variables HISTFILE en vez de
sobreescribir el archivo.
histreedit
Si está establecida, y se está utilizando Readline, el usuario tendrá la
oportunidad de reeditar una sustitución de la historia fallida.
histverify
Si está establecida, y se está usando Readline, los resultados de la sustitución
de la historia no son pasados inmediatamente al analizador de la shell. En vez
de eso, la línea resultante se carga en el buffer de edición de líneas leídas,
permitiendo su posterior modificación.
hostcomplete
Si está establecida, y se está usando Readline, Bash intentará realizar el

Página 64
Capítulo 4: Comandos Internos de la Shell

completado de los nombres de anfitrión cuando se esté completando una


palabra que contenga un '@' (vea la Sección 8.4.6 [Comandos para
completado]). Esta opción está activada por defecto.
huponexit
Si está establecida, Bash enviará SIGHUP a todas las tareas cuando una shell
de inicio de sesión interactivo finalice (vea la Sección 3.7.6 [Señales]).
interactive_comments
Permite que una palabra que comience con '#' provoque que esa palabra y
todas las que le sigan en la misma línea sean ignoradas en una shell interac-
tiva. Esta opción está activada por defecto.
lithist
Si está activada, y la opción cmdhist también está activada, los comandos de
líneas múltiples se guardan en la historia con las nuevas líneas embebidas en
vez de usar operadores punto y coma, cuando esto sea posible.
login_shell
La shell establece esta opción si es iniciada como una shell de inicio de sesión
(vea la Sección 6.1 [Invocando Bash]). Su valor no se puede cambiar.
mailwarn
Si está establecida, y un archivo que Bash está comprobando en busca de
correo ha sido accedido desde la última vez que se buscó, se muestra el
mensaje “The mail in mailfile has been read” (el correo en el archivo ha sido
leido).
no_empty_cmd_completion
Si está establecida, y se está usando Readline, Bash no intentará buscar en el
PATH los valores de completados posibles cuando se intenta completar en una
línea vacía.
nocaseglob
Si está establecida, Bash realiza la expansión de los nombres de archivo de
forma que no diferencia entre mayúsculas y minúsculas.
nocasematch
Si está establecida, Bash ajusta los patrones de forma que no diferencia entre
mayúsculas y minúsculas cuando busca las concordancias durante la ejecución
de los comandos condicionales case o [[.
nullglob
Si está establecida, Bash permite a los patrones de nombre de archivo que no
concuerdan con ningún fichero expandirse a la cadena nula en vez de
permanecer como ellos mismos.
progcomp
Si está establecida, las características de completado programable (vea la
Sección 8.6 [Completado Programable] estarán activadas. Esta opción está
activada por defecto.
promptvars
Si está establecida, las cadenas de prompt sufren expansión de parámetros,
sustitución de comandos, expansión aritmética y eliminación de entrecomi-

Página 65
Capítulo 4: Comandos Internos de la Shell

llado tras ser expandidas como se describe más abajo (vea la Sección 6.9
[Imprimiendo un prompt]). Esta opción está activada por defecto.
restricted_shell
La shell establece esta opción si es iniciada en modo restringido (vea la
Sección 6.10 [La Shell Restringida]). Su valor no se puede cambiar. Este no
es reiniciado cuando se ejecutan los archivos de inicio, permitiendo a los
archivos de inicio descubrir si la shell está restringida o no.
shift_verbose
Si está establecida, el comando interno shift imprime un mensaje de error
cuando el contador de desplazamientos excede el número de parámetros
posicionales.
sourcepath
Si está establecida, el comando interno source usa los valores del PATH para
encontrar el directorio que contiene el archivo suministrado como argumento.
Esta opción está activada por defecto.
xpg_echo
Si está establecida, el comando interno echo expandirá por defecto las
secuencias escapadas por una barra inclinada.
El estado de retorno cuando se listan opciones es cero si todos los nombres_de_opción
están activados y distinto de cero en otro caso. Cuando se establecen o quitan opciones, el
estado de retorno es cero a menos que un nombreopt no sea una opción de shell válida.

4.4.- Comandos Internos Especiales


Por razones históricas, el estándar POSIX ha clasificado varios comandos internos como especiales.
Cuando Bash se está ejecutando en modo POSIX, los comandos internos especiales se diferencian del
resto de comandos en tres aspectos:
1. Los comandos especiales se encuentran antes que las funciones de shell durante la búsqueda de
comandos.
2. Si un comando interno especial devuelve un estado de error, una shell no interactiva se cerrará.
3. Las sentencias de asignación que precedan al comando permanecen en efecto en el entorno de
la shell después de que el comando finalice.
Cuando Bash no se está ejecutando en modo POSIX, estos comandos internos no se comportan
de forma diferente al resto de comandos internos de Bash. El modo POSIX de Bash se describe en la
Sección 6.11 [Modo POSIX de Bash].
Estos son los comandos internos especiales de POSIX:
break : . continue eval exec exit export readonly return set shift trap unset

Página 66
Capítulo 5: Variables de la shell

5.- Variables de Shell


Este capítulo describe las variables de shell que son usadas por Bash. Bash asigna automáticamente
valores por defecto a algunas variables.

5.1.- Variables de la Shell Bourne


Bash utiliza ciertas variables de la shell del mismo modo que la shell Bourne. En algunos casos Bash
asigna un valor por defecto a las variables.
CDPATH
Una lista de directorios separados por dos puntos (':') utilizada como ruta de búsqueda
para el comando interno cd.
HOME
El directorio de usuario actual; el valor por defecto para el comando interno cd. El valor
de esta variable también se utiliza para la expansión de tildes (vea la Sección 3.5.2
[Expansión de Tildes]).
IFS
Una lista de caracteres que separan campos; se utiliza cuando la shell separa las palabras
que forman parte de una expansión.
MAIL
Si este parámetro está establecido a un nombre de archivo y la variable MAILPATH no
está establecida, Bash informa al usuario de la llegada de un correo en el archivo
especificado.
MAILPATH
Es una lista de nombres de archivo separados por dos puntos (':') los cuales son
comprobados periódicamente por la shell en busca de nuevos correos. Cada entrada de la
lista puede especificar el mensaje que se imprime cuando llega un correo al archivo de
correo separando el nombre de archivo del mensaje mediante un '?'. Cuando se utiliza en
el texto del mensaje, $_ se expande al nombre del archivo de correo actual.
OPTARG
El valor del último argumento de opción procesado por el comando interno getopts.
OPTIND
El índice del último argumento de opción procesado por el comando interno getopts.
PATH
Una lista de directorios separados por dos puntos (':') en los cuales la shell busca los
comandos. Un nombre de directorio de longitud cero (nulo) en el valor de PATH indica el
directorio actual. Un nombre de directorio nulo puede aparecer como dos signos ':'
adyacentes o como un signo dos puntos al inicio o al final.
PS1
La cadena de prompt primaria. El valor por defecto es '\s-\v\$ '. Vea la Sección 6.9
[Imprimiendo un Prompt], para una lista completa de las secuencias de escape que se
expanden antes de que se muestre PS1.
PS2
La cadena de prompt secundaria. El valor por defecto es '>'.

Página 67
Capítulo 5: Variables de la shell

5.2.- Variables de Bash


Estas variables son establecidas o usadas por Bash, pero otras shell normalmente no las tratan de
forma especial.
Algunas variables de Bash están descritas en otros capítulos: variables para controlar las
características de control de tareas (vea la Sección 7.3 [Variables de Control de Tareas]).
BASH
La ruta completa usada para ejecutar la instancia actual de Bash.
BASHOPTS
Una lista de opciones de shell activas separadas por un ':'. Cada palabra en la lista es un
argumento válido para la opción '-s' del comando interno shopt (vea la Sección 4.3.2 [El
Comando Interno Shopt]). Las opciones que aparecen en BASHOPTS son las que shopt
muestra como activas ('on'). Si esta variable está en el entorno cuando Bash comienza,
cada opción de la shell en la lista se activará antes de leer cualquier archivo de inicio. Esta
variable es de sólo lectura.
BASHPID
Expande al id de proceso del proceso Bash actual. Este difiere de $$ bajo ciertas
condiciones, como en aquellas subshells que no requieren que Bash sea reinicializado.
BASH_ALIASES
Una variable de tipo array asociativo cuyos miembros se corresponden con la lista interna
de alias tal como es mantenida por el comando interno alias (vea la Sección 4.1
[Comandos Internos de Shell]). Los elementos añadidos a este array aparecen en la lista
de alias; quitar elementos del array produce que sean eliminados de la lista de alias.
BASH_ARGC
Una variable de tipo array cuyos valores son el número de parámetros en cada marco de la
pilla de llamadas de ejecución actual de Bash. El número de parámetros de la subrutina
actual (para funciones de shell o guiones de comandos ejecutados con . o source) está en
la cima de la pila. Cuando se ejecuta una subrutina, el número de parámetros pasado se
empuja dentro de BASH_ARGC . La shell establece BASH_ARGC sólo cuando se
encuentra en el modo de depuración extendido (vea la Sección 4.3.2 [El Comando Interno
Shopt] para obtener una descripción de la opción extdebug del comando interno
shopt).
BASH_ARGV
Una variable de tipo array que contiene todos los parámetros en la pila de llamadas de
ejecución actual de Bash. El parámetro final de la última subrutina llamada se encuentra
en la cima de la pila; el primer parámetro de la llamada inicial está en el fondo. Cuando se
ejecuta una subrutina, los parámetros suministrados son empujados dentro de
BASH_ARGV. La shell establece BASH_ARGV sólo cuando se ejecuta en el modo de
depuración extendido. (vea la Sección 4.3.2 [El Comando Interno Shopt] para obtener una
descripción de la opción extdebug del comando interno shopt).
BASH_CMDS
Una variable de tipo asociativo cuyos miembros se corresponden con la tabla hash interna
de comandos tal como es mantenida por el comando interno hash (vea la Sección 4.1
[Comandos Internos de la Shell Bourne]). Los elementos añadidos a este array aparecen
en la tabla hash; quitar elementos de este array produce que los comandos sean removidos
de la tabla hash.

Página 68
Capítulo 5: Variables de la shell

BASH_COMMAND
El comando que está siendo ejecutado actualmente o está a punto de ser ejecutado, a
menos que la shell esté ejecutando un comando como resultado de una trampa, en cuyo
caso este es el comando que se ejecutaba en el momento de la trampa.
BASH_ENV
Si esta variable está establecida cuando se invoca a Bash para ejecutar un guión de
comandos, su valor se expande y se usa como el nombre del fichero de inicio que debe ser
leído antes de ejecutar el guión. Vea la Sección 6.2 [Archivos de Inicio de Bash].
BASH_EXECUTION_STRING
El argumento del comando para la opción de invocación '-c'.
BASH_LINENO
Una variable de tipo array cuyos miembros son los números de línea en los archivos fuente
correspondientes a cada miembro de FUNCNAME . ${BASH_LINENO[$i]} es el número
de línea en el archivo fuente donde se llamó a ${FUNCNAME[$i]} (o $
{BASH_LINENO[$i-1]} si es referenciado dentro de otra función de shell). El nombre de
archivo correspondiente es ${BASH_SOURCE[$i]} . Use LINENO para obtener el número
de línea actual.
BASH_REMATCH
Una variable de tipo array cuyos miembros son asignados por el operador binario '=~'
para el comando condicional [[ (vea la Sección 3.2.4.2 [Construcciones Condicionales]).
El elemento con índice 0 es la porción de la cadena que concuerda con toda la expresión
regular. El elemento con índice n es la porción de la cadena que concuerda con la n- ésima
subexpresión parentizada. Esta variable es de sólo lectura.
BASH_SOURCE
Una variable de tipo array cuyos miembros son los nombres de archivo correspondientes a
los elementos en la variable de tipo array FUNCNAME .
BASH_SUBSHELL
Es incrementado en una unidad cada vez que se genera una subshell o un entorno de
subshell. El valor inicial es 0.
BASH_VERSINFO
Una variable de sólo lectura de tipo array (vea la Sección 6.7 [Arrays]) cuyos miembros
mantienen la información de versión para esta instancia de Bash. Los valores son
asignados a los miembros del array como sigue:
BASH_VERSINFO[0]
El número de versión mayor (la distribución).
BASH_VERSINFO[1]
El número de versión menor (la versión).
BASH_VERSINFO[2]
El nivel de parcheado
BASH_VERSINFO[3]
La versión de construcción.
BASH_VERSINFO[4]
El estado de la distribución (p.e., beta1).

Página 69
Capítulo 5: Variables de la shell

BASH_VERSINFO[5]
El valor de MACHTYPE.
BASH_VERSION
El número de versión de la instancia actual de Bash.
BASH_XTRACEFD
Si está establecido a un entero que corresponde con un descriptor de archivo válido, Bash
escribirá la salida de traza generada cuando ' set -x' está activo a ese descriptor de fichero.
Esto permite que la salida de traza sea aislada para mensajes de diagnóstico y de error. El
descriptor de fichero se cierra cuando BASH_XTRACEFD está inactivo o se le asigna un
nuevo valor. Quitar BASH_XTRACEFD o asignarle la cadena vacía produce que la salida
de traza sea enviada a la salida de error estándar. Advierta que ajustar
BASH_XTRACEFD a 2 (el descriptor de fichero de la salida de error estándar) y luego
quitarlo provocará que se cierre la salida de error estándar.
COLUMNS
Usado por el comando interno select para determinar la anchura del terminal cuando
imprime listas de selección. Se establece automáticamente con la recepción de un
SIGWINCH .
COMP_CWORD
Un índice en ${COMP_WORDS} de la palabra que contiene la posición actual del cursor.
Esta variable está disponible sólo en funciones de shell invocadas por las características de
completado programable (vea la Sección 8.6 [Completado Programable]).
COMP_LINE
La línea de comandos actual. Esta variable está disponible sólo en funciones de shell y en
comandos externos invocados por las características de completado programable (vea la
Sección 8.6 [Completado Programable]).
COMP_POINT
El índice de la posición actual del cursor relativa al comienzo del comando actual. Si la
posición actual del cursor es al final del comando actual, el valor de esta variable es igual a
${#COMP_LINE} . Esta variable está disponible sólo en funciones de shell y en comandos
externos invocados por las características de completado programable (vea la Sección 8.6
[Completado Programable]).
COMP_TYPE
Se establece a un valor entero que corresponde al tipo de completado que se ha intentado
y que causó la llamada a una función de completado: TAB para completado normal, '?'
para listas completados tras los sucesivos tabs, '!' para listar alternativas en el completado
parcial de palabras, '@' para listar completados si la palabra no se ha modificado, o ' %'
para completado de menú. Esta variable está disponible sólo en funciones de shell y en
comandos externos invocados por las características de completado programable (vea la
Sección 8.6 [Completado Programable])
COMP_KEY
La llave (o llave final o una secuencia de llaves) usada para invocar la función de
completado actual.
COMP_WORDBREAKS
El juego de caracteres que la librería Readline trata como separadores de palabras cuando
realiza el completado de palabras. Si se elimina COMP_WORDBREAKS , esta pierde sus

Página 70
Capítulo 5: Variables de la shell

propiedades especiales, incluso si es restablecida posteriormente.


COMP_WORDS
Una variable de tipo array consistente en las palabras individuales contenidas en la línea
de comandos actual. La línea es dividida en palabras como lo haría Readline, usando
COMP_WORDBREAKS como se describe más arriba. Esta variable está disponible
únicamente en las funciones de shell invocadas por las características de completado
programable (vea la Sección 8.6 [Completado Programable]).
COMPREPLY
Una variable de tipo array desde la cual Bash lee los posibles completados generados por
una función de shell invocada por las características de completado programable (vea la
Sección 8.6 [Completado Programable]).
DIRSTACK
Una variable de tipo array que almacena los contenidos actuales de la pila de directorios.
Los directorios aparecen en la pila en el orden que son mostrados por el comando interno
dirs. Se pueden modificar los directorios contenidos actualmente en la pila asignando
valores a los miembros de esta variable de tipo array, pero se deben utilizar los comandos
internos pushd y popd para añadir y eliminar directorios. Asignar valores a esta variable
no modificará el directorio actual. Si se elimina DIRSTACK , esta pierde sus propiedades
especiales, incluso si es restablecida posteriormente.
EMACS
Si Bash encuentra esta variable en el entorno cuando la shell se inicia con el valor 't', este
asume que la shell se está ejecutando en un buffer de shell emacs y desactiva la edición de
líneas.
EUID
El número de id de usuario efectivo del usuario actual. Esta variable es de sólo lectura.
FCEDIT
El editor usado por defecto por la opción '-e' para el comando interno fc.
FIGNORE
Es una lista, cuyos miembros están separados por dos puntos, de sufijos a los que ignorar
cuando se realiza el completado de nombres de fichero. Un nombre de fichero cuyo sufijo
concuerda con una de las entradas de FIGNORE es excluida de la lista de nombres de
archivo concordantes. Por ejemplo, podría valer '.o:~ '
FUNCNAME
Una variable de tipo array que contiene los nombres de todas las funciones de shell que
están actualmente en la pila de llamadas de ejecución. El elemento con índice 0 es el
nombre de cualquier función de shell que esté actualmente en ejecución. El elemento más
en el fondo es “main”. Esta variable existe sólo cuando se está ejecutando una función de
shell. Las asignaciones a FUNCNAME no tienen efectos y devuelven un estado de error. Si
se elimina FUNCNAME , esta pierde sus propiedades especiales, incluso si es restablecida
posteriormente.
GLOBIGNORE
Una lista de patrones separados por dos puntos que definen el juego de nombres de fichero
que deben ser ignorados por la expansión de nombres de fichero. Si un nombre de fichero
concuerda con un patrón de expansión de nombres de fichero y también concuerda con

Página 71
Capítulo 5: Variables de la shell

uno de los patrones en GLOBIGNORE , este es eliminado de la lista de concordancias.


GROUPS
Una variable de tipo array que contiene la lista de grupos de los que forma parte el usuario
actual. Asignar valores a GROUPS no tiene ningún efecto y devuelve un estado de error.
Si se elimina GROUPS esta pierde sus propiedades especiales, incluso si se restaura
posteriormente.
histchars
Hasta tres caracteres que controlan la expansión de la historia, la sustitución rápida y la
tokenización (vea la Sección 9.3 [Interacción con la Historia]). El primer carácter es el
carácter de expansión de la historia, esto es, el carácter que significa el comienzo de una
expansión de la historia, normalmente '!'. El segundo carácter es el carácter que significa
'sustitución rápida' cuando se encuentra como el primer carácter de una línea,
normalmente es '^'. El tercer carácter es opcional e indica que el resto de la línea es un
comentario cuando se encuentra como el primer carácter de una palabra, normalmente es
'#'. El carácter de comentario de la historia provoca que se evite la sustitución de la
historia para el resto de las palabras de la línea. Este no produce necesariamente que el
analizador de la shell trate el resto de la línea como un comentario.
HISTCMD
El número de historia, o el índice en la lista de historia, del comando actual. Si se elimina
HISTCMD esta pierde sus propiedades especiales, incluso si es restablecida
posteriormente.
HISTCONTROL
Una lista de valores separados por dos puntos que controlan cómo se guardan los
comandos en la lista de historia. Si la lista de valores incluye ' ignorespace', las líneas que
comienzan un carácter espacio no se guardan en la lista de historia. Un valor de
'ignoredups' produce que las líneas que encajan con las entradas previas de la historia no
se guarden. Un valor de 'ignoreboth' es una forma corta para 'ignorespace' e 'ignoredups'.
Un valor de 'erasedups' produce que todas las líneas previas que encajan con la línea
actual sean eliminadas de la lista de historia antes de que esa línea sea guardada.
Cualquier valor que no esté entre los anteriores es ignorado. Si se elimina
HISTCONTROL , o este no incluye un valor válido, todas las líneas leídas por el analizador
de la shell son guardadas en la lista de historia, teniendo en cuenta el valor de
HISTIGNORE .
La segunda línea y las posteriores de un comando compuesto multilínea no son
comprobadas y son añadidas a la historia sin tener en cuenta el valor de HISTCONTROL .
HISTFILE
El nombre del archivo en el que se guarda la historia de comandos. El valor por defecto es
'~ /.bash_history'
HISTFILESIZE
El número máximo de líneas contenidas en el archivo de historia. Cuando se asigna un
valor a esta variable se recorta el archivo de historia, si es necesario, eliminando las
entradas más antiguas, para que no contenga más que el número de líneas dado. También
se recorta el archivo de historia a este tamaño después de escribir en él cuando una shell
interactiva finaliza. El valor por defecto es 500.

Página 72
Capítulo 5: Variables de la shell

HISTIGNORE
Una lista de patrones separados por dos puntos usada para decidir qué líneas de comandos
deben ser guardados en la lista de historia. Cada patrón es anclado al principio de la línea
y debe encajar con la línea completa (no se añade ' *' al final). Cada patrón se comprueba
con la línea después de que se realicen las comprobaciones especificadas por
HISTCONTROL . Adicionalmente a los caracteres de ajuste de patrones normales de la
shell, el carácter '&' concuerda con la línea de historia previa. El '&' puede ser escapado
usando una barra invertida; la barra invertida se elimina antes de intentar un ajuste. No se
comprueba la segunda y sucesivas líneas de un comando compuesto multilínea, y son
añadidas a la historia sin importar el valor de HISTIGNORE .
HISTIGNORE incluye la función de HISTCONTROL . Un patrón '&' es idéntico a
ignoresdups, y un patrón '[]*' es idéntico a ignorespace. Combinando estos dos patrones,
separados por un dos puntos, obtenemos la funcionalidad de ignoreboth.
HISTSIZE
El número máximo de comandos que deben ser mantenidos en la lista de historia. El valor
por defecto es 500.
HISTTIMEFORMAT
Si esta variable está establecida y no es nula, su valor se usa como una cadena de formato
para strftime para imprimir la marca de tiempo asociada con cada entrada de la historia
mostrada por el comando interno history. Si esta variable está establecida, las marcas de
tiempo se escriben al archivo de historia de forma que pueden ser mantenidas a través de
las sesiones de la shell. Esta usa el carácter de comentario de la historia para distinguir las
marcas de tiempo del resto de líneas de la historia.
HOSTFILE
Contiene el nombre de un fichero en el mismo formato que '/etc/hosts' que debería ser
leído cuando la shell necesite completar un nombre de anfitrión (host). La lista de posibles
completados de nombres de anfitrión puede ser modificada durante la ejecución de la
shell; la siguiente vez que se intente el completado de nombres de anfitrión después de que
el valor de esta variable haya cambiado, Bash añadirá el contenido del nuevo archivo a la
lista existente. Si HOSTFILE está establecido pero no tiene valor, o este no se corresponde
con un fichero legible, Bash intentará leer '/etc/hosts' para obtener la lista de posibles
completados de nombres de anfitrión. Cuando se elimina la variable HOSTFILE , se limpia
la lista de nombres de anfitrión.
HOSTNAME
El nombre del anfitrión (host) actual.
HOSTTYPE
Una cadena que describe la máquina en la que se está ejecutando Bash.
IGNOREEOF
Controla la acción de la shell a la recepción de un carácter EOF (fin de fichero) cómo
única entrada. Si está establecido, el valor indica el número de caracteres EOF
consecutivos que pueden ser leídos como el primer carácter de una entrada antes de que la
shell finalice. Si la variable existe pero no tiene un valor numérico (o simplemente no tiene
valor) entonces el valor por defecto es 10. Si la variable no existe, entonces EOF significa
el fin de la entrada para la shell. Esta variable sólo tiene efecto para las shells interactivas.

Página 73
Capítulo 5: Variables de la shell

INPUTRC
El nombre del archivo de inicialización de Readline, sobreescribiendo el valor por defecto
'~/.inputrc'
LANG
Se utiliza para determinar la categoría de localización para cualquier categoría no
seleccionada específicamente con una variable cuyo nombre comience con LC_ .
LC_ALL
Esta variable sobreescribe el valor de LANG y cualquier otra variable LC_ especificando
una categoría de localización.
LC_COLLATE
Esta variable determina el orden de clasificación empleado cuando se ordenan los
resultados de una expansión de nombre de fichero, y determina el comportamiento de las
expresiones de rango, las clases de equivalencia, y las secuencias de clasificación dentro de
una expansión de nombres de archivo y concordancia de patrones (vea la Sección 3.5.8
[Expansión de Nombres de Fichero]).
LC_CTYPE
Esta variable determina la interpretación de caracteres y el comportamiento de las clases
de caracteres dentro de una expansión de nombres de fichero y concordancia de patrones
(vea la Sección 3.5.8 [Expansión de nombres de Fichero]).
LC_MESSAGES
Esta variable determina la localización usada para traducir las cadenas entre comillas
dobles precedidas por un '$' (vea la Sección 3.1.2.5 [Traducción de Localización]).
LC_NUMERIC
Esta variable determina la categoría de localización usada para el formateado numérico.
LINENO
El número de línea en el guión de comandos o en la función de shell que se está eje-
cutando actualmente.
LINES
Usada por el comando interno select para determinar la longitud de columna para
imprimir listas de selección. Se establece automáticamente tras recibir una señal
SIGWINCH .
MACHTYPE
Una cadena que describe completamente el tipo de sistema en el que se está ejecutando
Bash, en el formato estándar de GNU cpu-company-system.
MAILCHECK
Con cuanta frecuencia (en segundos) la shell debería buscar correo en los archivos
especificados en las variables MAILPATH o MAIL . El valor por defecto es 60 segundos.
Cuando llega el momento de comprobar el correo, la shell lo hace antes de mostrar el
prompt primario. Si esta variable se quita o se ajusta a un valor que no es un número
mayor o igual que cero, la shell desactiva la comprobación del correo.
OLDPWD
Es el directorio de trabajo previo como se establece por el comando interno cd.
OPTERR
Si se establece al valor 1, Bash muestra los mensajes de error generados por el comando

Página 74
Capítulo 5: Variables de la shell

interno getopts.
OSTYPE
Una cadena que describe el sistema operativo en el que se está ejecutando Bash.
PIPESTATUS
Una variable de tipo array (vea la Sección 6.7 [Arrays]) que contiene una lista de valores
de estados de salida de los procesos en la tubería más recientemente ejecutada en primer
plano (la cual puede contener sólo un único comando).
POSIXLY_CORRECT
Si esta variable está en el entorno cuando Bash comienza, la shell entra en el modo POSIX
(vea la Sección 6.11 [El Modo POSIX de Bash]) antes de leer los archivos de inicio, como
si se hubiese suministrado la opción de invocación ' --posix'. Si es establecida mientras
la shell está en ejecución, Bash activa el modo POSIX, como si se hubiese ejecutado el
comando set -o posix
PPID
El ID de proceso del proceso padre de la shell. Esta variable es de sólo lectura.
PROMPT_COMMAND
Si está establecida, su valor es interpretado como un comando a ejecutar antes de
imprimir cada prompt primario ($PS1 ).
PROMPT_DIRTRIM
Si está establecido en un número mayor que cero, su valor se usa como el número de
componentes de rastreo de directorio a mantener cuando se expanden las cadenas de
escape de prompt \w y \W (vea la Sección 6.9 [Imprimiendo un Prompt]). Los caracteres
eliminados son reemplazados con una elipsis '..'
PS3
El valor de esta variable se utiliza como el prompt para el comando select. Si esta
variable no está establecida, se utiliza como prompt para el comando select el '#?'.
PS4
Este valor es el prompt que se imprime antes de imprimir la línea de comandos cuando la
opción '-x' está establecida (vea la Sección 4.3.1 [El Comando Interno Set]). El primer
carácter de PS4 se replica varias veces, tantas como sea necesario, para indicar múltiples
niveles de indirección. El valor por defecto es '+'.
PWD
El directorio de trabajo actual como se establece por el comando interno cd.
RANDOM
Cada vez que se referencia a este parámetro se genera un entero aleatorio entre 0 y 32767.
Un valor asignado a esta variable se utiliza como semilla para el generador de números
aleatorios.
REPLY
La variable por defecto para el comando interno read.
SECONDS
Esta variable se expande al número de segundos transcurridos desde que se inició la shell.
Asignar un valor a esta variable reinicia la cuenta al valor asignado, y el valor expandido se
convierte en el valor asignado más el número de segundos desde la asignación.

Página 75
Capítulo 5: Variables de la shell

SHELL
La ruta completa a la shell se guarda en esta variable del entorno. Si no está establecida
cuando la shell comienza, Bash le asigna la ruta completa de la shell de inicio de sesión del
usuario.
SHELLOPTS
Una lista separada por dos puntos de opciones de shell que están activas. Cada palabra en
la lista es un argumento válido para la opción ' -o' del comando interno set (vea la
Sección 4.3.1 [El Comando Interno Set]). Las opciones que aparecen en SHELLOPTS
son aquellas que se muestran como activas ('on') por el comando 'set -o'. Si esta variable
está en el entorno cuando Bash se inicia, cada opción de la shell incluida en la lista se
activará antes de leer cualquier fichero de inicio. Esta variable es de sólo lectura.
SHLVL
Es incrementada en una unidad cada vez que se inicia una nueva instancia de Bash. Esto
es útil para contar cómo de profundo se anidan sus shells de Bash.
TIMEFORMAT
El valor de este parámetro se utiliza como una cadena de formato especificando cómo se
debería mostrar la información de temporización para las tuberías prefijadas con la
palabra reservada time. El carácter '%' introduce una secuencia de escape que es
expandida a un valor de tiempo o a alguna otra información. Las secuencias de escape y
sus significados son como siguen; los corchetes denotan partes opcionales.
%% Un literal '%'
%[p][l]R El tiempo transcurrido en segundos
%[p][l]U El número de segundos de CPU gastados en el modo de usuario.
%[p][l]S El número de segundos de CPU gastados en el modo de sistema.
%P El porcentaje de CPU, calculado como (%U + %S) / %R
La p opcional es un dígito que especifica la precisión, el número de dígitos fraccionarios
tras un punto decimal. Un valor igual a 0 produce que no se imprima la parte decimal. Se
pueden especificar como mucho tres lugares tras el punto decimal; valores de p mayores
que 3 se cambian a 3. Si no se especifica p se utiliza el valor 3.
La l opcional especifica un formato largo, incluyendo minutos, de la forma MmmSS.FFs.
El valor de p determina cuando o cuando no se utilizan la parte fraccionaria.
Si esta variable no está establecida, Bash actua como si tuviera el valor
$'\nreal\t%3lR\nuser\t%3lU\nsys\t%3lS'
Si el valor es nulo, no se muestra información de temporización. Se añade un carácter
nueva línea al margen cuando se muestra la cadena de formato.
TMOUT
Si está establecido a un valor mayor que cero, TMOUT se trata como el temporizador por
defecto del comando interno read (vea la Sección 4.2 [Comandos Internos de Bash]). El
comando select (vea la Sección 3.2.4.2 [Construcciones Condicionales]) termina si la
entrada no llega después de transcurrir TMOUT segundos cuando la entrada viene desde
una terminal.
En una shell interactiva, el valor se interpreta como el número de segundos a esperar por

Página 76
Capítulo 5: Variables de la shell

una entrada tras mostrar el prompt primario. Bash termina tras transcurrir este número de
segundos si no se recibe la entrada.
TMPDIR
Si está establecida, Bash utiliza este valor como el nombre de un directorio en el cual Bash
crea los archivos temporales de los usuarios de la shell.
UID
El valor numérico del id de usuario real del usuario actual. Esta variable es de sólo lectura.

Página 77
Capítulo 6: Características de Bash

6.- Características de Bash


Esta sección describe las características únicas de Bash.

6.1.- Invocando a Bash


bash [opt-larg] [-ir] [-abefhkmnptuvxdBCDHP] [-o opción] [-O
opción_corta] [argumento …]
bash [opt-larg] [-abefhkmnptuvxdBCDHP] [-o opción] [-O opción_corta]
-c cadena [argumento …]
bash [opt-larg] -s [-abefhkmnptuvxdBCDHP] [-o opción] [-O
opción_corta] [argumento …]
Adicionalmente a las opciones de línea de comandos de shell de un único carácter (vea la Sección
4.3.1 [El Comando Interno Set]), hay varias opciones multicarácter que puede usar. Estas opciones
deben aparecer en la línea de comandos antes de las opciones de un único carácter para que puedan
ser reconocidas.
--debugger
ordena que se ejecute el perfíl de depuración antes de que la shell se inicie. Activa el
modo de depuración extendido (vea la Sección 4.3.2 [El Comando Interno Shopt] para
una descripción de la opción extdebug para el comando interno shopt) y el traceado de
las funciones de shell (vea la Sección 4.3.1 [El Comando Interno Set] para una
descripción de la opción -o functrace )
--dump-po-strings
Se imprime una lista de cadenas encerradas entre comillas dobles precedidas cada una de
ellas por '$' en la salida estándar en el formato de archivo de GNU get text PO (objeto
portable). Equivale a '-D' excepto por el formato de salida.
--dump-strings
Equivale a '-D'
--help
Muestra un mensaje de uso en la salida estándar y sale con éxito.
--init-file nombre_de_archivo
--rcfile nombre_de_archivo
Ejecuta los comandos contenidos en nombre_de_archivo (en vez de '~/.bashrc') en una
shell interactiva.
--login
Equivale a '-l'.
--noediting
No usa la librería Readline de GNU (vea el capítulo 8 [Edición de la Línea de
Comandos]) para leer líneas de comandos en las shell interactivas.
--noprofile
No carga el archivo de inicio de sistema '/etc/profile' ni cualquier otro fichero de
inicialización personal '~/.bash_profile', '~/.bash_login', o '~/.profile' cuando se invoca a la
shell como una shell de inicio de sesión.
--norc
No lee el archivo de inicialización '~/.bashrc' en una shell interactiva. Esta opción está
activa por defecto si la shell se invoca con sh.

Página 78
Capítulo 6: Características de Bash

--posix
Cambia el comportamiento de Bash cuando las operaciones por defecto difieren del
estándar POSIX para que se ajuste al estándar. Esto tiene como objetivo hacer que Bash
se comporte como un superconjunto estricto de ese estándar. Vea la Sección 6.11 [El
Modo POSIX de Bash] para una descripción del modo POSIX de Bash.
--restricted
Hace la shell una shell restringida (vea la Sección 6.10 [La Shell Restringida]).
--verbose
Equivalente a '-v'. Imprime líneas de entrada de shell conforme son leídas.
--version
Muestra información de versión para esta instancia de Bash en la salida estándar y sale
con éxito.
Hay varias opciones de un único carácter que se pueden suministrar en la invocación y que no
están disponibles con el comando interno set.
-c cadena
Lee y ejecuta comandos desde cadena tras procesar las opciones y luego
finaliza. Cualquier argumento adicional se asigna a los parámetros
posicionales, comenzando con $0 .
-i Fuerza a la shell a ejecutarse de forma interactiva. Las shells interactivas se
describen en la Sección 6.3 [Shells Interactivas].
-l Hace que la shell actúe como si hubiese sido invocada directamente por el
inicio de sesión. Cuando la shell es interactiva, esto equivale a comenzar una
shell de inicio de sesión con 'exec -l bash'. Cuando la shell no es
interactiva, se ejecutarán los archivos de inicio de la shell de inicio de sesión.
'exec bash -l' o 'exec bash –login' reemplazará a la shell actual
con una shell de inicio de sesión de Bash. Vea la Sección 6.2 [Archivos de
Inicio de Bash], para una descripción del comportamiento especial de una
shell de inicio de sesión.
-r Hace la shell de tipo restringido (vea la Sección 6.10 [La Shell Restringida]).
-s Si esta opción está presente, o si no quedan argumentos tras el procesado de
las opciones, se leen los comandos desde la entrada estándar. Esta opción
permite que se establezcan parámetros posicionales cuando se invoca una
shell interactiva.
-D Se imprime una lista de cadenas entre comillas dobles precedidas cada una
de ellas por '$' en la salida estándar. Estas son cadenas que están sujetas a
traducción de lenguaje cuando la localización actual no es C o POSIX (vea la
Sección 3.1.2.5 [Traducción de Localizaciónes] , Esto implica la opción ' -n';
no se ejecutará ningún comando.
[-+][opcion_shopt]
La opcion_shopt es una de las opciones de shell aceptadas por el comando
interno shopt (vea la Sección 4.3.2 [El Comando Interno Shopt]). Si
opción_shopt está presente, '-O' establece el valor de dicha opción; ' +O' la

Página 79
Capítulo 6: Características de Bash

elimina. Si no se suministra opción_shopt, se imprimen en la salida estándar


los nombres y valores de las opciones aceptadas por shopt . Si la opción de
invocación es '+O' la salida se muestra en un formato que puede ser
reutilizado como entrada.
-- Un -- indica el final de las opciones y desactiva el posterior procesado de
opciones. Los argumentos tras el -- se tratan como nombres de fichero y
argumentos.
Una shell de inicio de sesión es aquella cuyo primer carácter o argumento cero es '-', o aquella
invocada con la opción '--login'.
Una shell interactiva es aquella iniciada sin argumentos que no sean opciones, a menos que se
especifique '-s', sin especificar la opción '-c', y aquellas cuya entrada y salida están conectadas a un
terminal (como se determina por isatty(3)), o aquella iniciada con la opción ' -i'. Vea la Sección 6.3
[Shells Interactivas] para más información.
Si quedan argumentos tras el procesado de opciones, y no se han suministrado las opciones ' -c' o
'-s', se supone que el primer argumento es el nombre de un archivo que contiene comandos de shell
(vea la Sección 3.8 [Guiones de la Shell]). Cuando se invoca a Bash de este modo, se establece el
valor de $0 al nombre del archivo, y los parámetros posicionales se ajustan al resto de argumentos.
Bash lee y ejecuta comandos desde este fichero y luego finaliza. El estado de salida de Bash es el
estado de salida del último comando ejecutado en el guión de comandos. Si no se ejecutaron
comandos el estado de salida es 0.

6.2.- Ficheros de Inicio de Bash


Esta sección describe cómo ejecuta Bash sus ficheros de inicio. Si alguno de los archivos existe pero
no puede ser leído, Bash informa de un error. Las tildes se expanden en nombres de fichero como se
describió anteriormente bajo Expansión de Tildes (vea la Sección 3.5.2 [Expansión de Tildes]).
Las shells interactivas se describen en la Sección 6.3 [Shells Interactivas].
Invocado como una shell interactiva de inicio de sesión, o con '--login'
Cuando se invoca a Bash como una shell interactiva de inicio de sesión, o como una shell no inte-
ractiva con la opción '--login', este primero lee y ejecuta los comandos del fichero '/etc/profile', si
ese archivo existe. Tras leer dicho fichero, busca los archivos '~/.bash_profile', '~/bash_login' y
'~/.profile' en ese orden, y lee y ejecuta los comandos comenzando por el primero de ellos que exista y
sea legible. La opción '--noprofile' se puede utilizar al inicio de la shell para inhibir este
comportamiento.
Cuando una shell de inicio de sesión finaliza, Bash lee y ejecuta los comandos del archivo
'~/.bash_logout', si este existe.
Invocado como una shell interactiva no de inicio de sesión
Cuando se inicia una shell interactiva que no es de inicio de sesión, Bash lee y ejecuta los comandos
del archivo '~/bashrc', si dicho archivo existe. Este comportamiento puede inhibirse usando la opción
'--norc'. La opción '--rcfile fichero' forzará a Bash a leer y ejecutar comandos desde el
archivo fichero en lugar de '~/bashrc'.
Normalmente el archivo '~/.bash_profile' contiene la línea
if [-f ~/.bashrc ]; then . ~/.bashrc; fi
después (o antes) de cualquier inicialización específica del inicio de sesión.

Página 80
Capítulo 6: Características de Bash

Invocado de forma no interactiva.


Cuando Bash se inicia de forma no interactiva, para ejecutar un guión de comandos de shell, por
ejemplo, este busca la variable BASH_ENV en el entorno, expande su valor si esta aparece, y usa el
valor expandido como el nombre de un fichero a leer y ejecutar. Bash se comporta como si se ejecu-
tara el siguiente comando:
if [ -n “$BASH_ENV” ]; then . “$BASH_ENV”; fi
pero el valor de la variable PATH no se utiliza para buscar el fichero.
Como se advirtió anteriormente, si se invoca una shell no interactiva con la opción ' --login',
Bash intenta leer y ejecutar los comandos de los archivos de inicio de la shell de inicio de sesión.
Invocado con el nombre sh
Si se invoca a Bash con el nombre sh, este intenta imitar el comportamiento de inicio de versiones
anteriores de sh tan ajustado como sea posible, mientras mantiene también la conformidad con el
estándar POSIX.
Cuando se invoca como una shell interactiva de inicio de sesión, o como una shell no interactiva
con la opción '--login', primero intenta leer y ejecutar comandos de los archivos '/etc/profile' y
'~/.profile', en ese orden. La opción '--noprofile' se puede utilizar para inhibir este
comportamiento. Cuando se invoca como una shell interactiva con el nombre sh, Bash busca la
variable ENV, expande su valor si está definida, y utiliza el valor expandido como el nombre de un
fichero que debe leer y ejecutar. Puesto que una shell invocada como sh no intenta leer y ejecutar
comandos desde ningún otro archivo de inicio, la opción ' --rcfile' no tiene ningún efecto. Una
shell no interactiva invocada con el nombre sh no intenta leer ningún otro archivo de inicio.
Cuando se invoca como sh, Bash entra en el modo POSIX después de leer los archivos de inicio.
Invocado en modo POSIX
Cuando Bash se inicia en modo POSIX, como con la opción de línea de comandos ' --posix', este
sigue el estándar POSIX para los archivos de inicio. En este modo, las shells interactivas expanden la
variable ENV y los comandos se leen y ejecutan desde el fichero cuyo nombre es el valor expandido.
No se lee ningún otro archivo de inicio.
Invocado por un demonio de shell remoto.
Bash intenta determinar cuando está siendo ejecutado con su entrada estándar conectada a una
conexión de red, como por el demonio remoto de shell, normalmente rshd, o el demonio de shell
segura sshd. Si Bash determina que esta siendo ejecutado de este modo, este lee y ejecuta comandos
desde '~/.bashrc', si ese archivo existe y es legible. Bash no hará eso si es invocado con sh. Se puede
utilizar la opción '--norc' para inhibir este comportamiento, y la opción '--rcfile' para forzar a
Bash a leer otro fichero, aunque rshd normalmente no invoca a la shell con estas opciones ni permite
que estas sean especificadas.
Invocado con UID/GIDs reales y efectivas diferentes
Si Bash se inicia con el id de usuario (grupo) efectivo distinto al id de usuario (grupo) real, y la opción
'-p' no se ha suministrado, no se lee ningún fichero de inicio, las funciones de shell no son heredadas
del entorno, las variables SHELLOPTS , BASHOPTS , CDPATH y GLOBIGNORE , si estas aparecen
en el entorno, son ignoradas, y el id de usuario efectivo se ajusta al id del usuario real. Si se suministra
la opción '-p' en la invocación, el comportamiento de inicio es el mismo, pero no se restablece el id de
usuario efectivo.

Página 81
Capítulo 6: Características de Bash

6.3.- Shells Interactivas


6.3.1.- ¿Qué es una Shell Interactiva?
Una shell interactiva es aquella que es iniciada sin argumentos no de opción, a menos que se
especifique la opción '-s', sin especificar la opción '-c', y aquellas en las que la entrada y la salida de
error están ambas conectadas a terminales (como se determina por isatty(3)), o aquella que es iniciada
con la opción '-i'.
Una shell interactiva generalmente lee desde y escribe hacia una terminal de usuario.
La opción de invocación '-s' se puede utilizar para ajustar los parámetros posicionales cuando se
inicia una shell interactiva.
6.3.2.- ¿Es esta una shell Interactiva?
Para determinar cuando un guión de inicio está ejecutándose o no de forma interactiva, compruebe el
valor del parámetro especial '-'. Este contiene i cuando la shell es interactiva. Por ejemplo:
case "$-" in
*i*) echo Esta shell es interactiva ;;
*) echo Esta shell no es interactiva ;;
esac
Alternativamente, los guiones de inicio pueden examinar las variables PS1 ; esta no está esta-
blecida en las shells no interactivas, y está establecida en las shells interactivas. Así:
if [ -z "$PS1" ]; then
echo Esta shell no es interactiva
else
echo Esta shell es interactiva
fi

6.3.3.- Comportamiento de la Shell Interactiva


Cuando la shell se ejecuta interactivamente, esta cambia su comportamiento de varios modos.
1. Los archivos de inicio son leídos y ejecutados como se describe en la Sección 6.2 [Ficheros de
Inicio de Bash].
2. El Control de Tareas (vea el Capítulo 7 [Control de Tareas]) está habilitado por defecto.
Cuando el control de tareas está teniendo efecto, Bash ignora las señales de control de tareas
generadas por el teclado SIGTTIN, SIGTTOU y SIGTSTP.
3. Bash expande y muestra PS1 antes de leer la primera línea de un comando, y expande y
muestra el valor de PS2 antes de leer la segunda línea y las siguientes de un comando
multilínea.
4. Bash ejecuta el valor de la variable PROMPT_COMMAND como un comando antes de
imprimir el prompt primario, $PS1 (vea la Sección 5.2 [Variables de Bash]).
5. Se utiliza readline (vea el Capítulo 8 [Edición de la Línea de Comandos]) para leer
comandos desde el terminal de usuario.
6. Cuando está leyendo un comando Bash inspecciona el valor de la opción ignoreof para set
-o en vez de salir inmediatamente cuando recibe un EOF desde su entrada estándar.
7. La historia de comandos (vea la Sección 9.1 [Las Características de Historia de Bash]) y la
expansión de la historia (vea la Sección 9.3 [Interaccionando con la Historia]) están habilitadas
por defecto. Cuando una shell interactiva finaliza, Bash guardará la historia de comandos en el
archivo cuyo nombre viene dado por el valor de la variable $HISTFILE .
8. La expansión de alias (vea la Sección 6.6 [Alias]) se realiza por defecto.
9. En ausencia de cualquier trampa, Bash ignora la señal SIGTERM (vea la Sección 3.7.6

Página 82
Capítulo 6: Características de Bash

[Señales]).
10. En ausencia de cualquier trampa, la señal SIGINT es capturada y manejada (vea la Sección
3.7.6 [Señales]). SIGINT interrumpirá algunos comandos internos de shell.
11. Una shell interactiva de inicio de sesión al finalizar enviará un SIGHUP a todas sus tareas si la
opción de shell huponexit está activada (vea la Sección 3.7.6 [Señales]).
12. La opción de invocación '-n' se ignora, y 'set -n' no tiene ningún efecto (vea la Sección 4.3.1
[El Comando Interno Set]).
13. Bash comprobará el correo periódicamente, dependiendo de los valores de las variables de
shell MAIL , MAILPATH y MAILCHECK (vea la Sección 5.2 [Variables de Bash]).
14. Los errores de expansión debidos a referencias a variables de shell no ligadas después de que
se haya activado 'set -u' no provocarán que la shell finalice (vea la Sección 4.3.1 [El Comando
Interno Set]).
15. La shell no finalizará en errores de expansión causados por una variable var no establecida o
con valor nulo en expansiones de tipo ${var:?palabra} (vea la Sección 3.5.3 [Expansión de
Parámetros de Shell]).
16. Los errores de redirección encontrados por los comandos internos de la shell no provocan que
la shell finalice.
17. Cuando se ejecuta en modo POSIX, un comando interno especial que retorne un estado de
error no producirá que la shell finalice (vea la Sección 6.11 [El Modo POSIX de Bash]).
18. Un exec fallido no provocará que la shell finalice (vea la Sección 4.1 [Comandos Internos de
la Shell Bourne]).
19. Los errores del analizador no provocarán que la shell finalice.
20. Las correcciones de deletreado únicas en argumentos directorio para el comando interno cd
están activadas por defecto (vea la descripción de la opción cdspell para el comando interno
shopt en la Sección 4.3.2 [El Comando Interno Shopt]).
21. La shell comprobará el valor de la variable TMOUT y finalizará si un comando no es leído
dentro del número de segundos especificado tras imprimir $PS1 (vea la Sección 5.2 [Variables
de Bash]).

6.4.- Expresiones Condicionales de Bash


Las expresiones condicionales son usadas por el comando compuesto [[ y los comandos internos test y
[.
Las expresiones pueden ser unarias o binarias. Las expresiones unarias se utilizan en ocasiones
para examinar el estado de un fichero. También hay operadores de cadena y operadores de compa-
ración numérica. Si el argumento fichero para una de las expresiones de tipo unario es de la forma
'/dev/fd/N', entonces se comprueba el descriptor de fichero N. Si el argumento fichero para una de las
expresiones de tipo unario es uno de entre '/dev/stdin', '/dev/stdout' o '/dev/stderr' se comprueban los
descriptores de fichero 0,1 ó 2 respectivamente.
Cuando se utiliza con [[, los operadores '<' y '>' ordenan lexicográficamente usando la
localización actual.
A menos que se especifique lo contrario, las expresiones unarias que operan con ficheros siguen
los enlaces simbólicos y operan con el destino del enlace en vez de con el propio enlace.
-a fichero Verdad (true) si el fichero existe.
-b fichero Verdad si el fichero existe y es un fichero especial de bloques.
-c fichero Verdad si el fichero existe y es un fichero especial de caracteres.

Página 83
Capítulo 6: Características de Bash

-d fichero Verdad si el fichero existe y es un directorio.


-e fichero Verdad si el fichero existe.
-f fichero Verdad si el fichero existe y es un fichero regular.
-g fichero Verdad si el fichero existe y su bit SGID está activado.
-h fichero Verdad si el fichero existe y es un enlace simbólico.
-k fichero Verdad si el fichero existe y su bit “pegajoso” (“sticky”) está activado.
-p fichero Verdad si el fichero existe y es una tubería con nombre (FIFO).
-r fichero Verdad si el fichero existe y se puede leer.
-s fichero Verdad si el fichero existe y tiene un tamaño mayor que cero.
-t fd Verdad si el descriptor fd está abierto y se refiere a un terminal.
-u fichero Verdad si el fichero existe y su bit SUID está activado.
-w fichero Verdad si el fichero existe y se puede modificar.
-x fichero Verdad si el fichero existe y es ejecutable.
-O fichero Verdad si el fichero existe y su propietario es el UID efectivo.
-G fichero Verdad si el fichero existe y su grupo es el GID
-L fichero Verdad si el fichero existe y es un enlace simbólico.
-S fichero Verdad si el fichero existe y es un socket.
-N fichero Verdad si el fichero existe y ha sido modificado desde que fuel leído la última
vez.
fichero1 -nt fichero2
Verdad si fichero1 es más nuevo (de acuerdo con su fecha de modifi-
cación)que fichero2, o si fichero1 existe y fichero2 no.
fichero1 -ot fichero2
Verdad si fichero1 es más viejo que fichero2, o si fichero2 existe y fichero1
no.
fichero1 -ef fichero2
Verdad si fichero1 y fichero2 referencian al mismo dispositivo y número de
inodo.
-o nombreopt Verdad si la opción de shell nombreopt está activada. La lista de opciones
aparece en la descripción de la opción '-o' del comando interno set (vea la
Sección 4.3.1 [El Comando Interno Set]).
-z cadena Verdad si la longitud de la cadena es cero
-n cadena
cadena Verdad si la longitud de la cadena es distinta de cero.
cadena1 == cadena2
cadena1 = cadena2

Página 84
Capítulo 6: Características de Bash

Verdad si las cadenas son iguales. Con los comandos test se debería usar '='
para cumplir con el estándar POSIX.
cadena1 != cadena2
Verdad si las cadenas no son iguales.
cadena1 < cadena2
Verdad si cadena1 se ordena lexicográficamente antes que cadena2.
cadena1 > cadena2
Verdad si cadena1 se ordena lexicográficamente después de cadena2.
arg1 OP arg2 OP es uno de los siguientes operadores: '-eq'. '-ne', '-lt'. '-le', '-gt' o
'-ge'. Estos operadores de aritmética binaria devuelven verdad ( true) si arg1
es igual que, distinto a, menor que, menor o igual que, mayor que, o mayor o
igual que arg2, respectivamente. arg1 y arg2 pueden ser enteros positivos o
negativos.

6.5.- Aritmética de la Shell.


La shell permite que las expresiones aritméticas sean evaluadas, como en la expansión de shell o
mediante el comando interno let o el comando interno declare con la opción '-i'.
La evaluación se hace en enteros de anchura fija sin comprobación de desbordamiento, aunque la
división por 0 es capturada y marcada como un error. Los operadores y sus precedencias, asocia-
tividad y valores son iguales que el lenguaje C. La siguiente lista de operadores se agrupa en niveles de
igual precedencia. Los niveles son listados en orden de precedencia decreciente.
id++ id-- post-incremento y post-decremento de variables
++id --id pre-incremento y pre-decremento de variables
- + menos y más unarios (positivo y negativo)
! ~ negación lógica y binaria
** exponenciación
* / % multiplicación, división, resto
+ - adición, sustracción
<< >> desplazamiento de bits a la izquierda y a la derecha
<= >= < > comparaciones
== != igualdad y desigualdad
& y binario (AND)
^ o binario exclusivo (XOR)
| o binario (OR)
&& y lógico (AND)
|| o lógico (OR)
expr ? expr : expr

Página 85
Capítulo 6: Características de Bash

operador condicional.
= *= /= %= += -= <<= >>= &= ^= |=
asignaciones
expr1 , expr2 coma
Las variables de shell pueden funcionar como operandos; se realiza expansión de parámetros
antes de evaluar la expresión. Dentro de una expresión, las variables de shell pueden ser referenciadas
por un nombre sin usar la sintaxis de expansión de parámetros. Una variable de shell que sea nula o no
esté definida se evalúa a 0 cuando es referenciada por su nombre sin usar la sintaxis de expansión de
parámetros. El valor de una variable se evalúa como una expresión aritmética cuando es referenciada,
o cuando una variable a la cual se le ha dado el atributo entero usando ' declare -i' es asignada a un
valor. Un valor nulo se evalúa a 0. Una variable de shell no necesita tener su atributo entero activado
para ser usada en una expresión.
Las constantes comenzando con un 0 se interpretan como números en base octal. Un '0x' o '0X'
al inicio indica un número en hexadecimal. De otro modo, los números que tienen la forma
[base#]n, donde base es un número decimal entre 2 y 64 representando la base aritmética, y n es un
número en esa base. Si se omite base#, entonces se utiliza la base 10. Los dígitos mayores que 9 se
representan con letras minúsculas, letras mayúsculas, '@' y '_' en ese orden. Si base es menor o igual
a 36 las letras minúsculas y mayúsculas pueden ser usadas indistintamente para representar los
números entre 10 y 35.
Los operadores se evalúan en el orden de precedencia. Primero se evalúan las sub-expresiones
entre paréntesis; de esta forma se pueden sobreescribir las reglas de precedencia anteriores.

6.6.- Alias
Los alias permiten que una cadena sea sustituida por una palabra cuando esta se utiliza como la
primera palabra de un comando simple. La shell mantiene una lista de alias que pueden ser estable-
cidos o eliminados con los comandos internos alias y unalias respectivamente.
La primera palabra de cada comando simple, si no está entrecomillada, se comprueba para ver si
es un alias. Si lo es, esa palabra se reemplaza por el texto del alias. Los caracteres '/', '$', ''', '=' y
cualquier otro metacaracter de la shell o carácter entrecomillado listado anteriormente no pueden
aparecer en un nombre de alias. El texto sustituido puede contener cualquier entrada de shell válida,
incluyendo metacaracteres de la shell. La primera palabra del texto reemplazado se comprueba en
busca de alias, pero una palabra que sea idéntica a un alias que está siendo expandido no es expandida
por segunda vez. Esto significa que uno puede construir un alias ls que ejecute, por ejemplo, el
comando “ls -F”, y Bash no intentará expandir recursivamente el texto reemplazado. Si el último
carácter del valor del alias es un espacio o un carácter tabulación, entonces también se comprueba la
siguiente palabra de comando que siga al alias en busca de expansión de alias.
Los alias se crean y listan con el comando alias, y se eliminan con el comando unalias.
No hay mecanismos para usar argumentos en el texto sustituido, como en csh. Si se necesitan
argumentos, se debe usar una función de shell (vea la Sección 3.3 [Funciones de Shell]).
Los alias no se expanden cuando la shell no es interactiva, a menos que se establezca la opción de
shell expand_aliases usando shopt (vea la Sección 4.3.2 [El Comando Interno Shopt]).
Las reglas concernientes a la definición y uso de alias pueden ser algo confusas. Bash siempre lee
al menos una línea completa de la entrada antes de ejecutar cualquiera de los comandos de esa línea.
Los alias se expanden cuando se lee un comando, no cuando se ejecuta. De esta forma, una definición
de alias que aparezca en la misma línea que otro comando no tendrá efecto hasta que se lea la

Página 86
Capítulo 6: Características de Bash

siguiente línea de la entrada. Los comandos que siguen a la definición del alias en esa línea no se ven
afectados por el nuevo alias. Este comportamiento es también un problema cuando se ejecutan
funciones. Los alias se expanden cuando se lee una definición de función, no cuando se ejecuta la
función, puesto que una definición de función es por sí misma un comando compuesto. Como
consecuencia, los alias definidos en una función no están disponibles hasta después de que se ejecute
dicha función. Para estar seguros, ponga siempre las definiciones de alias en una línea separada, y no
use alias en comandos compuestos.
Para casi cualquier propósito, se prefiere las funciones de shell sobre los alias.

6.7.- Arrays
Bash proporciona variables de tipo array unidimensional indexado y de tipo array asociativo. Cual-
quier variable se puede utilizar como un array indexado; el comando interno declare declarará
explícitamente un array. No hay un límite máximo al tamaño de un array, ni ninguna obligación de
que los miembros sean indexados o asignados contiguamente. Los arrays indexados se referencian
usando enteros, incluyendo expresiones aritméticas (vea la Sección 6.5 [Aritmética de la Shell]) y
comienzan con el índice cero; los arrays asociativos utilizan cadenas arbitrarias.
Se crea automáticamente un array indexado si se asigna alguna variable usando la sintaxis:
nombre[índice]=valor
El índice se trata como una expresión aritmética que debe ser evaluada a un número mayor o
igual que cero. Para declarar un array de forma explícita utilice:
declare -a nombre
La sintaxis
declare -a nombre[índice]
también es válida; el índice se ignora
Los arrays asociativos se declaran usando
declare -A nombre
Se pueden especificar atributos para una variable de tipo array usando los comandos internos
declare y readonly. Cada atributo se aplica a todos los miembros de un array.
Los arrays se pueden asignar en asignaciones compuestas de la forma:
nombre=(valor1 valor2 … valorn)
donde cada valor es de la forma [índice]=cadena. Las asignaciones a arrays indexados no
requieren los corchetes ni el índice. Cuando se asigna a arrays indexados, si se suministra el índice
opcional, el valor es asignado a ese índice; en caso contrario el elemento es asignado al último índice
asignado por la sentencia más uno. Los índices comienzan en el cero.
Cuando se asigna a un array asociativo, el índice es obligatorio.
Esta sintaxis también se puede usar con el comando interno declare. Los elementos individuales
del array pueden ser asignados usando la sintaxis nombre[índice]=valor introducida
anteriormente.
Cualquier elemento de un array puede ser referenciado usando ${nombre[índice]} . Las llaves son
obligatorias para evitar conflictos con los operadores de expansión de nombres de fichero de la shell.
Si el índice es '@' o '*' la palabra se expande a todos los miembros del array nombre. Estos índices se
diferencian sólo cuando la palabra aparece entre dobles comillas. Si la palabra está entre dobles
comillas, ${nombre[*]} se expande a una única palabra con el valor de cada miembro del array
separado por el primer carácter de la variable IFS , y ${nombre[@]} se expande a cada elemento de
nombre en una palabra separada. Cuando no hay miembros en el array ${nombre[@]} no se expande a

Página 87
Capítulo 6: Características de Bash

nada. Si la expansión entre dobles comillas ocurre dentro de una palabra, la expansión del primer
parámetro se une con la primera parte de la palabra original, y la expansión del último parámetro se
une con la última parte de la palabra original. Esto es similar a la expansión de los parámetros
especiales '@' y '*'. ${#nombre[índice]} se expande a la longitud de ${nombre[índice]}. Si el índice
es '@' o '*', la expansión es el número de elementos en el array. Referenciar una variable de tipo array
sin un índice es equivalente a referenciar al índice 0.
Se considera que una variable de tipo array está establecida si alguno de los índices tiene asignado
un valor. La cadena nula es un valor válido.
Se utiliza el comando interno unset para destruir arrays, unset nombre[índice] elimina el
elemento en el índice dado por índice. Tenga cuidado de evitar efectos no deseados causados por la
expansión de nombres de fichero, unset nombre, donde nombre es un array, elimina el array
completo. Un índice de '@' o '*' también elimina el array completo.
Cada uno de los comandos internos declare, local y readonly aceptan una opción '-a' para
especificar un array indexado y una opción ' -A' para especificar un array asociativo. El comando
interno read acepta una opción '-a' para asignar una lista de palabras leídas desde la entrada estándar
a un array, y puede leer valores desde la entrada estándar dentro de elementos individuales del array.
Los comandos internos set y declare muestran los valores del array de forma que pueden ser
reutilizados como entrada.

6.8.- La Pila de Directorios


La pila de directorios es una lista con los directorios visitados recientemente. El comando interno
pushd añade directorios a la pila y cambia el directorio actual por el último directorio añadido a la
pila, y el comando interno popd elimina los directorios especificados y cambia el directorio actual por
el último directorio eliminado. El comando interno dirs muestra el contenido de la pila de directorios.
El contenido de la pila de directorios también es visible mediante el valor de la variable de shell
DIRSTACK .

6.8.1.- Comandos Internos de la Pila de Directorios


dirs
dirs [+N | -N] [-clpv]
Muestra la lista de directorios almacenados actualmente. Los directorios se añaden a la
lista con el comando push; el comando popd elimina directorios de la lista.
+N Muestra el n-ésimo directorio (contando desde la izquierda de la lista
imprimida por dirs cuando es invocado sin opciones), comenzando desde el
cero.
-N Muestra el n-ésimo directorio (contando desde la derecha de la lista
imprimida por dirs cuando es invocado sin opciones), empezando desde
cero.
-c Limpia la pila de directorios eliminando todos los elementos.
-l Produce un listado largo; el formato de listado por defecto utiliza una tilde
para denotar el directorio home.
-p Produce que dirs imprima la pila de directorios con una entrada por línea
-v Produce que dirs imprima la pila de directorios con una entrada por línea,
prefijando cada entrada con su índice en la pila.

Página 88
Capítulo 6: Características de Bash

popd
popd [+N | -N] [-n]
Elimina la entrada de la cima de la pila de directorios, y realiza un cd al nuevo directorio
de dicha cima. Cuando no se dan argumentos, popd elimina el directorio de la cima de la
pila y realiza un cd al nuevo directorio de la cima de la pila. Los elementos se numeran
desde 0 comenzando en el primer directorio listado con dirs; por ejemplo, popd es
equivalente a popd +0.
+N Elimina el n-ésimo directorio (contando desde la izquierda de la lista
imprimida por dirs), comenzando con cero.
-N Elimina el n-ésimo directorio (contando desde la derecha de la lista
imprimida por dirs), comenzando con cero.
-n Suprime el cambio de directorio habitual cuando se remueven directorios
desde la pila, de forma que sólo se manipula la pila.
pushd
pushd [-n] [+N | -N | dir ]
Guarda el directorio actual en la cima de la pila de directorios y realiza un cd a dicho
directorio. Sin argumentos, pushd intercambia los dos directorios de la cima.
-n Suprime el cambio de directorio habitual cuando se añaden directorios a la
pila, de forma que sólo se manipula la pila.
+N Lleva al n-ésimo directorio (contando desde la izquierda de la lista impri-
mida por dirs, comenzando con cero) a la cima de la lista rotando la pila.
-N Lleva el n-ésimo directorio (contando desde la derecha de la lista imprimida
por dirs, comenzando con cero) a la cima de la lista rotando la pila.
dir Hace que el directorio de trabajo actual sea la cima de la pila, y luego ejecuta
el equivaflente a 'cd dir'. Cambia el directorio de trabajo actual a dir.

6.9.- Controlando el Prompt


Se examina el valor de la variable PROMPT_COMMAND justo antes de que Bash imprima cada
prompt primario. Si PROMPT_COMMAND está establecida y no tiene un valor nulo, entonces su
valor se ejecuta como si hubiese sido introducido en la línea de comandos.
Adicionalmente, la tabla siguiente describe los caracteres especiales que pueden aparecer en las
variables de prompt:
\a Un carácter campana.
\d La fecha, en formato “Día de la semana Mes Día del mes” (por ejemplo “Tue May 26”).
\D{formato}
El formato se pasa a strftime(3) y el resultado se inserta en la cadena del prompt; un
formato vacío resulta en una representación de tiempo específica de la localización. Las
llaves son obligatorias.
\e Un carácter de escape.
\h El nombre de anfitrión (host), hasta el primer '.'.

Página 89
Capítulo 6: Características de Bash

\H El nombre de anfitrión.
\j El número de tareas manejadas actualmente por la shell.
\l El nombre base de del dispositivo terminal de la shell.
\n Una nueva línea.
\r Un retorno del carro.
\s El nombre de la shell, el nombre base de $0 (la parte que sigue a la última barra
inclinada).
\t La hora, en formato de 24 horas HH:MM:SS.
\T La hora, en formato de 12 horas HH:MM:SS.
\@ La hora, en formato de 12 horas am/pm.
\A La hora, en formato de 24 horas HH:MM.
\u El nombre de usuario del usuario actual.
\v La versión de Bash (por ejemplo, 2.00)
\V La distribución de Bash, la versión + el nivel de parcheo (por ejemplo 2.00.0).
\w El directorio de trabajo actual, con $HOME abreviado con una tilde (utiliza la variable
$PROMPT_DIRTIRM ).
\W El nombre base de $PWD , con $HOME abreviado con una tilde.
\! El número de historia de este comando.
\# El número de comando de este comando.
\$ Si el uid efectivo es 0, # , en caso contrario $.
\nnn El carácter cuyo código ASCII coincide con el valor octal nnn.
\\ Una barra invertida.
\[ Comienza una secuencia de caracteres no imprimibles. Esto puede usarse para introducir
una secuencia de control del terminal dentro del prompt.
\] Finaliza una secuencia de caracteres no imprimibles.
El número de comando y el número de historia normalmente son diferentes: el número de
historia de un comando es su posición en la lista de historia, la cual puede incluir comandos restau-
rados desde el archivo de historia (vea la Sección 9.1 [Características de Historia de Bash]), mientras
que el número de comando es la posición en la secuencia de comandos ejecutados durante la sesión de
shell actual.
Después de que la cadena sea decodificada, esta se expande mediante expansión de parámetros,
sustitución de comandos, expansión aritmética y eliminación de entrecomillado obedeciendo al valor
de la opción de shell promptvars (vea la Sección 4.2 [Comandos Internos de Bash]).

6.10.- La Shell Restringida


Si Bash se inicia con el nombre rbash, o se suministran las opciones '--restricted' o '-r' en la
invocación, la shell se convierte en restringida. Una shell restringida se utiliza para establecer un
entorno más controlado que la shell estándar. Una shell restringida se comporta de forma idéntica a

Página 90
Capítulo 6: Características de Bash

bash exceptuando los apartados siguientes que están anulados o no son interpretados:
• Cambiar de directorio con el comando interno cd.
• Establecer o quitar los valores de las variables SHELL , PATH, ENV, o BASH_ENV .
• Especificar nombres de comandos que contengan barras inclinadas.
• Especificar un nombre de fichero que contenga una barra inclinada como argumento para el
comando interno '.'.
• Especificar un nombre de fichero que contenga una barra inclinada como argumento para la
opción '-p' del comando interno hash.
• Importar definiciones de funciones al inicio desde el entorno de la shell.
• Analizar el valor de SHELLOPTS al inicio desde el entorno de la shell.
• Redirigir la salida usando los operadores de redirección '>', '>|', '<>', '>&', '&>' y '>>'.
• Usar el comando interno exec para reemplazar la shell con algún otro comando.
• Añadir o eliminar comandos internos con las opciones ' -f' y '-d' del comando interno
enable.
• Usar el comando interno enable para activar los comandos internos de shell deshabilitados.
• Especificar la opción '-p' para el comando interno command.
• Desactivar el modo restringido con 'set +r' o 'set +o restricted'
Estas restricciones se imponen después de leer cualquier archivo de inicio.
Cuando se ejecuta un comando que es un guión de shell (vea la Sección 3.8 [Guiones de Shell]),
rbash desactiva cualquier restricción en la shell que se origina para ejecutar el guión.

6.11.- El Modo POSIX de Bash


Iniciar Bash con la opción de la línea de comandos ' --posix' o ejecutando 'set -o posix' mientras
Bash se está ejecutando, producirá que Bash se ajuste al estándar POSIX cambiando su
comportamiento para encajar con las especificaciones POSIX en aquellas áreas en las que el
comportamiento por defecto de Bash difiere de estas.
Cuando se invoca como sh, Bash entra en el modo POSIX tras leer los archivos de inicio.
A continuación se muestra una lista con los cambios que tienen efecto cuando Bash cambia al
modo POSIX:
1. Cuando un comando deja de existir en la tabla hash, Bash volverá a buscar en $PATH para
encontrar la nueva localización. Esto también es posible con 'shopt -s checkhash'.
2. El mensaje imprimido por el código de control de tareas y los comandos internos cuando una
tarea finaliza con un estado distinto de cero es 'Hecho(estado)'.
3. El mensaje imprimido por el código de control de tareas y los comandos internos cuando se
detiene una tarea es 'Detenido(nombreSeñal)', donde nombreSeñal es, por ejemplo,
SIGTSTP.
4. El comando interno bg utiliza el formato requerido para describir cada tarea situada en
segundo plano, lo que no incluye una indicación de si la tarea es la actual o la anterior.
5. Las palabras reservadas que aparecen en un contexto donde se reconocen palabras reservadas
no sufren expansión de alias.
6. En PS1 y PS2 las expansiones POSIX de '!' para el número de historia y '!!' para '!' están
activadas, y la expansión de parámetros se realiza en los valores de PS1 y PS2 a pesar de los
ajustes de la opción promptvars.
7. Se ejecutan los ficheros de inicio de POSIX ($ENV) en vez de los ficheros de inicio de Bash.
8. La expansión de tildes se realiza sólo en asignaciones que precedan a un nombre de comando,
en vez de en todas las sentencias de asignación de la línea.

Página 91
Capítulo 6: Características de Bash

9. El archivo de historia por defecto es '~/.sh_history' (este es el valor por defecto de


$HISTFILE ).
10. La salida de 'kill -l' imprime todos los nombres de señal en una única línea, separadas
por espacios sin el prefijo 'SIG'.
11. El comando interno kill no acepta nombres de señal con un prefijo 'SIG'.
12. Las shells no interactivas finalizan si . nombreArchivo no encuentra a nombreArchivo.
13. Las shells no interactivas finalizan si un error de sintaxis en una expansión aritmética resulta en
una expresión inválida.
14. Los operadores de redirección no realizan expansión de nombres de fichero en la palabra en la
redirección a menos que la shell sea interactiva.
15. Los operadores de redirección no realizan separación de palabras en la palabra en la redi-
rección.
16. Los nombres de funciones deben ser nombres válidos para la shell. Esto es, estos no pueden
contener caracteres distintos de letras, dígitos y caracteres de subrayado, y no pueden
comenzar con un dígito. Declarar una función con un nombre inválido provoca un error de
sintaxis fatal en las shells no interactivas.
17. Los comandos internos especiales de POSIX se encuentran antes que las funciones de shell
durante la búsqueda de comandos.
18. Una shell no interactiva finalizará si un comando interno especial de POSIX devuelve un
estado de error. Los errores fatales son aquellos que se listan en el estándar POSIX, e incluye
cosas como pasar opciones incorrectas, errores de redirección, errores en la asignación de
variables para asignaciones que preceden a un nombre de comandos y algunas más.
19. Si CDPATH está establecida, el comando interno cd no añadirá implícitamente el directorio
actual al valor de esta variable. Esto significa que cd fallará si no se puede construir ningún
nombre de directorio válido desde ninguna de las entradas en $CDPATH , incluso si en el
directorio actual existe un directorio con el mismo nombre que el dado como argumento a cd.
20. Una shell no interactiva finalizará con un estado de error si se produce un error de asignación
de variables cuando no hay ningún nombre de comando que siga a las sentencias de asignación.
Un error de asignación de variables se produce, por ejemplo, cuando se intenta asignar un
valor a una variable de sólo lectura.
21. Una shell no interactiva finalizará con un estado de error si la variable de iteración en una
sentencia for o la variable de selección en una sentencia select es una variable de sólo lectura.
22. La sustitución de procesos no está disponible.
23. Las sentencias de asignación que precedan a los comandos internos especiales POSIX se
mantienen en el entorno de shell después de que el comando interno finalice.
24. Las sentencias de asignación que precedan a las llamadas a funciones de shell se mantienen en
el entorno de la shell después de que la función retorne, como se si hubiese ejecutado un
comando interno especial de POSIX.
25. Los comandos internos export y readonly muestran sus salidas en el formato requerido por
POSIX.
26. El comando interno trap muestra los nombres de señal sin el prefijo SIG.
27. El comando interno trap no comprueba el primer argumento para una posible especificación
de señal ni revierte el manejo de señales a la disposición original si lo es, a menos que el
argumento consista únicamente en dígitos y sea un número de señal válido. Si los usuarios
quieren restablecer el manejador para una señal dada a la disposición original, deben usar '-'
como primer argumento.

Página 92
Capítulo 6: Características de Bash

28. Los comandos internos . y source no en buscan el argumento nombre de fichero en el


directorio actual si este no se encuentra buscando en el PATH.
29. Las subshells generadas para ejecutar sustituciones de comandos heredan el valor de la opción
'-e' desde el padre de la shell. Cuando no se encuentra en modo POSIX, Bash limpia la
opción '-e' en tales subshells.
30. La expansión de alias está siempre activada, incluso en shells no interactivas.
31. Cuando el comando interno alias muestra las definiciones de alias, este no las muestra con
una cadena 'alias' al comienzo, a menos que se suministre la opción '-p'.
32. Cuando se invoca al comando interno set sin opciones, este no muestra los nombres de
función y sus definiciones.
33. Cuando se invoca al comando interno set sin opciones, este muestra los valores de las
variables sin entrecomillar, a menos que estos contengan metacaracteres de shell, incluso si el
resultado contiene caracteres no imprimibles.
34. Cuando se invoca al comando interno cd en modo lógico, y la ruta construida desde $PWD y
el nombre de directorio suministrado como argumento no referencian a un directorio existente,
cd fallará en lugar de volver al modo físico.
35. Cuando se suministra la opción ' -P' para el comando interno pwd, este restablece el valor de
$PWD a una ruta que no contiene enlaces simbólicos.
36. El comando interno pwd verifica que el valor que imprime es el mismo que el del directorio
actual, incluso si no se le ha pedido que compruebe el sistema de ficheros suministrándole la
opción '-P'.
37. Cuando lista la historia, el comando interno fc no incluye una indicación de cual entrada ha
sido modificada y cual no.
38. El editor por defecto usado para fc es ed.
39. Los comandos internos type y command no informaran de que se ha encontrado un fichero
no ejecutable, aunque la shell intentará ejecutar ese fichero si es el único fichero de tal nombre
que se ha encontrado en $PATH .
40. El modo de edición de vi invocará al editor vi directamente cuando se ejecuta el comando, en
vez de comprobar los valores de $VISUAL y $EDITOR .
41. Cuando la opción xpg_echo está establecida, Bash no intentará interpretar ningún argumento
para echo como una opción. Cada argumento se muestra, después de tranformar los
caracteres escapados.
42. El comando interno ulimit utiliza un tamaño de bloque de 512 bytes para las opciones ' -c' y
'-f'.
43. La llegada de un SIGCHLD cuando se ha establecido una trampa sobre SIGCHLD no inte-
rrumpe el comando interno wait y produce que este retorne inmediatamente. El comando
trampa se ejecuta una vez para cada hijo que finaliza.
Existen otros comportamientos POSIX que Bash no implementa por defecto incluso cuando está
funcionando en modo POSIX. Específicamente:
1. El comando interno fc comprueba $EDITOR en busca de un programa para editar las entradas
de la historia si FCEDIT no está establecido, en vez de utilizar directamente ed. fc utiliza ed si
EDITOR no está establecido.
2. Como se advirtió más arriba, Bash requiere que la opción xpg_echo esté activada para que el
comando interno echo se comporte completamente conforme al estándar POSIX.
Se puede configurar Bash para ser conforme a POSIX por defecto, especificando la opción
'--enable-strict-posix-default' a configure cuando se construye (vea la Sección 10.8

Página 93
Capítulo 6: Características de Bash

[Características Opcionales])

Página 94
Capítulo 7: Control de tareas

7.- Control de Tareas


Este capítulo describe qué es el control de tareas, cómo trabaja, y cómo le permite Bash acceder a
estas características.

7.1.- Fundamentos del Control de Tareas


El control de tareas se refiere a la habilidad de detener (suspender) selectivamente la ejecución de
procesos y continuar (resumir) su ejecución en un momento posterior. Un usuario normalmente
emplea estas características a través de una interfaz interactiva suministrada conjuntamente por el
driver de terminal del kernel del sistema operativo y Bash.
La shell asocia una tarea con cada tubería. Esta mantiene una tabla de tareas actualmente en
ejecución, la cual se puede listar con el comando jobs. Cuando Bash inicia una tarea asíncronamente,
este imprime una línea como la siguiente:
[1] 25647
indicando que esta es la tarea número 1 y que el ID de proceso del último proceso en la tubería
asociada con esta tarea es 25647. Todos los procesos en una tubería simple son miembros de la misma
tarea. Bash usa la abstracción de tarea como el fundamento para el control de tareas.
Para facilitar la implementación de la interfaz de usuario para el control de tareas, el sistema
operativo mantiene la noción de un ID del grupo de procesos del terminal actual. Los miembros de este
grupo de procesos (procesos cuyo ID de grupo de procesos es igual al ID del grupo de procesos del
terminal actual) reciben señales generadas por el teclado como SIGINT. Estos procesos se dice que
están en primer plano. Los procesos en segundo plano son aquellos cuyo ID de grupo de procesos
difiere del correspondiente al terminal; estos procesos son inmunes a las señales generadas por el
teclado. Sólo los procesos en primer plano pueden leer desde o, si el usuario así lo especifica con
stty tostop, escribir hacia el terminal. Los procesos en segundo plano que intenten leer desde (o
escribir, cuando stty tostop esté teniendo efecto, hacia) la terminal recibirán una señal SIGTTIN
(SIGTTOU) enviada por el driver de terminal del kernel, la cual, a menos que sea capturada,
suspenderá el proceso.
Si el sistema operativo en el que se está ejecutando Bash soporta el control de tareas, Bash
presenta características para usarlas. Escribir el carácter de suspensión (normalmente '^Z', Control-Z)
durante la ejecución de un proceso produce que el proceso se detenga y devuelva el control a Bash.
Escribir el carácter de suspensión retrasada (normalmente '^Y', Control-Y) produce que el proceso se
detenga cuando intente leer una entrada desde el terminal y devuelva el control a Bash. El usuario
posteriormente puede manipular el estado de esta tarea, usando el comando bg para continuar esta
tarea en segundo plano, el comando fg para continuar esta tarea en primer plano, o el comando kill
para matarla. Un '^Z' tiene efecto inmediatamente, y presenta el efecto adicional de causar que las
salidas pendientes y los caracteres introducidos sean descartados.
Hay varias formas de referirse a una tarea en la shell. El carácter ' %' introduce una especificación
de tarea (espectarea).
Se puede referenciar al número de tarea n mediante '%n '. Los símbolos '%%' y '%+' se refieren a
la noción de la shell de la tarea actual, la cual es la última tarea detenida mientras estaba en primer
plano o que fue iniciada en segundo plano. Un único ' %' (sin especificar ninguna tarea) también se
refiere a la tarea actual. La tarea anterior puede ser referenciada utilizando ' %-'. Si sólo hay una única
tarea se puede usar tanto '%+' como '%-' para referirse a esa tarea. En salidas pertenecientes a tareas
(p.e., la salida del comando jobs), la tarea actual siempre se marca con un '+', y la tarea previa con un
'-'.
También se puede referenciar a una tarea utilizando un prefijo del nombre usado para iniciarla, o

Página 95
Capítulo 7: Control de tareas

usando una subcadena que aparezca en su línea de comandos. Por ejemplo, ' %ce ' se refiere a una tarea
ce detenida. En cambio '%?ce' se refiere a cualquier tarea que contenga la cadena ' ce' en su línea de
comandos. Si el prefijo o la subcadena concuerda con más de una tarea, Bash informará de un error.
Para llevar una tarea a primer plano puede bastar simplemente con nombrar a dicha tarea: '%1'
es un sinónimo para 'fg %1', llevando la tarea 1 desde un segundo plano hasta el primer plano. De
forma similar, '%1 &' continúa la tarea 1 en segundo plano, lo que equivale a 'bg %1'.
La shell aprende inmediatamente cuando una tarea cambia de estado. Normalmente Bash espera
hasta que está a punto de escribir un prompt para informar de cambios en el estado de una tarea de
forma que no interrumpe ninguna otra salida. Si está activada la opción ' -b' del comando interno set,
Bash informa de tales cambios inmediatamente (vea la Sección 4.3.1 [El Comando Interno Set]).
Cualquier trampa en SIGHLD se ejecuta para cada proceso hijo que exista.
Si se intenta salir de Bash mientras que una tarea está suspendida (o ejecutándose, si la opción
checkjobs está activada (vea la Sección 4.3.2 [El Comando Interno Shopt]), la shell imprime un
mensaje de advertencia, y, si la opción checkjobs está activada, lista las tareas y sus estados. Los
comandos de tarea se pueden usar para inspeccionar su estado. Si se realiza un segundo intento de
salida sin que intervenga ningún comando, Bash no imprimirá más advertencias, y cualquier tarea
suspendida será finalizada.

7.2.- Comandos Internos para el Control de Tareas


bg
bg [espectarea …]
Continúa cada tarea suspendida espectarea en segundo plano, como si hubiese sido
iniciada con '&'. Si no se suministra espectarea se utiliza la tarea actual. El estado de
retorno es cero a menos que sea ejecutado cuando el control de tareas no está activado o,
cuando se ejecuta con el control de tareas activado y no se encuentra alguno de los
espectarea o especifica una tarea que fue iniciada sin el control de tareas.
fg
fg [espectarea]
Continua la tarea espectarea en primer plano y hace esta la tarea actual. Si no se
suministra espectarea, se utiliza la tarea actual. El estado de retorno es el correspondiente
al comando situado en primer plano, o distinto de cero si se ejecuta cuando el control de
tareas está deshabilitado o, cuando el control de tareas está activado y espectarea no
especifica una tarea válida o especifica una tarea que fue iniciada sin el control de tareas.
jobs
jobs [-lnprs] [espectarea]
jobs -x comando [argumentos]
La primera forma lista las tareas activas. Las opciones tienen los siguientes significados:
-l Lista los IDs de los procesos junto con la información habitual.
-n Muestra información únicamente sobre las tareas que han cambiado su
estado desde la última vez que el usuario fue notificado de su estado.
-p Lista sólo los IDs de proceso del líder del grupo de procesos de la tarea.
-r Restringe la salida a las tareas en ejecución
-s Restringe la salida a las tareas detenidas.
Si se da espectarea, la salida se restringe a la información correspondiente a esa tarea. Si

Página 96
Capítulo 7: Control de tareas

no se suministra espectarea se lista el estado de todas las tareas.


Si se suministra la opción '-x' las tareas reemplaza cualquier espectarea encontrado en
comando o argumentos con el correspondiente ID del grupo de procesos, y ejecuta el
comando pasándole argumentos y retornando su estado de salida.
kill
kill [-s especseñal] [-n numseñal] [-especseñal] espectarea
o pid
kill -l [estado_de_salida]
Envía una señal especificada por especseñal o numseñal al proceso identificado mediante
la especificación de tarea espectarea o el ID de proceso pid. especseñal es o bien un
nombre de señal que no diferencia entre mayúsculas y minúsculas como SIGINT (con o sin
el prefijo SIG) o un número de señal. Si especseñal y numseñal no están presentes se
utiliza SIGTERM. La opción '-l' lista los nombres de señal. Si se proporciona algún
argumento con la opción '-l' se listan los nombres de las señales que se corresponden con
los argumentos, y el estado de retorno es cero. El estado_de_salida es un número que
especifica un número de señal o el estado de salida de un proceso terminado por una
señal. El estado de retorno es cero si al menos se envió correctamente una de las señalas y
distinto de cero si ocurrió algún error o se encontró una opción inválida.
wait
wait [espectarea o pid …]
Espera hasta que le proceso hijo especificado por cada ID de proceso pid o especificación
de tarea espectarea finaliza y devuelve el estado de salida del último comando por el que
se ha esperado. Si se da una especificación de tarea, espera a que finalicen todos los
procesos en la tarea. Si no se dan argumentos se espera a que finalicen todos los procesos
hijos actualmente activos y el estado de retorno es cero. Si ningún espectarea o pid
especifica un proceso activo que sea hijo de la shell el estado de retorno es 127.
disown
disown [-ar] [-h] [espectarea …]
Sin opciones se elimina cada espectarea de la tabla de tareas activas. Si se da la opción ' -
h' la tarea no es eliminada de la tabla, pero se marca de forma que no se envía la señal
SIGHUP a la tarea si la shell recibe un SIGHUP. Si espectarea no está presente y no se
suministran las opciones '-a' o '-r', se utiliza la tarea actual. Si no se suministra
espectarea la opción '-a' significa eliminar o marcar todas las tareas; la opción ' -r' sin un
argumento espectarea restringe la operación a las tareas en ejecución.
suspend
suspend [-f]
Suspende la ejecución de esta shell hasta que esta recibe una señal SIGCONT. Una shell de
inicio de sesión no puede ser suspendida; se puede usar la opción ' -f' para sobreescribir
este comportamiento y forzar la suspensión.
Cuando el control de tareas no está activo, los comandos internos kill y wait no aceptan
argumentos espectarea. Se les debe suministrar IDs de proceso.

7.3.- Variables para el Control de Tareas


auto_resume
Esta variable controla la forma en la que la shell interacciona con el usuario y el control de
tareas. Si esta variable existe entonces los comandos simples de una única palabra y sin
redirecciones son tratadas como candidatas para reanudar una tarea existente. No se

Página 97
Capítulo 7: Control de tareas

permiten ambigüedades; si hay más de una tarea que comience con la cadena introducida,
entonces se seleccionará la tarea a la que se accedió más recientemente. El nombre de una
tarea detenida, en este contexto, es la línea de comandos usada para iniciarla. Si esta
variable se establece al valor 'exact' la cadena suministrada debe concordar exactamente
con el nombre de una tarea detenida; si es establecida a ' substring', la cadena suministrada
necesita encajar en una subcadena del nombre de una tarea detenida. El valor ' substring'
proporciona una funcionalidad análoga a la ID de tarea ' %? ' (vea la Sección 7.1
[Fundamentos del Control de Tareas]). Si se establece a algún otro valor, la cadena
suministrada debe ser un prefijo del nombre de una tarea detenida; esto proporciona una
funcionalidad análoga al ID de tarea '% '.

Página 98
Capítulo 8: Edición de la línea de comandos

8.- Edición de la Línea de Comandos


Este capítulo describe las características básicas de la interfaz de edición de la línea de comandos de
GNU. La edición de la línea de comandos se proporciona mediante la librería Readline, la cual es
usada por varios programas, incluyendo Bash. La edición de la línea de comandos está activada por
defecto cuando se utiliza una shell interactiva, a menos que en la invocación de la shell se suministre la
opción '--noediting'. La edición de la línea de comandos también se utiliza cuando se suministra la
opción '-e' al comando interno read (vea la Sección 4.2 [Comandos Internos de Bash]). Por defecto,
la edición de la línea de comandos es similar a la de emacs. También está disponible una interfaz de
edición de la línea de comandos estilo vi. La edición de la línea de comandos se puede activar en
cualquier momento usando las opciones '-o emacs' o '-o vi' del comando interno set (vea la
Sección 4.3.1 [El Comando Interno Set]), o se puede desactivar usando las opciones ' +o emacs' o
'+o vi' del comando interno set.

8.1.- Introducción a la Edición de la Línea de Comandos.


Los siguientes párrafos describen la notación usada para representar las pulsaciones de teclas.
El texto C-k se lee como 'Control-K' y describe el carácter producido cuando se presiona la tecla k
mientras que se mantiene presionada la tecla Control.
El texto M-k se lee como 'Meta-K' y describe el carácter producido cuando se mantiene presio-
nada la tecla Meta (si la tiene) y se presiona la tecla k. La tecla Meta se etiqueta como ALT en muchos
teclados. En teclados con dos teclas etiquetadas como ALT (normalmente una a cada lado de la tecla
espaciador), generalmente se establece la tecla ALT del lado izquierdo para trabajar como tecla Meta.
La tecla ALT a la derecha puede también configurarse para ser usada como tecla Meta o puede ser
configurada como algún otro modificador, tal como una tecla de composición para introducir
caracteres acentuados.
Si no tiene una tecla Meta o ALT, o cualquier otra tecla funcionando como una tecla Meta, se
puede generar la misma combinación de teclas pulsando primero la tecla ESC y a continuación la tecla
k. Este proceso se conoce como “prefijar con Meta1 la tecla k.
El texto M-C-k se lee como 'Meta-Control-k' y describe el carácter producido por prefijar con
Meta a C-k.
Adicionalmente, varias teclas tienen sus propios nombres, Concretamente, DEL, ESC, LFD, SPC,
RET y TAB y permanecen como tales cuando aparecen en este texto, o en un fichero de iniciación (vea
la Sección 8.3 [Fichero de Iniciación de Readline]). Si su teclado carece de una tecla LFD, teclear C-j
producirá ese carácter. La tecla RET puede ser etiquetada como Return o Enter en algunos teclados.

8.2.- Interacción con Readline


En ocasiones durante una sesión interactiva, usted puede introducir una enorme línea de texto, para
justo al final descubrir que la primera palabra de la línea está mal deletreada. La librería Readline le
proporciona un conjunto de comandos para manipular el texto que introduce con el teclado, permi-
tiéndole simplemente corregir su errata, sin verse forzado a reescribir la mayor parte de la línea.
Usando estos comandos de edición, usted puede mover el cursor al lugar que necesita la corrección y
borrar o insertar el texto de las correcciones. Luego, cuando esté satisfecho con la línea introducida,
sólo tendrá que pulsar la tecla RET. No necesita estar al final de la línea para presionar RET; se acepta
la línea completa independientemente de la localización del cursor.

1 En inglés metafying the k key

Página 99
Capítulo 8: Edición de la línea de comandos

8.2.1.- Los Fundamentos de Readline al Desnudo


Para introducir caracteres en la línea lo único que debe hacer es teclearlos. Los caracteres introdu-
cidos aparecen donde esté el cursor, y a continuación el cursor se desplaza un espacio hacia la derecha.
Si teclea incorrectamente un carácter, puede usar el carácter de borrado para volver hacia atrás y
borrar el carácter erróneo.
En ocasiones puede teclear un carácter incorrecto, y no percatarse del error hasta que ha intro-
ducido varios caracteres adicionales. En este caso, puede teclear C-b para mover el cursor hacia la
izquierda, y entonces corregir su error. A continuación puede mover el cursor hacia la derecha con C-
f.
Cuando introduzca texto en medio de una línea, notará que los caracteres a la derecha del cursor
son empujados para hacer sitio al texto que esté introduciendo. De forma similar, cuando borre texto
detrás del cursor, los caracteres a la derecha del cursor son arrastrados para rellenar el espacio vacío
creado por la eliminación del texto. A continuación se proporciona una lista de los fundamentos de la
edición de texto en una línea de entrada.
C-b Retrocede un carácter.
C-f Avanza un carácter.
DEL o tecla de retroceso
Borra el carácter a la izquierda del cursor.
C-d Borra el carácter bajo el cursor.
Caracteres imprimibles
Inserta el carácter en la posición del cursor.
C-_ o C-x C-u
Deshace el último comando de edición. Puede deshacer todo lo hecho hasta volver a
la línea vacía inicial.
(Dependiendo de la configuración, la tecla de retroceso borra el carácter a la izquierda del cursor
y la tecla DEL borra el carácter bajo el cursor, como C-d, en vez del carácter a la izquierda del cursor).
8.2.2.- Comandos de Movimiento de Readline
La tabla siguiente describe las pulsaciones de teclas más fundamentales para editar la línea de entrada.
Para su comodidad, se han añadido muchos otros comandos además de C-b, C-f, C-d y DEL. Aquí se
dan algunos comandos para moverse más rápidamente por la línea de comandos.
C-a Se desplaza al principio de la línea.
C-e Se desplaza al final de la línea.
M-f Se desplaza una palabra hacia adelante, cuando la palabra está compuesta de letras y
dígitos
M-b Se desplaza una palabra hacia atrás.
C-l Limpia la pantalla, reimprimiendo la línea actual en la parte superior de la pantalla.
Advierta cómo C-f desplaza un carácter hacia adelante, mientras que M-f desplaza una palabra
hacia delante. Es una amplia costumbre que las teclas rápidas con Control trabajen con caracteres

Página 100
Capítulo 8: Edición de la línea de comandos

mientras que las teclas rápidas con Meta trabajan con palabras.
8.2.3.- Comandos para cortar texto de Readline
Cortar texto significa borrar el texto de la línea, pero guardarlo para uso posterior, normalmente
volviendo a reinsertar este texto en otro lugar de la línea.
Si la descripción de un comando dice que este corta texto, entonces puede estar seguro de que
posteriormente puede obtener ese texto en un lugar diferente (o en el mismo).
Cuando utilice un comando de corte, el texto es guardado en un anillo de corte (kill-ring).
Cualquier número de cortes consecutivos guardan todo el texto cortado junto, de forma que cuando
pegue este de nuevo, obtenga todo el texto. El anillo de corte no es específico de la línea; el texto que
corta en una línea introducida previamente está disponible para ser pegado nuevamente más tarde,
cuando esté introduciendo cualquier otra línea.
A continuación le damos una lista de los comandos para cortar texto.
C-k Corta el texto desde la posición actual del cursor hasta el final de la línea.
M-d Corta el texto desde el cursor hasta el final de la palabra actual, o, si se encuentra
entre palabras, hasta el final de la próxima palabra. Los límites de palabra son los
mismos que los usados por M-f
M-DEL Corta desde el cursor hasta el comienzo de la palabra actual, o, si se encuentra entre
palabras, al comienzo de la palabra previa. Los límites de palabras son los mismos
que los usados con M-b.
C-w Corta desde el cursor hasta el espacio en blanco previo. Este se diferencia de M-DEL
en que los límites de palabra son diferentes.
A continuación indicamos cómo se pega nuevamente el texto en la línea. Pegar significa copiar el
texto más recientemente cortado desde el buffer de corte.
C-y Pega el texto más recientemente cortado nuevamente en la posición del cursor.
M-y Rota el anillo de cortes, y pega el nuevo contenido de la cima. Únicamente puede
hacer esto si el comando anterior es C-y o M-y.

8.2.4.- Argumentos de Readline


Usted puede pasar argumentos numéricos a los comandos de Readline. En ocasiones los argumentos
actúan como un contador de repeticiones, otras veces estos son el signo del argumento que es signi-
ficativo. Si introduce un argumento negativo a un comando que normalmente actúa hacia adelante, ese
comando actuará hacia atrás. Por ejemplo, para cortar texto hacia atrás hasta el comienzo de la línea,
puede teclear 'M-- C-k'.
La forma general de pasar argumentos numéricos a un comando es introducir meta dígitos antes
del comando. Si el primer 'dígito' tecleado es un signo menos ('-'), entonces el signo del argumento
será negativo. Una vez que haya tecleado un meta dígito para comenzar el argumento, puede teclear el
resto de los dígitos, y finalmente el comando. Por ejemplo, para darle al comando C-d un argumento
de 10, podría teclear 'M-1 0 C-d', que borrará los siguientes 10 caracteres de la línea de entrada.
8.2.5.- Buscando Comandos en la Historia
Readline proporciona comandos para buscar a través de la historia de comandos (vea la Sección 9.1
[Características de Historia de Bash]) a aquellas líneas que contengan una cadena especificada. Hay

Página 101
Capítulo 8: Edición de la línea de comandos

dos modos de búsqueda: incremental y no incremental.


Las búsquedas incrementales comienzan antes de que el usuario haya finalizado de teclear la
cadena de búsqueda. Cada vez que se teclea un carácter de la cadena de búsqueda, Readline muestra
la siguiente entrada de la historia que concuerda con la cadena tecleada hasta el momento. Una
búsqueda incremental requiere sólo tantos caracteres como se necesite para encontrar la entrada
deseada de la historia. Para buscar hacia atrás en la historia una cadena en particular, teclee C-r.
Teclear C-s busca hacia adelante en la historia. Los caracteres presentes en el valor de la variable
isearch-terminator se utilizan para finalizar una búsqueda incremental. Si esa variable no tiene asig-
nado ningún valor, los caracteres ESC y C-J finalizarán la búsqueda incremental. C-g abortará una
búsqueda incremental y restaura la línea original. Cuando la búsqueda termina, la entrada de la
historia que contenga la cadena buscada se convierte en la línea actual.
Para encontrar otras entradas coincidentes en la lista de historia, teclee C-r o C-s, lo que sea más
apropiado. Esto buscará hacia atrás o hacia adelante en la historia la siguiente entrada que encaje con
la cadena tecleada hasta el momento. Cualquier otra secuencia de teclas enlazada a un comando de
Readline terminará la búsqueda y ejecutará ese comando. Por ejemplo, un RET terminará la búsqueda
y aceptará la línea, ejecutando el comando de la lista de historia. Un comando de movimiento
terminará la búsqueda, hará que la última línea encontrada sea la línea actual y comenzará la edición.
Readline recuerda la última cadena de búsqueda incremental. Si se teclean dos C-rs sin que
intervengan caracteres que definan una nueva cadena de búsqueda, se utilizará cualquier cadena de
búsqueda almacenada.
Las búsquedas no incrementales leen la cadena de búsqueda completa antes de comenzar a buscar
las líneas de historia que concuerden. La cadena de búsqueda puede ser tecleada por el usuario o ser
parte del contenido de la línea actual.

8.3.- El Fichero de Inicialización de Readline


Aunque la librería Readline viene con un juego de teclas rápidas tipo emacs instaladas por defecto, es
posible usar un juego diferente de teclas rápidas. Cualquier usuario puede personalizar los programas
que utiliza Readline poniendo comandos en un archivo inputrc, convencionalmente en su directorio
home. El nombre de este fichero se toma del valor de la variable de shell INPUTRC . Si esta variable no
está establecida, el valor por defecto es '~/.inputrc'. Si ese fichero no existe o no puede ser leído, el
archivo por defecto en última instancia es '/etc/inputrc'.
Cuando comienza un programa que utiliza la librería Readline, se lee el fichero de inicialización y
se establecen las asociaciones de teclas.
Adicionalmente el comando C-x C-r relee este archivo de inicialización, de forma que incorpore
cualquier cambio que haya podido realizar en él.
8.3.1.- La Sintaxis del Fichero de Inicialización de Readline
Tan sólo existen unas pocas construcciones fundamentales permitidas en el archivo de inicialización
de Readline. Las líneas en blanco son ignoradas. Las líneas que comienzan con un '#' son
comentarios. Las líneas que comienzan con un '$' indican construcciones condicionales (vea la
Sección 8.3.2 [Construcciones de Inicialización Condicionales]). Otras líneas indican definición de
variables y asociaciones de teclas.
Definición de variables
Usted puede modificar el comportamiento de ejecución de Readline modificando los
valores de las variables en Readline usando el comando set dentro del fichero de
inicialización. La sintaxis es simple:

Página 102
Capítulo 8: Edición de la línea de comandos

set variable valor


A continuación, por ejemplo, se muestra cómo cambiar desde las asociaciones de teclas
por defecto tipo emacs a usar los comandos de edición de líneas tipo vi.
set editing-mode vi
Los nombres y valores de las variables, cuando corresponde, se reconocen sin diferenciar
entre mayúsculas y minúsculas. Los nombres de variable no reconocidos son ignorados.
Las variables de tipo booleano (aquellas que pueden ser establecidas a activas, on, o
inactivas, off, se activan si el valor es nulo o vacío, on (sin distinguir mayúsculas y
minúsculas), o 1. Cualquier otro valor resulta en la variable establecida como inactiva.
El comando bind -V lista los nombres y valores de las variables actuales de Readline. Vea
la Sección 4.2 [Comandos Internos de Bash].
Se puede modificar gran parte del comportamiento de ejecución de Readline con las
siguientes variables:
bell-style
Controla qué ocurre cuando Readline quiere hacer sonar la campana del
terminal. Si está establecida a 'none' Readline nunca hará sonar la campana.
Si está establecida a 'visible'. Readline utilizará un aviso visible si alguno está
disponible. Si está establecida a ' audible' (por defecto), Readline intentará
hacer sonar la campana del terminal.
bind-tty-special-chars
Si está activada ('on'), Readline intentará enlazar los caracteres de control
tratados de forma especial por el driver de terminal del kernel con los equi-
valentes de Readline.
comment-begin
Es la cadena a insertar al comienzo de la línea cuando se ejecuta el comando
insert-comment. El valor por defecto es “#”.
completion-ignore-case
Si está establecida en 'on', Readline realiza la concordancia y el completado
de nombres de fichero de forma no sensible a mayúsculas y minúsculas. El
valor por defecto es 'off'.
completion-prefix-display-length
La longitud en caracteres del prefijo común de una lista de completados
posibles que se muestra sin modificación. Cuando se establece a un valor
mayor que cero, los prefijos comunes más largos que este valor son reem-
plazados con una elipsis cuando se muestran los completados posibles.
completion-query-items
El número de completados posibles que determina cuando se debe consultar al
usuario si mostrar o no la lista de posibilidades. Si el número de completados
posibles es mayor que este valor, Readline preguntará al usuario si desea
verlos o no; en caso contrario serán simplemente listados. Esta variable debe
ser establecida a un valor entero mayor o igual que cero. Un valor negativo
significa que Readline nunca debería preguntar. El límite por defecto es 100.
convert-meta
Si está establecida a 'on'. Readline convertirá los caracteres con el octavo bit
establecido a una secuencia de teclas ASCII eliminando el octavo bit y

Página 103
Capítulo 8: Edición de la línea de comandos

prefijando un carácter ESC, de forma que los convierta en una secuencia de


teclas meta-prefijadas. El valor por defecto es 'on'.
disable-completion
Si está establecida en 'on'. Readline inhibirá el completado de palabras. Los
caracteres de completado serán insertados en la línea como si hubieran sido
mapeados para auto-insertarse. El valor por defecto es 'off'.
editing-mode
La variable editing-mode controla qué conjunto de teclas rápidas por defecto
se utiliza. Por defecto, Readline comienza en el modo de edición de Emacs,
donde la mayoría de las teclas rápidas son similares a las de Emacs. Esta
variable puede tener el valor 'emacs' o 'vi'.
echo-control-characters
Cuando está establecida en 'on' en sistemas operativos que indican que lo
soportan, Readline mostrará un carácter correspondiente a una señal generada
desde el teclado. El valor por defecto es 'on'.
enable-keypad
Cuando está establecida en 'on'. Readline intentará activar el teclado de la
aplicación cuando sea llamado. Algunos sistemas necesitan esto para activar
las teclas de cursor (flechas). El valor por defecto es 'off'.
enable-meta-key
Cuando está establecida en 'on'. Readline intentará activar cualquier tecla
meta modificador que el terminal afirme soportar cuando sea llamado. En
muchos terminales, la tecla Meta se utiliza para enviar caracteres de ocho bits.
El valor por defecto es 'on'.
expand-tilde
Si está establecida en 'on' se realizará expansión de tildes cuando Readline
intente completar palabras. El valor por defecto es 'off'.
history-preserve-point
Si está establecida en 'on' el código de historia intentará situar el puntero (la
posición actual del cursor) en la misma localización en cada línea de historia
obtenida con previus-history o next-history. El valor por defecto es 'off'.
history-size
Establece el máximo número de entradas de historia guardadas en la lista de
historia. Si se establece a cero, el número de entradas en la lista de historia no
está limitada.
horizontal-scroll-mode
Esta variable puede ser establecida a ' on' o 'off', Establecerla a 'on' significa
que el texto de las líneas que están siendo editadas se desplazará horizontal-
mente en una única línea de pantalla cuando estas sean más largas que la
anchura de la pantalla, en vez de descender a una nueva línea de pantalla. Por
defecto, esta variable está establecida a 'off'.
input-meta
Si está establecida a 'on'. Readline activará la entrada de ocho bit (esto no
limpiará el octavo bit en los caracteres que lea), sin importar lo que el

Página 104
Capítulo 8: Edición de la línea de comandos

terminal afirme que puede soportar. El valor por defecto es ' off'. El nombre
meta-flag es un sinónimo para esta variable.
isearch-terminators
La cadena de caracteres que debería terminar una búsqueda incremental sin
ejecutar posteriormente el carácter como un comando (vea la Sección 8.2.5
[Busquedas]). Si esta variable no tiene un valor asignado, los caracteres ESC y
C-J terminarán la búsqueda incremental.
keymap
Establece la idea de Readline del mapa de teclas actual para los comandos de
asociación de teclas. Los nombres aceptables para keymap son emacs, emacs-
standard, emacs-meta, emacs-ctlx, vi, vi-move, vi-command y vi-insert. vi es
equivalente a vi-command; emacs es equivalente a emacs-standard. El valor
por defecto es emacs. El valor de la variable editing- mode también afecta al
mapa de teclas por defecto.

mark-directories
Si está establecida a 'on', los nombres de directorio completados terminarán
con una barra inclinada. El valor por defecto es 'on'.
mark-modified-lines
Esta variable, cuando está establecida en ' on', produce que Readline muestre
un asterisco ('*') al comienzo de las líneas de historia que hayan sido
modificadas. Esta variable está en 'off' por defecto.
mark-symlinked-directories
Si está establecida a 'on', los nombres completados que son enlaces simbólicos
a directorios presentan una barra invertida añadida al final (obedeciendo al
valor de mark-directories ). El valor por defecto es 'off'
match-hidden-files
Esta variable, cuando está establecida en 'on', produce que Readline encuentre
ficheros cuyos nombres comiencen con un '.' (ficheros ocultos) cuando realiza
un completado de nombres de fichero. Si su valor es 'off' no mostrará los
archivos ocultos a menos que el usuario suministre el '.' inicial en el nombre
de archivo a completar. Esta variable está en 'on' por defecto.
output-meta
Si está establecida a 'on', Readline mostrará directamente los caracteres con el
octavo bit establecido, en vez de como una secuencia de escape meta-
prefijada. El valor por defecto es 'off'.
page-completions
Si está establecida en 'on', Readline utiliza un paginador interno tipo more
para mostrar una pantalla completa de posibles completados a la vez. Esta
variable está en 'on' por defecto.
print-completions-horizontally
Si está establecida en 'on', Readline mostrará los completados que concuerdan
ordenados horizontalmente en orden alfabético, en vez de descender por la
pantalla. El valor por defecto es 'off'.

Página 105
Capítulo 8: Edición de la línea de comandos

revert-all-at-newline
Si está establecida en 'on', Readline deshará todos los cambios en las líneas de
historia antes de retornar cuando se ejecute accept-line (aceptar línea). Por
defecto, las líneas de historia se pueden modificar y mantienen listas de
deshacer individuales mediante llamadas a readline. El valor por defecto es
'off'.
show-all-if-ambiguous
Esta variable altera el comportamiento por defecto de las funciones de
completado. Si está establecida a 'on' las palabras que tienen más de un
completado posible producirán que las concordancias sean listadas
inmediatamente en vez de hacer sonar la campana. El valor por defecto es
'off'.
show-all-if-unmodified
Esto altera el comportamiento por defecto de las funciones de completado de
modo similar a show-all-if-ambiguous . Si está establecida en 'on', las palabras
que tengan más de un completado posible sin ningún completado parcial
posible (los completados posibles no comparten un prefijo común) producen
que las concordancias sean listadas inmediatamente en vez de hacer sonar la
campana. El valor por defecto es 'off'.
skip-completed-text
Si está establecida en 'on' modifica el comportamiento de completado por
defecto cuando se inserta una única concordancia dentro de la línea. Este
efecto sólo está activo cuando se realiza el completado en medio de una
palabra. Si está activada, readline no inserta caracteres desde el completado
que concuerden con los caracteres a partir de la posición actual en la palabra
que está siendo completada. Por ejemplo, si está activado, intentar el
completado cuando el cursor está tras la 'e' en 'Makefile' resultará en
'Makefile' en vez de en 'Makefilefile', asumiendo que hay un único
completado posible. El valor por defecto es 'off'.
visible-stats
Si está establecida en 'on', cuando se listan los completados posibles para un
nombre de fichero se añade un carácter al final que indica el tipo de fichero. El
valor por defecto es 'off'.
Asociaciones de teclas
La sintaxis para controlar de teclas en el archivo de inicialización es simple. Primero
necesita encontrar el nombre del comando que desea cambiar. La sección siguiente
contiene tablas con los nombres de comando, las teclas rápidas que tiene asociadas por
defecto, si las hay, y una descripción corta de qué hace el comando.
Una vez que conozca el nombre del comando, simplemente sitúe en una línea del archivo
de inicialización el nombre de la tecla que desea enlazar con el comando, un dos puntos
':', y luego el nombre del comando. No puede haber espacios entre el nombre de la tecla y
el dos puntos – esto se interpretará como parte del nombre de la tecla. El nombre de la
tecla puede expresarse de diferentes formas, en función de lo que le resulte más cómodo.
Readline permite que las teclas se enlacen, además de a los nombres de comando, a
cadenas que son insertadas cuando se presiona una tecla (una macro).

Página 106
Capítulo 8: Edición de la línea de comandos

El comando bind -p muestra los nombres de funciones de Readline y sus asociaciones de


forma que la salida pueda ser insertada directamente en un archivo de inicialización. Vea
la Sección 4.2 [Comandos Internos de Bash].
nomTecla: nombre_función o macro
nomTecla es el nombre de la tecla deletreada en inglés. Por ejemplo:
Control-u: universal-argument
Meta-Rubout: backward-kill-word
Control-o: “> salida”
En el ejemplo anterior, C-u se enlaza a la función universal-argument, M-DEL
se enlaza con la función backward-kill-word, y C-o se enlaza con la ejecución
de la macro expresada en el lado derecho (esto es, insertar el texto '> salida' en
la línea).
Se reconocen varios nombres de carácter simbólicos mientras que se procesa
esta sintaxis de enlazado de teclas: DEL, ESC, ESCAPE, LFD, NEW-LINE,
RET, RETURN, RUBOUT, SPACE, SPC y TAB.
“secTeclas”: nombre_funcion o macro
secTeclas se diferencia del anterior nomTeclas en que se puede especificar
una secuencia completa de teclas, situando la secuencia de teclas entre dobles
comillas. Se pueden usar algunas teclas de escape de tipo GNU Emacs, como
en el ejemplo siguiente, pero los nombres de caracteres especiales no son
reconocidos.
“\C-u”: universal-argument (argumento universal)
“\C-x\C-r”: re-read-init-file (relee el archivo de
inicialización)
“\e[11~”: “Tecla de Función 1” (tecla de función 1)
En el ejemplo anterior, C-u se asigna de nuevo a la función ( universal-
argument) (como en el primer ejemplo). 'C-x C-r' se asigna a la función re-
read-init-file, y 'ESC [ 1 1 ~' se enlaza para insertar el texto “Tecla de Función
1”
Están disponibles las siguientes secuencias de escape de estilo GNU Emacs cuando se
especifican secuencias de teclas:
\C- prefijo control
\M- prefijo meta
\e un carácter escapado
\\ barra invertida
\” “, una marca de dobles comillas
\' ', una comilla simple o apóstrofo
Adicionalmente a las secuencias de escape de estilo GNU Emacs, está disponible un
segundo juego de caracteres escapados mediante barra invertida:
\a alerta (campana)
\b retroceso
\d borrado

Página 107
Capítulo 8: Edición de la línea de comandos

\f
\n nueva línea.
\r retorno de carro.
\t tabulación horizontal.
\v tabulación vertical.
\nnn El carácter de ocho bits cuyo valor es el valor octal nnn (de uno a tres
dígitos).
\xHH El carácter de ocho bits cuyo valor es el valor hexadecimal HH (uno o dos
dígitos hexadecimales).
Cuando se introduce el texto de una macro, se debe usar comillas dobles o simples para
indicar una definición de macro. El texto sin entrecomillar se considera un nombre de
función. En el cuerpo de una macro se expanden las cadenas escapadas con barra invertida
que se indican más arriba. La barra invertida entrecomillará cualquier otro carácter en el
texto de la macro, incluyendo '”' y '''. Por ejemplo, el siguiente enlace hará que 'C-x \'
inserte una simple '\' en la línea:
“\C-x\\”: “\\”

8.3.2.- Construcciones de inicialización condicionales


Readline implementa una característica similar en espíritu a las características de compilación
condicional del preprocesador de C que permite que los asociaciones de teclas y los ajustes de
variables se realicen como resultado de algunas comprobaciones. Hay cuatro directivas de análisis
utilizadas.
$if La construcción $if permite que las asociaciones se hagan en base al modo de edición, el
terminal que está siendo usado, o la aplicación que utiliza a Readline. El texto de la
comprobación se extiende hasta el final de la línea; no se requiere ningún carácter para
aislarla.
mode La forma mode= de la directiva $if se utiliza para comprobar cuando
Readline se encuentra en modo emacs o vi. Esto se puede utilizar junto con
el comando 'set keymap' por ejemplo, para establecer asociaciones en los
mapas de teclado 'emacs-standard y emacs-ctlx sólo si Readline está
iniciándose en modo emacs.
term La forma term= se puede utilizar para incluir asociaciones de teclas
específicas del terminal, quizás para asociar las secuencias de teclas
generadas por las teclas de función del terminal. La palabra a la derecha del
'=' se compara con el nombre completo del terminal y con la porción anterior
al primer '-' del nombre de terminal. Esto permite, por ejemplo, que sun
encaje tanto con sun como con sun-cmd.
application
La construcción application se utiliza para incluir ajustes específicos
para la aplicación. Cada programa que utilice la librería Readline establece
el nombre de aplicación que podemos comprobar en busca de un valor en

Página 108
Capítulo 8: Edición de la línea de comandos

particular. Esto se puede utilizar para enlazar secuencias de teclas a


funciones útiles para un programa específico. Por ejemplo, el siguiente
comando añade una secuencia de teclas que entrecomilla la palabra actual o
previa en Bash:
$if Bash
# Entrecomilla la palabra previa o la actual
"\C-xq": "\eb\"\ef\""
$endif
$endif Este comando, como se ve en el ejemplo anterior, termina un comando $if.
$else Los comandos en esta rama de la directiva $if se ejecutan si la comprobación falla.
$include
Esta directiva toma un único nombre de fichero como argumento y lee comandos y
enlaces desde ese fichero. Por ejemplo, la siguiente directiva lee desde '/etc/inputrc':
$include /etc/inputrc

8.3.3.- Ejemplo de Fichero de Inicialización


A continuación tenemos un ejemplo de un fichero inputrc. Este muestra la asociación de teclas, la
asignación de variables y la sintaxis condicional.
# This file controls the behaviour of line input editing for
# programs that use the GNU Readline library. Existing
# programs include FTP, Bash, and GDB.
#
# You can re-read the inputrc file with C-x C-r.
# Lines beginning with ’#’ are comments.
#
# First, include any systemwide bindings and variable
# assignments from /etc/Inputrc
$include /etc/Inputrc

#
# Set various bindings for emacs mode.

set editing-mode emacs

$if mode=emacs

Meta-Control-h: backward-kill-word Text after the function name is


ignored
#
# Arrow keys in keypad mode
#
#"\M-OD": backward-char
#"\M-OC": forward-char
#"\M-OA": previous-history
#"\M-OB": next-history
#
# Arrow keys in ANSI mode
#

Página 109
Capítulo 8: Edición de la línea de comandos

"\M-[D": backward-char
"\M-[C": forward-char
"\M-[A": previous-history
"\M-[B": next-history
#
# Arrow keys in 8 bit keypad mode
#
#"\M-\C-OD": backward-char
#"\M-\C-OC": forward-char
#"\M-\C-OA": previous-history
#"\M-\C-OB": next-history
#
# Arrow keys in 8 bit ANSI mode
#
#"\M-\C-[D": backward-char
#"\M-\C-[C": forward-char
#"\M-\C-[A": previous-history
#"\M-\C-[B": next-history

C-q: quoted-insert

$endif

# An old-style binding. This happens to be the default.


TAB: complete
$if Bash
# edit the path
"\C-xp": "PATH=${PATH}\e\C-e\C-a\ef\C-f"
# prepare to type a quoted word --
# insert open and close double quotes
# and move to just after the open quote
"\C-x\"": "\"\"\C-b"
# insert a backslash (testing backslash escapes
# in sequences and macros)
"\C-x\\": "\\"
# Quote the current or previous word
"\C-xq": "\eb\"\ef\""
# Add a binding to refresh the line, which is unbound
"\C-xr": redraw-current-line
# Edit variable on current line.
"\M-\C-v": "\C-a\C-k$\C-y\M-\C-e\C-a\C-y="
$endif

# use a visible bell if one is available


set bell-style visible

# don’t strip characters to 7 bits when reading


set input-meta on

# allow iso-latin1 characters to be inserted rather

Página 110
Capítulo 8: Edición de la línea de comandos

# than converted to prefix-meta sequences


set convert-meta off

# display characters with the eighth bit set directly


# rather than as meta-prefixed characters
set output-meta on

# if there are more than 150 possible completions for


# a word, ask the user if he wants to see all of them
set completion-query-items 150

# For FTP
$if Ftp
"\C-xg": "get \M-?"
"\C-xt": "put \M-?"
"\M-.": yank-last-arg
$endif

8.4.- Comandos enlazables de Readline


Esta sección describe comandos de Readline que pueden ser asociados a secuencias de teclas. Usted
puede listar sus asociaciones de teclas ejecutando bind -P o bind -p (vea la Sección 4.2
[Comandos Internos de Bash]) para obtener un formato más escueto, apropiado para un fichero
inputrc. Los nombres de comandos sin una secuencia de teclas adjunta son desligados por defecto.
En las descripciones siguientes, punto (point) se refiere a la posición actual del cursor, y marca
(mark) se refiere a una posición del cursor guardada por el comando set-mark. El texto entre el punto
y la marca se denomina región.
8.4.1.- Comandos de Movimiento
beginning-of-line (C-a)
Avanza hasta el principio de la línea actual.
end-of-line (C-e)
Retrocede hasta el final de la línea.
forward-char (C-f)
Desplaza un carácter hacia adelante.
backward-char (C-b)
Desplaza un carácter hacia atrás.
forward-word (M-f)
Avanza hasta el final de la siguiente palabra. Las palabras están compuestas de letras y
dígitos.
backward-word (M-b)
Retrocede hasta el comienzo de la palabra actual o la palabra previa. Las palabras están
compuestas de letras y dígitos.
shell-forward-word ()
Avanza hasta el final de la siguiente palabra. Las palabras están delimitadas por
metacaracteres de la shell no entrecomillados.

Página 111
Capítulo 8: Edición de la línea de comandos

shell-backward-word ()
Retrocede hasta el comienzo de la palabra actual o la palabra previa. Las palabras están
delimitadas por metacaracteres de la shell no entrecomillados.
clear-screen (C-l)
Limpia la pantalla y redibuja la línea actual en la parte alta de la pantalla.
redraw-current-line ()
Refresca la línea actual. Por defecto no está asociado a ninguna tecla.

8.4.2.- Comandos para Manipular la Historia


accept-line (Nueva_línea o Return)
Acepta la línea sin importar donde esté el cursor. Si esta línea no está vacía, la añade a la
lista de historia de acuerdo a los ajustes de las variables HISTCONTROL y HISTIGNORE .
Si esta línea es una línea de historia modificada, entonces devuelve la línea de historia a su
estado original.
previous-history (C-p)
Retrocede en la lista de historia, obtiene el comando previo.
next-history (C-n)
Avanza en la lista de historia, obtiene el comando siguiente.
beginning-of-history (M-<)
Mueve a la primera línea en la historia
end-of-history (M->)
Mueve al final de la historia, esto es, la línea que se está introduciendo actualmente
reverse-search-history (C-r)
Busca hacia atrás comenzando en la línea actual y moviéndose hacia arriba a través de la
historia tanto como sea necesario. Esta es una búsqueda incremental.
forward-search-history (C-s)
Busca hacia adelante comenzando en la línea actual y moviéndose hacia abajo a través de
la historia tanto como sea necesario. Esta es una búsqueda incremental.
non-incremental-reverse-search-history (M-p)
Busca hacia atrás comenzando en la línea actual y moviéndose hacia arriba a través de la
historia tanto como sea necesario utilizando una búsqueda no incremental para una cadena
suministrada por el usuario.
non-incremental-forward-search-history (M-n)
Busca hacia adelante comenzando en la línea actual y moviéndose hacia abajo a través de
la historia tanto como sea necesario utilizando una búsqueda no incremental para una
cadena suministrada por el usuario.
history-search-forward ()
Busca hacia adelante a través de la historia para la cadena de caracteres entre el comienzo
de la línea actual y el punto. Esta es una búsqueda no incremental. Por defecto, este
comando no está asociado a ninguna tecla.

Página 112
Capítulo 8: Edición de la línea de comandos

yank-nth-arg (M-C-y)
Inserta el primer argumento al comando previo (normalmente la segunda palabra de la
línea previa) en el punto. Con un argumento n, inserta la palabra n-ésima desde el
comando previo (las palabras en el comando previo comienzan con una palabra 0). Un
argumento negativo inserta la palabra n-ésima desde el final del comando previo. Una vez
que se computa el argumento n, este argumento es extraído como si se hubiese
especificado el comando de expansión de historia '!n'.
yank-last-arg (M-. o M-_)
Inserta el último argumento del comando previo (la última palabra de la entrada anterior
de la historia). Con un argumento, se comporta exactamente como yank-nth-arg.
Llamadas sucesivas a yank-last-arg retrocederán a través de la lista de historia, insertando
el último argumento de cada línea sucesivamente. Se utilizan las características de
expansión de la historia para extraer el último argumento, como si se hubiese especificado
el comando de expansión de la historia '!$'.

8.4.3.- Comandos para Modificar el Texto


delete-char (C-d)
Borra el carácter en el punto. Si el punto está el comienzo de la línea, no hay caracteres en
la línea, y el último carácter introducido no está asociado a delete-char, entonces devuelve
EOF.
backward-delete-char (Rubout)
Borra el carácter detrás del cursor. Un argumento numérico significa cortar los caracteres
en vez de eliminarlos.
forward-backward-delete-char ()
Borra el carácter bajo el cursor, a menos que el cursor esté al final de la línea, en cuyo
caso se borra el carácter detrás del cursor. Por defecto no está asociado a ninguna tecla.
quoted-insert (C-q o C-v)
Añade el siguiente carácter introducido a la línea tal cual. Así se pueden insertar
secuencias de teclas como C-q, por ejemplo.
self-insert (a, b, A, 1, !, …)
Se insertan a sí mismas
transpose-chars (C-t)
Arrastra el carácter anterior al cursor hacia adelante sobre el carácter en la posición del
cursor, avanzando también el cursor. Si el punto de inserción está al final de la línea,
entonces esto transpone los dos últimos caracteres de la línea.
transpose-words (M-t)
Arrastra la palabra anterior al punto hasta la palabra sobre la que se encuentra el punto, o
la siguiente si el punto está en un separador de palabras, avanzando también el punto hasta
justo después de la segunda palabra.
upcase-word (M-u)
Cambia a mayúsculas la palabra actual (o la siguiente). Con un argumento negativo,
cambia a mayúsculas la palabra anterior, pero no mueve el cursor.

Página 113
Capítulo 8: Edición de la línea de comandos

downcase-word (M-l)
Cambia a minúsculas la palabra actual (o la siguiente). Con un argumento negativo,
cambia a minúsculas la palabra anterior, pero no mueve el cursor.
capitalize-word (M-c)
Capitaliza la palabra actual (o la siguiente). Con un argumento negativo, capitaliza la
palabra anterior, pero no mueve el cursor.
overwrite-mode ()
Conmuta el modo de sobreescritura. Con un argumento explícito de valor numérico
positivo, cambia al modo de sobreescritura. Con un argumento explícito de valor numérico
negativo, cambia al modo de inserción. Este comando afecta sólo al modo emacs; el modo
vi sobreescribe de forma diferente. Cada llamada a readline() se inicia en el modo de
inserción.
En modo de sobreescritura, los caracteres enlazados a self-insert reemplazan el texto en el
punto en vez de empujar el texto hacia la derecha. Los caracteres que enlazan con
backward-delete-char reemplazan el carácter anterior al punto con un espacio.
Por defecto, este comando no está asociado a ninguna tecla.

8.4.4.- Cortando y Pegando


kill-line (C-k)
Corta el texto desde el punto hasta el final de la línea
backward-kill-line (C-x Rubout)
Corta hacia atrás hasta el comienzo de la línea.
unix-line-discard (C-u)
Corta hacia atrás desde el cursor hasta el comienzo de la línea.
kill-whole-line ()
Corta todos los caracteres en la línea actual, no importa donde esté el punto. Por defecto
no está asociado a ninguna tecla.
kill-word (M-d)
Corta desde el punto hasta el final de la palabra actual, o si se encuentra entre palabras,
hasta el final de la siguiente palabra. Los límites de palabra son los mismos que en
forward-word.
backward-kill-word (M-DEL)
Corta la palabra anterior al punto. Los límites de palabra son los mismos que en
backward-word.
shell-kill-word ()
Corta desde el punto hasta el final de la palabra actual, o si se encuentra entre palabras,
hasta el final de la siguiente palabra. Los límites de palabra son los mismos que en shell-
forward-word.
backward-kill-word ()
Corta la palabra anterior al punto. Los límites de palabra son los mismos que en
shell- backward-word.
unix-word-rubout ()

Página 114
Capítulo 8: Edición de la línea de comandos

Corta la palabra anterior al punto, usando el carácter espacio en blanco como limitador de
palabra. El texto cortado se guarda en el anillo de corte.
unix-filename-rubout ()
Corta la palabra anterior al punto, usando los caracteres espacio en blanco y barra
inclinada como limitadores de palabra. El texto cortado se guarda en el anillo de corte.
delete-horizontal-space ()
Borra todos los espacios y tabuladores alrededor del punto. Por defecto no está asociado a
ninguna tecla.
kill-region ()
Corta el texto en la región actual. Por defecto este comando no está asociado a ninguna
tecla.
copy-region-as-kill ()
Copia el texto en la región a la memoria intermedia (buffer) de corte, de forma que puede
ser pegado en seguida. Por defecto, este comando no está asociado a ninguna tecla.
copy-backward-word ()
Copia la palabra anterior al punto a la memoria intermedia de corte. Los límites de corte
son los mismos que en backward-word. Por defecto, este comando no está asociado a
ninguna tecla.
copy-forward-word ()
Copia la palabra que sigue al punto a la memoria intermedia de corte. Los límites de
palabra son los mismos que en forward-word. Por defecto, este comando no está asociado
a ninguna tecla.
yank (C-y)
Pega la cima del anillo de corte dentro de la memoria intermedia en la posición del punto.
yank-pop (M-y)
Gira el anillo de corte, y pega la nueva cima. Sólo se puede hacer esto si el comando
anterior es yank o yank-pop.

8.4.5.- Especificando Argumentos Numéricos


digit-argument (M-0, M-1, …, M--)
Añade este dígito al argumento existente acumulativamente, o inicia un nuevo argumento.
M-- comienza un argumento negativo.
universal-argument ()
Esta es otra forma de especificar un argumento. Si este comando es seguido de uno o más
dígitos, opcionalmente con un signo menos al comienzo, estos dígitos definen el
argumento. Si el comando es seguido por dígitos, ejecutar universal-argument de nuevo
finaliza el argumento numérico pero en caso contrario no se tiene en cuenta. Como caso
especial, si este comando es seguido inmediatamente por un carácter que no es un dígito
ni un signo menos, el número del argumento para el siguiente comando se multiplica por
cuatro. El número de argumento inicialmente es uno, de forma que ejecutar esta función
la primera vez hace que el número de argumento sea cuatro, una segunda vez hace que el
número de argumento sea dieciséis, y así sucesivamente. Por defecto este comando no está
asociado a ninguna tecla.

Página 115
Capítulo 8: Edición de la línea de comandos

8.4.6.- Permitiendo que Readline introduzca caracteres por tí


complete (TAB)
Intenta realizar un completado en el texto anterior al punto. El completado actual es
específico de la aplicación. Bash intenta completar tratando el texto como una variable (si
el texto comienza con '$'), un nombre de usuario (si el texto comienza con '~'), un nombre
de anfitrión (si el texto comienza con '@'), o un comando (incluyendo alias y funciones)
por ese orden. Si ninguno de estos intentos produce una concordancia, se intenta un
completado de nombres de fichero.
possible-completions (M-?)
Lista los completados posibles del texto anterior al punto.
insert-completions (M-*)
Inserta todos los completados del texto anterior al punto que habrían sido generados por
possible-completions.
menu-complete ()
Similar a complete, pero reemplaza la palabra a completar con una única concordancia de
la lista de completados posibles. La ejecución repetida de menu- complete avanza a través
de la lista de posibles completados, insertando cada concordancia por orden. Al final de la
lista de completados, se hace sonar una campana (obedeciendo al valor de bell-style) y se
restaura el texto original. Un argumento n mueve n posiciones hacia adelante en la lista de
concordancias; se puede utilizar un argumento negativo para desplazarse hacia atrás en la
lista. Este comando busca estar asociado a TAB, pero no está asociado por defecto.
menu-complete-backward ()
Es idéntico a menu-complete, salvo que se desplaza hacia atrás en la lista de completados
posibles, como si se hubiese proporcionado un argumento negativo a menu-complete.
delete-char-or-list()
Borra el carácter bajo el cursor si no está al principio o al final de la línea (como
delete- char). Si está al final de la línea se comporta de forma idéntica a
possible- completions. Este comando no está asociado por defecto.
complete-filename (M-/)
Intenta un completado de nombres de fichero en el texto anterior al punto.
possible-filename-completions (C-x /)
Lista los posibles completados del texto anterior al punto, tratándolo como un nombre de
fichero.
complete-username (M-~)
Intenta el completado del texto anterior al punto, tratándolo como un nombre de usuario.
possible-username-completions (C-x ~)
Lista los completados posibles del texto anterior al punto, tratándolo como un nombre de
usuario.
complete-variable (M-$)
Intenta el completado del texto anterior al punto, tratándolo como una variable de shell.
possible-variable-completions (C-x $)
Lista los completados posibles del texto anterior al punto, tratándolo como una variable de

Página 116
Capítulo 8: Edición de la línea de comandos

shell.
complete-hostname (M-@)
Intenta el completado del texto anterior al punto, tratándolo como un nombre de anfitrión
(host).
possible-hostname-completions (C-x @)
Lista los completados posibles para el texto anterior al punto, tratándolo como un nombre
de anfitrión.
complete-command (M-!)
Intenta el completado del texto anterior al punto, tratándolo como un nombre de
comando. El completado de comandos intenta concordar el texto contra alias, palabras
reservadas, funciones de shell, comandos internos de la shell, y finalmente, nombres de
ficheros ejecutables, en ese orden.
possible-command-completions (C-x !)
Lista los completados posibles del texto anterior al punto, tratándolo como un nombre de
comando.
dynamic-complete-history (M-TAB)
Intenta completar el texto anterior al punto comparando dicho texto con las líneas de la
lista de historia para encontrar posibles completados.
dabbrev-expand ()
Intenta el completado de menú en el texto anterior al punto comparando el texto con las
líneas de historia para encontrar posibles completados.
complete-into-braces (M-{)
Realiza el completado de nombre de fichero e inserta la lista de completados posibles
encerrada entre llaves de forma que esté disponible para la shell (vea la Sección 3.5.1
[Expansión de Llaves]).

8.4.7.- Macros de Teclado


start-kbd-macro (C-x ()
Inicia la grabación de los caracteres introducidos dentro de la macro de teclado actual.
end-kbd-macro (C-x ))
Detiene la grabación de los caracteres introducidos en la macro de teclado actual y guarda
la definición.
call-last-kbd-macro (C-x e)
Vuelve a ejecutar la macro de teclado definida más recientemente, haciendo que los
caracteres introducidos en la macro aparezcan como si hubiesen sido introducidos por el
teclado.

8.4.8.- Algunos comandos variados


re-read-init-file (C-x C-r)
Lee el contenido del fichero inputrc y añade cualquier asociación o asignación de variable
que encuentre en él.

Página 117
Capítulo 8: Edición de la línea de comandos

abort (C-g)
Cancela el comando de edición actual y hace sonar la campana (obedeciendo a la variable
bell-style ).
do-uppercase-version (M-a, M-b, M-x, …)
Si el carácter x en M-x está en minúsculas ejecuta el comando enlazado con el carácter
mayúsculas correspondiente.
prefix-meta (ESC)
Prefija con Meta el siguiente carácter introducido. Es útil en teclados que no poseen una
tecla meta. Introducir 'ESC f' es equivalente a introducir M-f.
undo (C-_ o C-x C-u)
Deshace de forma incremental, recordado aisladamente para cada línea.
revert-line (M-r)
Deshace todos los cambios realizados en esta línea. Esto es cómo ejecutar el comando
undo las veces suficientes para volver al principio.
tilde-expand (M-&)
Realiza la expansión de tilde en la palabra actual.
set-mark (C-@)
Establece la marca en el punto. Si se suministra un argumento numérico la marca se
establece en esa posición.
exchange-point-and-mark (C-x C-x)
Intercambia el punto con la marca. La posición actual del cursor se establece en la
posición guardada, y la posición del cursor se guarda como la marca.
character-search (C-])
Se lee un carácter y se mueve el punto a la siguiente ocurrencia de ese carácter. Una
cuenta negativa busca ocurrencias previas.
character-search-backward (M-C-])
Se lee un carácter y se mueve el punto a la ocurrencia previa de ese carácter. Una cuenta
negativa busca ocurrencias siguientes.
skip-csi-sequence ()
Lee los caracteres suficientes para consumir una secuencia de teclas múltiple como las
definidas para teclas como Home y End. Estas secuencias comienzan con un Indicador de
Control de Secuencia (CSI), normalmente ESC-[. Si esta secuencia está enlazada a “\e[”,
las teclas que producen tales secuencias no tendrán efecto a menos que se enlace
explícitamente a un comando de Readline, en vez de insertar caracteres en la memoria
intermedia de edición. Por defecto no está asociado, pero normalmente se asocia con
ESC-[.
insert-comment (M-#)
Sin argumento numérico el valor de la variable comment-begin se inserta al principio de
la línea actual. Si se suministra un valor numérico este comando actúa como un
interruptor; si los caracteres del principio de la línea no concuerdan con el valor de
comment- begin se inserta su valor, en caso contrario se borran los caracteres contenidos
en comment- begin del comienzo de la línea. En cualquier caso, se acepta la línea como si

Página 118
Capítulo 8: Edición de la línea de comandos

se hubiese introducido un carácter nueva línea. El valor por defecto de comment- begin
produce que este comando convierta la línea actual en un comentario de la shell. Si un
argumento numérico provoca que se elimine el carácter de comentario la línea será
ejecutada por la shell.
dump-functions ()
Imprime todas las funciones y sus asociaciones de teclas en el flujo de salida de Readline.
Si se suministra un valor numérico, la salida se formatea de forma que pueda formar parte
de un fichero inputrc. Por defecto este comando no está asociado a ninguna tecla.
dump-variables ()
Imprime todas las variables modificables y sus valores en el flujo de salida de Readline. Si
se suministra un argumento numérico la salida se formatea de forma que pueda formar
parte de un fichero inputrc. Por defecto este comando no está asociado a ninguna tecla.
dump-macros ()
Imprime todas las secuencias de teclas de Readline enlazadas a macros y las cadenas de
salida que les corresponden. Si se suministra un argumento numérico la salida se formatea
de forma que pueda formar parte de un fichero inputrc. Por defecto este comando no está
asociado a ninguna tecla.
glob-complete-word (M-g)
La palabra anterior al punto se trata como un patrón para expansión de rutas, con un
asterisco añadido implícitamente al final. Este patrón se utiliza para generar una lista de
nombres concordantes para formar posibles completados.
glob-expand-word (C-x *)
La palabra anterior al punto se trata como un patrón para expansión de rutas y la lista de
nombres concordantes se inserta, reemplazando a dicha palabra. Si se suministra un
argumento numérico, se añade un '*' al final de la palabra antes de realizar la expansión de
rutas.
glob-list-expansions (C-x g)
Se muestra la lista de expansiones que se podrían generar por glob-expand-word, y se
redibuja la línea. Si se suministra un argumento numérico, se añade un ' *' al final de la
palabra antes de realizar la expansión de rutas.
display-shell-version (C-x C-v)
Muestra información de versión de la instancia actual de Bash.
shell-expand-line (M-C-e)
Expande la línea como lo hace la shell. Este comando realiza expansión de alias y de
historia así como todas las expansiones de palabra de la shell (vea la Sección 3.5
[Expansiones de la Shell]).
history-expand-line (M-^)
Realiza la expansión de historia en la línea actual.
magic-space ()
Realiza expansión de la historia en la línea actual e inserta un espacio (vea la Sección 9.3
[Interaccionando con la Historia]).

Página 119
Capítulo 8: Edición de la línea de comandos

alias-expand-line ()
Realiza expansión de alias en la línea actual (vea la Sección 6.6 [Alias]).
historiy-and-alias-expand-line ()
Realiza la expansión de la historia y de alias en la línea actual.
insert-last-argument (M-. o M-_)
Es un sinónimo para yank-last-arg.
operate-and-get-netx (C-o)
Acepta la línea actual para su ejecución y trae la siguiente línea con respecto a la línea
actual de la historia para su edición. Se ignora cualquier argumento suministrado.
edit-and-execute-command (C-xC-e)
Invoca a un editor en la línea de comandos actual y ejecuta el resultado como un comando
de la shell. Bash intenta invocar como editor a $VISUAL , $EDITOR y emacs en ese orden.

8.5.- Modo vi de Readline


Aunque la librería Readline no tiene un juego completo de funciones de edición de vi, sí contiene lo
suficiente para permitir la edición simple de la línea. El modo vi de Readline se comporta como se
especifica en el estándar POSIX 1003.2.
Se utilizan los comandos 'set -o emacs' y 'set -o vi' para intercambiar interactivamente entre
los modos de edición emacs y vi (vea la Sección 4.3.1 [El Comando Interno Set]). El modo por
defecto de Readline es el modo emacs.
Cuando introduzca una línea en el modo de edición de vi, se encontrará en el modo de inserción
cómo si hubiese introducido una 'i'. Presionar ESC le cambiará al modo 'command', donde podrá
editar el texto de la línea con las teclas de movimiento estándares de vi, moverse a las líneas anteriores
de la historia con 'k' y a las líneas siguientes con 'j', y así sucesivamente.

8.6.- Completado Programable


Las características de completado programable se invocan cuando se intenta un completado de palabra
para un argumento de un comando para el cual se ha definido una especificación de completado (un
compspec) usando el comando interno complete (vea la Sección 8.7 [Comandos Internos para el
Completado Programable]).
Primero, se identifica el nombre del comando. Si se ha definido un compspec para ese comando
este se utiliza para generar la lista de completados posibles para la palabra. Si la palabra es la cadena
vacía (se intenta el completado al inicio de una línea vacía), se utiliza cualquier compspec definido
con la opción '-E' del comando interno complete. Si la palabra es una ruta completa, primero se busca
un compspec para la ruta completa. Si no se encuentra un compspec para la ruta completa, se intenta
encontrar un compspec para la parte que sigue a la última barra inclinada. Si estas búsquedas no
encuentran un compspec, se utilizará por defecto cualquier compspec definido con la opción '-D' del
comando interno complete.
Una vez que se ha encontrado un compspec, este se utiliza para generar la lista de palabras
concordantes. Si no se encuentra ningún compspec, se realiza el completado por defecto de Bash
descrito anteriormente (vea la Sección 8.4.6 [Comandos para Completado]).
Primero, se utilizan las acciones especificadas por el compspec. Sólo se devuelven las palabras
que son prefijadas por la palabra que está siendo completada. Cuando se utiliza la opción ' -f' o '-d'
para un completado de nombre de fichero o de directorio, se utiliza la variable de shell FIGNORE para
filtrar las concordancias. Vea la Sección 5.2 [Variables de Bash], para una descripción de FIGNORE.

Página 120
Capítulo 8: Edición de la línea de comandos

Después se genera cualquier completado especificado para la opción '-G' con un patrón de
expansión de nombres de fichero. Las palabras generadas por el patrón no necesitan concordar con la
palabra que está siendo completada. La variable de shell GLOBIGNORE no se utiliza para filtrar las
concordancias, pero sí la variable FIGNORE.
Después, se considera la cadena especificada como argumento para la opción ' -W'. La cadena
primero se divide usando como delimitadores los caracteres contenidos en la variable especial IFS. Se
respeta el entrecomillado de la shell. Cada palabra se expande a continuación utilizando expansión de
llaves, expansión de tildes, expansión de parámetros y variables, sustitución de comandos y expansión
aritmética como se describió anteriormente (vea la Sección 3.5 [Expansiones de la Shell]). Los
resultados se separan utilizando las reglas descritas con anterioridad (vea la Sección 3.5.7 [Separación
de Palabras]). Los resultados de la expansión son concordancias prefijadas por la palabra que está
siendo completada, y las palabras concordantes se convierten en posibles completados.
Después de generar estas concordancias, se invoca a cualquier función de shell o cualquier
comando especificado con las opciones '-F' y '-C' respectivamente. Cuando se invoca al comando o la
función se asignan valores a las variables COMP_LINE , COMP_POINT , COMP_KEY Y
COMP_TYPE cómo se describió anteriormente (vea la Sección 5.2 [Variables de Bash]). Si se está
invocando una función de shell también se asignan las variables COMP_WORDS y COMP_CWORD .
Cuando se invoca a la función o el comando, el primer argumento es el nombre del comando cuyos
argumentos están siendo completados, el segundo argumento es la palabra que está siendo completada,
y el tercer argumento es la palabra que precede a la palabra que está siendo completada en la línea de
comandos actual. No se realiza ningún filtrado de los completados generados con respecto a la palabra
que está siendo completada.
Primero se invoca cualquier función especificada con '-F'. La función puede utilizar cualquier
característica de la shell, incluyendo los comandos internos compgen y compopt descritos más
abajo (vea la Sección 8.7 [Comandos Internos para el Completado Programable]), para generar las
coincidencias. Esta debe poner los completados posibles en la variable de tipo array COMPREPLY .
Después, se invoca a cualquier comando especificado con la opción ' -C' en un entorno
equivalente a la sustitución de comandos. Esto debería imprimir una lista de completados, uno por
línea, para la salida estándar. Se puede utilizar la barra invertida para escapar una nueva línea si es
necesario.
Después de generar todos los completados posibles, se aplica a la lista cualquier filtro
especificado con la opción '-X'. El filtro es un patrón similar a los usados para la expansión de
rutas;Un símbolo '&' en el patrón es reemplazado con el texto de la palabra que está siendo
completada. Se puede escapar un literal '&' con una barra invertida; la barra invertida se elimina antes
de intentar una coincidencia. Cualquier completado que concuerde con el patrón será eliminado de la
lista. Un '!' marginal invierte el patrón; en este caso cualquier completado que no concuerde con el
patrón será eliminado.
Finalmente, se añadirá a cada miembro de la lista de completados posibles cualquier prefijo y
sufijo especificados con las opciones '-P' y '-S' respectivamente y el resultado es devuelto al código de
completado de Readline como una lista de completados posibles.
Si las acciones aplicadas anteriormente no generan ninguna concordancia, y se suministró la
opción '-o nombreDir' a complete cuando se definió el compspec, se intentará un completado de
nombre de directorio.
Si se suministró la opción '-o plusdirs' a complete cuando se definió el compspec se intentará
el completado de nombres de directorio y cualquier coincidencia será añadida a los resultados de las
otras acciones.

Página 121
Capítulo 8: Edición de la línea de comandos

Por defecto, si se encuentra un compspec lo que este genere es devuelto al código de completado
como el conjunto completo de completados posibles. No se intenta realizar los completados por
defecto de Bash, y el completado por defecto de Readline, el de nombres de fichero, es deshabilitado.
Si se suministró la opción '-o bashdefault' a complete cuando se definió el compspec, se intentará
realizar los completados por defecto de Bash si el compspec no genera ninguna coincidencia. Si se
suministró la opción '-o default' a complete cuando se definió el compspec, se realizará el
completado por defecto de Readline si el compspec (y, si se intentan, los completados por defecto de
Bash) no genera ninguna coincidencia.
Cuando un compspec indica que desea un completado de nombres de directorio, las funciones de
completado programable fuerzan a Readline a añadir una barra inclinada al final para completar los
nombres que son enlaces simbólicos a directorios, obedeciendo al valor de la variable de Readline
mark-directories .
Hay soporte para modificar dinámicamente los completados. Esto es más útil cuando se utiliza en
combinación con un completado por defecto especificado con ' -D'. Esto es posible para funciones de
shell ejecutadas como manejadores de completado para indicar que se debería reintentar el
completado devolviendo un estado de salida de 124. Si la función de shell devuelve 124, y cambia el
compspec asociado con el comando en el que se está intentando el completado (suministrado como el
primer argumento cuando se ejecuta la función), el completado programable reinicia desde el
principio, con un intento de encontrar un compspec para ese comando. Esto permite construir un
juego de completados dinámicamente cuando se intenta el completado, en vez de ser cargados todos a
la vez.
Por ejemplo, asumiendo que hay una librería de compspecs, cada uno mantenido en un fichero
correspondiente al nombre del comando, la siguiente función de completado por defecto cargará los
completados dinámicamente:
_completion_loader()
{
. "/etc/bash_completion.d/$1.sh" >/dev/null 2>&1 && return 124
}
complete -D -F _completion_loader

8.7.- Comandos Internos para el Completado Programable


Están disponibles dos comandos internos para manipular las características de completado
programable
compgen
compgen [opción] [palabra]
Genera completados posibles coincidentes para palabra de acuerdo con las opciones, las
cuales pueden ser cualquier opción aceptada por el comando interno complete con la
excepción de '-p' y '-r', y escribe las coincidencias en la salida estándar. Cuando se
utiliza la opción '-F' o la opción '-C' las variables de la shell ajustadas por las
características de completado programable, mientras estén disponibles, no tendrán valores
útiles.
Las coincidencias se generarán de la misma forma que si hubieran sido generadas
directamente por el código de completado programable desde una especificación de
completado con las mismas banderas. Si se especifica palabra, sólo se mostrarán aquellos
completados que concuerden con palabra.
El valor devuelto es true a menos que se suministre alguna opción inválida o no se genere
ninguna coincidencia.

Página 122
Capítulo 8: Edición de la línea de comandos

complete
complete [-abcdefgjksuv] [-o comp-option] [-DE] [-A acción]
[-G patglob] [-W listPalabras] [-F funcion] [-C comando]
[-X patfiltro] [-P prefijo] [-S sufijo] nombre
[nombre ...]
complete -pr [-DE] [nombre ...]
Especifica como deben completarse los argumentos de cada nombre. Si se suministra la
opción '-p', o si no se suministra ninguna opción, se imprimen las especificaciones de
completado de forma que permita reutilizarlas como entrada. La opción ' -r' elimina una
especificación de completado para cada uno de los nombres o todas las especificaciones si
no se proporciona ningún nombre. La opción '-D' indica que las opciones y acciones
restantes deberían aplicarse al comando de completado “default”; Esto es, se intentará el
completado en un comando para el que no se haya definido previamente ningún
completado. La opción '-E' indica que las opciones y acciones restantes deberían aplicarse
a comando de completado “empty”; esto es, se intentará el completado en una línea en
blanco.
El proceso de aplicar estas especificaciones de completado cuando se intenta el
completado de palabra se describe más arriba (vea la Sección 8.6 [Completado
Programable]). La opción '-D' tiene preferencia sobre la '-E'.
Si se especifican otras opciones estas tienen los siguientes significados. Los argumentos
para las opciones '-G', '-W' y '-X' (y, si son necesarias, las opciones '-P' y '-S') deben ser
entrecomillados para protegerlos de la expansión antes de que se invoque al comando
interno complete.
-o opción-comp
La opción-comp controla varios aspectos del comportamiento de la compspec
antes de la generación de completados. opción-comp puede ser una de las
siguientes:
bashdefault
Realiza el resto de los completados por defecto de Bash si el
compspec no genera ninguna coincidencia.
default Usa el completado de nombres de fichero por defecto de
Readline si el compspec no genera ninguna coincidencia.
dirnames Realiza el completado de nombres de directoria si el compspec
no genera ninguna coincidencia.
filenames
Indica a Readline que el compspec genere nombres de fichero,
de forma que este puede realizar cualquier procesado específico
de estos nombres (como añadir una barra inclinada a los
nombres de directorio con caracteres especiales entrecomillados,
o suprimir los espacios en blanco marginales.
nospace Le dice a Readline que no añada un espacio al final (lo que hace
por defecto) a las palabras completadas al final de la línea.
plusdirs Después de que se genere cualquier coincidencia definida por
compspec se intenta un completado de nombres de directorio y

Página 123
Capítulo 8: Edición de la línea de comandos

cualquier coincidencia se añade a los resultados de las otras


acciones.
-A acción
La acción puede ser una de las siguientes para generar una lista de
completados posibles:
alias Nombres de alias. También se puede especificar con '-a'.
arrayvar Nombres de variables de tipo array.
binding Nombres de asociaciones de teclas de Readline (vea la Sección
8.4 [ Comandos de Readline Enlazables]).
builtin Nombres de comandos internos de la shell. También se puede
especificar con '-b'.
command
Nombres de comandos. También se puede especificar con '-c'.
directory Nombres de directorio. También se puede especificar con '-d'.
disabled Nombres de comandos internos de la shell deshabilitados.
enabled Nombres de comandos internos de la shell habilitados.
export Nombres de variables de la shell exportadas. También se puede
especificar con '-e'.
file Nombres de ficheros. También se puede especificar con '-f'.
function Nombres de funciones de la shell.
group Nombres de grupos. También se puede especificar con '-g'.
helptopic
Temas de ayuda como los aceptados por el comando interno
help (vea la Sección 4.2 [Comandos Internos de Bash]).
hostname
Nombres de anfitrión (Host), tal como se toman desde el archivo
especificado por la variable de la shell HOSTFILE (vea la
Sección 5.2 [Variables de Bash]).
job Nombres de tareas, si el control de tareas está activo. También se
puede especificar con '-j'.
keyword Palabras reservadas de la shell. También se puede especificar con
'-k'.
running Nombres de tareas en ejecución, si el control de tareas está
activo.
service Nombres de servicio. También se puede especificar con '-s'.
setopt Argumentos válidos para la opción '-o' del comando interno set
(vea la Sección 4.3.1 [El Comando Interno Set]).

Página 124
Capítulo 8: Edición de la línea de comandos

shopt Nombres de opciones de la shell aceptadas por el comando


interno shopt (vea la Sección 4.2 [Comandos Internos de
Bash]).
signal Nombres de señal.
stopped Nombres de tareas detenidas, si el control de tareas está activo.
user Nombres de usuario. También se puede especificar con '-u'.
variable Nombres de variables de la shell. También se puede especificar
con '-v'.
-G patglob
El patrón de expansión de nombres de fichero patglob se expande para generar
los completados posibles.
-W listaPalabras
La listaPalabras se separa usando los caracteres en la variable especial IFS
como delimitadores, y cada palabra resultante es expandida. Los completados
posibles son los miembros de la lista resultante que concuerdan con la palabra
que está siendo completada.
-C comando
Se ejecuta el comando en un entorno de subshell, y su salida se utiliza como
los completados posibles.
-F funcion
La función de shell funcion se ejecuta en el entorno de shell actual. Cuando a
finaliza, se obtienen los completados posibles del valor de la variable de tipo
array COMPREPLY .
-X patfiltro
patfiltro es un patrón como los usados para la expansión de nombres de
fichero. Este se aplica a la lista de completados posibles generados por las
opciones y argumentos anteriores, y se elimina cada completado que
concuerde con patfiltro. Un '!' marginal niega el patrón; en este caso, se
elimina cualquier completado que no concuerde con patfiltro.
-P prefijo
Se añade prefijo al comienzo de cada posible completado después de que
hayan sido aplicadas todas las demás opciones.
-S sufijo
Se añade sufijo al final de cada posible completado después de que hayan sido
aplicadas todas las demás opciones.
El valor devuelto es true a menos que se suministre una opción inválida, se suministre
alguna opción distinta de '-p' o '-r' sin un argumento nombre, se intente eliminar una
especificación de completado para un nombre para el que no exista especificación u ocurra
un error añadiendo una especificación de completado.
compopt
compopt [-o opción] [-DE] [+ opción] [nombre]
Modifica las opciones de completado para cada nombre de acuerdo con las opciones
dadas, o para el completado actualmente en ejecución si no se suministran nombres. Si no

Página 125
Capítulo 8: Edición de la línea de comandos

se dan opciones, muestra las opciones de completado para cada nombre o para el
completado actual. Los valores posibles para opción son los válidos para el comando
interno complete descrito más arriba. La opción '-D' indica que las opciones restantes
deben aplicarse al comando de completado “default”; esto es, se intenta el completado de
un comando para el cual no se ha definido previamente ningún completado. La opción '-E'
indica que las opciones restantes deben aplicarse al comando de completado “empty”; esto
es, se intenta el completado en una línea en blanco.
La opción '-D' tiene preferencia sobre la '-E'.
El valor devuelto es true a menos que se suministre alguna opción inválida, se intente
modificar las opciones para un nombre para el cual no existe especificación de completado
u ocurra un error en la salida.

Página 126
Capítulo 9: Usando la Historia Interactivamente

9.- Usando la Historia Interactivamente


Este capítulo describe como usar la Librería de Historia de GNU interactivamente, desde la posición
de un usuario, por lo que debería considerarse como una guía de usuario. Para información sobre la
utilización de la Librería de Historia de GNU en otros programas, vea el Manual de la Librería
Readline de GNU.

9.1.- Características de Historia de Bash


Cuando se activa la opción '-o history' para el comando interno set (vea la Sección 4.3.1 [El
Comando Interno Set]), la shell proporciona acceso a la historia de comandos, la lista de comandos
introducidos anteriormente. Se utiliza el valor de la variable de la shell HISTSIZE como el número de
comandos a guardar en una lista de historia. Se almacena el texto de los últimos $HISTSIEZE
comandos (por defecto 500). La shell almacena cada comando en la lista de historia antes de realizar
la expansión de parámetros y variables pero después de realizar la expansión de la historia,
obedeciendo a los valores de las variables de shell HISTIGNORE y HISTCONTROL .
Al inicio de la shell, la historia se inicializa desde un fichero cuyo nombre viene dado por la
variable HISTFILE (por defecto '~/.bash_history'). Si es necesario se trunca el contenido del fichero
cuyo nombre viene dado por el valor de HISTFILE , para que no contenga más que el número de líneas
especificado por el valor de la variable HISTFILESIZE . Cuando una shell interactiva finaliza, las
últimas $HISTSIZE líneas se copian desde la lista de historia al fichero cuyo nombre viene dado por
$HISTFILE . Si está establecida la opción de la shell histappend (vea la Sección 4.2 [Comandos
Internos de Bash]), las líneas se añaden al final del archivo de historia, en caso contrario se
sobreescribe el fichero de historia. Si HISTFILE no está establecida, o si el fichero de historia no es
modificable, la historia no se guarda. Después de guardar la historia, el fichero de historia se trunca
para no contener más de $HISTFILESIZE líneas. Si HISTFILESIZE no está establecida, no se realiza
ningún truncado.
Si HISTTIMEFORMAT está establecida, se escribe en el archivo de historia la información de
marca de tiempo asociada con cada entrada de la historia, marcada con el carácter de comentario de la
historia. Cuando se lee el fichero de la historia, las líneas que comienzan con el carácter de comentario
de la historia seguido inmediatamente por un dígito se interpretan como marcas de tiempo para la
línea de historia previa.
Se puede utilizar el comando interno fc para listar o editar y volver a ejecutar una porción de la
lista de historia. El comando interno history puede utilizarse para mostrar o modificar la lista de
historia y manipular el fichero de historia. Cuando se utiliza la edición de línea de comandos, los
comandos de búsqueda están disponibles en cada modo de edición que proporcione acceso a la lista de
historia (vea la Sección 8.4.2 [Comandos para la Historia]).
La shell permite controlar qué comandos son guardados en la lista de historia. Se pueden
establecer las variables HISTCONTROL e HISTIGNORE para hacer que la shell guarde sólo un
subconjunto de los comandos introducidos. La opción de shell cmdhist, si está activada, produce que
la shell intente guardar cada línea de un comando multilínea en la misma entrada de la historia,
añadiendo punto y coma donde sea necesario para mantener la corrección semántica. La opción de la
shell lithist produce que la shell guarde el comando con caracteres nueva línea embebidos en vez
de con punto y coma. Se utiliza el comando interno shopt para establecer estas opciones. Vea la
Sección 4.2 [Comandos Internos de Bash], para una descripción del comando interno shopt.

9.2.- Comandos Internos para la Historia de Bash


Bash proporciona dos comandos internos que manipulan la lista de historia y el fichero de historia

Página 127
Capítulo 9: Usando la Historia Interactivamente

fc
fc [-e enombre] [-lnr] [primero] [ultimo]
fc -s [pat=rep] [comando]
Comando fijo. En la primera forma, se selecciona un rango de comandos desde primero a
último desde la lista de historia. Tanto primero como último pueden ser especificados como
una cadena (para localizar el comando más reciente comenzando con esa cadena) o como
un número (un índice en la lista de historia, donde un número negativo se utiliza como un
desplazamiento desde el número de comando actual). Si no se especifica último se le da el
valor de primero. Si no se especifica primero se le da el valor del comando previo en el
caso de edición y -16 en el caso de imprimir listados. Si se le pasa la bandera '-l' se listan
los comandos en la salida estándar. La bandera ' -n' suprime los números de comando
cuando se imprimen listados. La bandera '-r' invierte el orden del listado. En caso
contrario se invoca al editor dado por enombre en un fichero que contenga a estos
comandos. Si no se proporciona enombre, se utiliza el valor de la siguiente expansión de
variables: ${FCEDIT:-${EDITOR:-vi}} . Esto indica que utilice el valor de la variable
FCEDIT , si está establecida, o el valor de la variable EDITOR si está establecida o vi si
ninguna de las variables anteriores está establecida. Cuando se completa la edición, los
comandos son mostrados y ejecutados.
En la segunda forma, se vuelve a ejecutar comando después de que cada instancia de pat
en el comando seleccionado sea reemplazada por rep.
Un alias útil para usar con el comando fc es r='fc -s', de forma que introduciendo 'r
cc' se ejecuta el último comando que comience con cc e introduciendo 'r' se vuelve a
ejecutar el último comando (vea la Sección 6.6 [Alias]).
history
history [n]
history -c
history -d desplazamiento
history [-anrw] [nombrefichero]
history -ps arg
Sin opciones muestra la lista de historia con números de línea. Las líneas precedidas por
'*' han sido modificadas. Un argumento n lista sólo las n últimas líneas. Si la variable de
shell HISTTIMEFORMAT está establecida y no es nula, se utiliza como una cadena de
formato para strftime para mostrar la marca de tiempo asociada con cada entrada
mostrada de la historia. No se imprimen espacios en blanco intermedios entre la marca de
tiempo formateada y la línea de historia.
Las opciones, si se suministran, tienen los siguientes significados:
-c Limpia la lista de historia. Esta opción puede combinarse con otras opciones
para reemplazar completamente la lista de historia.
-d desplazamiento
Borra la entrada de la historia en la posición desplazamiento. El
desplazamiento es el mismo que aparece cuando se muestra la historia.
-a Añade las nuevas líneas de historia (las líneas de historia introducidas desde
el comienzo de la sesión actual de Bash) al final del fichero de historia.

Página 128
Capítulo 9: Usando la Historia Interactivamente

-n Añade las líneas de historia que no han sido leídas aún desde el fichero de
historia a la lista actual de historia. Estas líneas son añadidas al final del
fichero de historia desde el comienzo de la sesión actual de Bash.
-r Lee el archivo actual de historia y añade su contenido al final de la lista de
historia.
-w Vuelca la historia actual al fichero de historia.
-p Realiza sustituciones de historia en los args y muestra el resultado en la
salida estándar sin almacenar los resultados en la lista de historia.
-s Los argumentos se añaden al final de la lista de historia como una entrada
única.
si se proporciona nombrefichero con las opciónes '-w', '-r', '-a' o '-n',, este se utiliza
como archivo de historia. Si no se proporciona nombrefichero se utiliza el valor de la
variable HISTFILE .

9.3.- Expansión de la Historia


La librería de Historia proporciona una característica de expansión de la historia que es similar a la
expansión de la historia que proporciona csh. Esta sección describe la sintaxis utilizada para
manipular la información de la historia.
Las expansiones de la historia introducen palabras desde la lista de historia en el flujo de entrada,
facilitando el repetir comandos, insertar argumentos a un comando previo en la línea de entrada
actual, o corregir errores en comandos anteriores rápidamente.
Las expansiones de la historia tienen lugar en dos partes. La primera consiste en determinar qué
linea de la lista de historia se debe utilizar durante la sustitución. La segunda consiste en seleccionar
partes de dicha línea para insertarlas en la línea actual. La línea seleccionada de la historia se
denomina evento, y las porciones de dicha línea sobre las que se actúa se denominan palabras. Están
disponibles varios modificadores para manipular las palabras seleccionadas. La línea se divide en
palabras de la misma forma que lo hace Bash, de manera que varias palabras encerradas entre
comillas se consideran una palabra. Las expansiones de historia se inician por la aparición del carácter
de expansión de historia, que por defecto es '!'. Sólo se puede utilizar '\' y ''' para escapar el carácter
de expansión de la historia.
Se pueden utilizar varias opciones de la shell modificables con el comando interno shopt para
adaptar el comportamiento de la expansión de la historia. Si está activada la opción de shell
histverify, y se está utilizando Readline, las sustituciones de la historia no se pasan
inmediatamente al analizador de la shell. En vez de eso, la línea expandida se recarga en el buffer de
edición de Readline para posteriores modificaciones. Si se está utilizando Readline, y la opción de
shell histreedit está activada, una expansión de la historia fallida se recargará en el buffer de
edición de Readline para su corrección. Puede utilizarse la opción ' -p' del comando interno history
para ver lo que hará la expansión de historia antes de usarla. Se puede utilizar la opción ' -s' del
comando interno history para añadir comandos al final de la lista de historia sin ejecutarlos
realmente, de forma que pueden estar disponibles para rellamadas posteriores. Esto es más útil
utilizado junto con Readline.
La shell permite controlar varios caracteres usados en el mecanismo de expansión de la historia
con la variable histchars , como se explicó anteriormente (vea la Sección 5.2 [Variables de Bash]). La
shell utiliza el carácter de comentario de la historia para señalar las marcas de tiempo de la historia

Página 129
Capítulo 9: Usando la Historia Interactivamente

cuando escribe el fichero de historia.


9.3.1.- Designadores de Evento
Un designador de eventos es una referencia a una entrada de la línea de comandos en la lista de
historia.
! Inicia una sustitución de la historia, excepto cuando es seguido de un espacio, una
tabulación, el final de línea, '=' o '(' (cuando la opción de shell extglob está activada
usando el comando interno shopt).
!n Referencia al comando de la línea n
!-n Referencia al comando situado n líneas atrás
!! Referencia al comando previo. Este es un sinónimo para '!-1'
!cadena Referencia al comando mas reciente que comienza con cadena.
!?cadena[?]
Referencia al comando más reciente que contiene cadena. El '?' final puede omitirse si la
cadena es seguida inmediatamente por una nueva línea.
^cadena1^cadena2^
Sustitución rápida. Repite el último comando, reemplazando cadena1 con cadena2. Es
equivalente a !!:s/cadena1/cadena2/.
!# La línea de comandos introducida hasta el momento.

9.3.2.- Designadores de Palabra


Los designadores de palabra se utilizan para seleccionar las palabras deseadas del evento. Un ':'
separa la especificación del evento del designador de palabra. Este puede omitirse si el designador de
palabra comienza con un '^', '$', '*', '-' o '%'. Las palabras son numeradas desde el comienzo de la
línea, con la primera palabra denotada por 0 (cero). Las palabras se insertan en la línea actual
separadas por espacios individuales.
Por ejemplo,
!! designa el comando anterior. Cuando introduce esto, se repite el comando anterior
completamente.
!!:$ designa el último argumento del comando anterior. Puede abreviarse a !$
!fi:2 designa el segundo argumento del comando más reciente que comienza con las letras 'fi'.
Los designadores de palabra son los siguientes:
0 (cero)
La palabra número 0. Para muchas aplicaciones es el propio comando.
n La n-ésima palabra.
^ El primer argumento, esto es, la palabra 1.
$ El último argumento.
% La palabra encontrada por la búsqueda '?cadena?' más reciente.

Página 130
Capítulo 9: Usando la Historia Interactivamente

x-y Un rango de palabras; '-y' es una forma abreviada para '0-y'.


* Todas las palabras, excepto la número 0. Este es un sinónimo para ' 1-$'. No es un error
utilizar '*' si hay justo una palabra en el evento; en tal caso de devuelve la cadena vacia.
x* Es una abreviatura para 'x-$'.
x- Es una abreviatura para 'x-$' como 'x*', pero omite la última palabra.
Si se suministra un designador de palabra sin una especificación de evento, se utiliza como evento
el comando anterior.
9.3.3.- Modificadores
Tras el designador de palabra opcional se puede añadir una secuencia de uno o más de los siguiente
modificadores, cada uno precedido por un ':'
h Elimina un componente de ruta del final, dejando sólo la cabeza (head).
t Elimina todos los componentes de ruta, dejado sólo la cola (tail).
r Elimina un sufijo de la forma '.sufijo', dejando el nombre base.
e Elimina todo menos el sufijo final.
p Imprime el nuevo comando pero no lo ejecuta.
q Entrecomilla las palabras sustituidas, protegiéndolas de sustituciones posteriores.
X Entrecomilla las palabras sustituidas, como con 'q' pero separa en palabras en función de
los espacios, tabulaciones y nuevas líneas.
S/viejo/nuevo/
Sustituye nuevo por la primera ocurrencia de viejo en la línea de evento. Se puede utilizar
cualquier delimitador en lugar de '/'. Se puede citar un carácter delimitador en viejo y
nuevo protegiéndolo con una barra invertida. Si nuevo contiene '&' este es reemplazado
por viejo. Se puede proteger el carácter '&' con una barra invertida. El delimitador final es
opcional si es el último carácter en la línea de entrada.
& Repite la sustitución anterior.
g
a Provoca que los cambios se apliquen sobre la línea de evento completa. Se usa junto con
's', como en gs/nuevo/viejo/, o con '&'.
G Aplica el siguiente modificador 's' una vez a cada palabra en el evento.

Página 131
Capítulo 10: Instalando Bash

10.- Instalando Bash


Este capítulo proporciona instrucciones básicas para instalar Bash en las múltiples plataformas
soportadas. La distribución soporta los sistemas operativos GNU, casi cualquier versión de Unix, y
varios sistemas no-Unix como BeOS e Interix. Existen otras implementaciones independientes para
las plataformas MS-DOS, OS/2, y Windows.

10.1.- Instalación Básica


Estas son las instrucciones de instalación para Bash.
La forma más fácil de compilar Bash es:
1. cd al directorio que contiene el código fuente y escriba ' ./configure' para configurar Bash
para su sistema. Si está usando csh o alguna versión antigua de System V, podría necesitar
introducir 'sh ./configure' en vez de lo anterior para evitar que csh intente ejecutar
configure por sí mismo.
Ejecutar configure toma algún tiempo. Mientras que se ejecuta, imprime mensajes que
informan sobre las características que está comprobando.
2. Escriba 'make' para compilar Bash y construir el guión de reporte de errores bashbug.
3. Opcionalmente escriba 'make tests' para ejecutar el juego de comprobaciones de Bash.
4. Escriba 'make install' para instalar bash y bashbug. Esto también instalará las páginas del
manual y el fichero info.
El script de shell configure intenta encontrar los valores correctos para múltiples variables
dependientes del sistema que se utilizan durante la compilación. Este utiliza estos valores para crear
un 'Makefile' en cada directorio del paquete (el directorio principal, los directorios 'builtins', 'doc' y
'support', cada uno de los directorios bajo 'lib' y algunos más). Este también crea un fichero 'config.h'
que conitiene definiciones dependientes del sistema. Finalmente, crea un script de shell denominado
config.status que usted puede ejecutar en el futuro para recrear la configuración actual, un fichero
'config.cache' que guarda los resultados de los test para acelerar la reconfiguración, y un fichero
'config.log' que contiene la salida de compilación (útil principalmente para depurar configure). Si
'config.cache' contiene en algún punto resultados que usted no quiera mantener, puede eliminarlos o
editarlos.
Para encontrar más información acerca de las opciones y argumentos que acepta el script
configure introduzca
bash-2.04$ ./configure –help
en el prompt de bash en su directorio de fuentes de Bash.
Si necesita hacer cosas inusuales para compilar Bash, intente entender como podría configure
comprobar cuando realizarlas y cuando no, y envíe las diferencias o las instrucciones a bash-
maintainers@gnu.org de forma que estas puedan ser consideradas para la próxima publicación.
El fichero 'configure.in' se utiliza para crear configure mediante un programa denominado
Autoconf. Sólo necesita el 'configure.in' si desea cambiar o regenerar el script configure utilizando
una nueva versión de Autoconf. Si hace esto, asegúrese de estar usando una versión de Autoconf
igual o superior a la 2.50.
Puede eliminar los binarios del programa y los ficheros objeto desde el directorio del código
fuente introduciendo 'make clean'. Para eliminar todos los ficheros creados por configure (de
forma que pueda compilar Bash para un tipo diferente de computador), introduzca ' make
distclean'.

Página 132
Capítulo 10: Instalando Bash

10.2.- Compiladores y Opciones


Algunos sistemas requieren opciones inusuales para compilar o enlazar desconocidas para el script
configure. Usted puede proporcionar a configure valores iniciales para algunas variables
estableciendo estos en el entorno. Utilizando una shell compatible con la shell Bourne, puede hacer
esto con un comando como este:
CC=c89 CFLAGS=-02 LIBS=-lposix ./configure
En sistemas que tienen el programa env, puede hacer esto como:
env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
El proceso de configuración utiliza GCC, si está disponible, para construir Bash.

10.3.- Compilando para Múltiples Arquitecturas


Puede compilar Bash para más de un tipo de computador al mismo tiempo situando los ficheros
objetos para cada arquitectura en su propio directorio. Para hacer esto, debe utilizar una versión de
make que soporte la variable VPATH , como el make de GNU. cd al directorio donde quiera que
vayan los ficheros objetos y los ejecutables y ejecute el guión de comandos, configure desde el
directorio fuente. Puede necesitar suministrar el argumento '--srcdir=RUTA' para indicarle a
configure donde están los ficheros fuente. configure buscará automáticamente el código fuente en
el directorio en el que está configure y en '..'.
Si tiene que usar un make que no soporta la variable VPATH , puede compilar Bash para una
arquitectura cada vez en el directorio del código fuente. Después de que haya instalado Bash para una
arquitectura, utilice 'make distclean' antes de reconfigurar para otra arquitectura.
Alternativamente, si su sistema soporta enlaces simbólicos, puede utilizar el guión de comandos
'support/mkclone' para crear un árbol de construcción que tenga enlaces simbólicos a cada fichero en el
directorio fuente. A continuación le mostramos un ejemplo que crea un directorio de construcción en
el directorio actual desde un directorio fuente '/usr/gnu/src/bash-2.0':
bash /usr/gnu/src/bash-2.0/support/mkclone -s /usr/gnu/src/bash-2.0 .
El script mkclone requiere Bash, debe tener construido Bash al menos para una arquitectura
antes de poder crear directorios de construcción para otras arquitecturas.

10.4.- Nombres de Instalación


Por defecto, 'make install' instalará en '/usr/local/bin', '/usr/local/man', etc. Puede especificar un
prefijo de instalación distinto de '/usr/local' proporcionando a configure la opción '--prefix=RUTA',
o especificando un valor para la variable de 'make' DESTDIR cuando ejecute 'make install'.
Puede especificar prefijos de instalación separados para ficheros específicos de la arquitectura y
ficheros independientes de la arquitectura. Si proporciona a configure la opción
'--exec-prefix=RUTA', 'make install' usará RUTA como prefijo para instalar programas y
librerías. La documentación y otros ficheros de datos seguirán usando el prefijo habitual.

10.5.- Especificando el Tipo de Sistema


Puede haber algunas características que configure no pueda determinar automáticamente, pero sean
necesarias para el tipo de anfitrión en el que se ejecutará Bash. Normalmente configure puede
determinar este valor, pero si imprime un mensaje diciendo que no puede descubrir el tipo de anfitrión
(host), tendrá que proporcionarle este dato mediante la opción ' --host=TIPO'. 'TIPO' puede ser un
nombre corto para el tipo de sistema, como 'sun4', o un nombre canónico con tres campos: 'CPU-
COMPAÑÍA-SISTEMA' (p.e., 'i386-unknown-freebsd4.2').
Vea el fichero 'support/config.sub' para más información sobre los valores posibles de cada

Página 133
Capítulo 10: Instalando Bash

campo.

10.6.- Compartiendo Valores por Defecto


Si desea establecer valores por defecto a los script configure para compartir, puede crear un guión
de shell de emplazamiento llamado config.site que proporcione valores por defecto para las variables
como CC, cache_file y prefix . configure busca el fichero 'PREFIX/share/config.site' si existe, o
'PREFIX/etc/config.site' si existe, en ese orden. O, también puede establecer la variable de entorno
CONFIG_SITE para indicar la localización de este guión de comandos. Una advertencia: El configure
de Bash busca un guión de emplazamiento, pero no todos los guiones configure lo hacen.

10.7.- Controles de Operación


configure reconoce las siguientes opciones para controlar su funcionamiento.
--cache-file=fichero
Utiliza y guarda los resultados del las comprobaciones en fichero en vez de en
'./config.cache'. Establezca un valor de fichero igual a '/dev/null' para desactivar el uso
de la antememoria (caché). Útil para depurar configure.
--help Imprime un resumen de las opciones de configure y finaliza.
--quiet
--silent
-q No imprime mensajes sobre los chequeos que se están realizando.
--srcdir=dir
Busca el código fuente de Bash en el directorio dir. Normalmente configure puede
determinar este directorio automáticamente.
--version Imprime la versión de Autoconf usada para generar el script configure y finaliza.
configure también acepta algunas opciones más, no muy utilizadas. ' configure –help' imprime
la lista completa.

10.8.- Características Opcionales


El script configure de Bash tiene varias opciones '--enable-catacterística' (activa-
característica), donde catacterística indica una parte opcional de Bash. Hay también varias opciones
'--with-paquete' (con el paquete), donde paquete es algo como 'bash-malloc' o 'purify'. Para
desactivar el uso por defecto de un paquete utiliza ' --without-paquete'. Para configurar Bash sin
una característica que está activada por defecto utilice '--disable-característica'.
A continuación mostramos una lista completa de las opciones '--enable-' y '--with-'
reconocidas por el configure de Bash:
--with-afs
Define si estamos usando el Sistema de Ficheros de Andrew (Andrew File System) de
Transac.
--with-bash-malloc
Utiliza la versión de Bash de malloc en el directorio 'lib/malloc'. Este no es el mismo
malloc que aparece en la libc de GNU, es una versión más antigua derivada
originalmente del malloc de BSD 4.2. Este malloc es muy rápido, pero gasta algún
espacio en cada asignación. Esta opción está activada por defecto. El fichero 'NOTES'
contiene una lista de sistemas para los que se debería desactivar, y configure desactiva

Página 134
Capítulo 10: Instalando Bash

esta opción automáticamente para varios sistemas.


--with-curses
Utiliza la librería curses en vez de la librería termcap. Debería suministrarse esta opción si
su sistema tiene una base de datos termcap inadecuada o incompleta.
--with-gnu-malloc
Un sinónimo para –-with-bash-malloc.
--with-installed-readline[=PREFIJO]
Definir esto hace que Bash enlace con una versión de Readline instalada localmente en vez
de con la versión en 'lib/readline'. Esta opción sólo trabaja con las versiones 5.0 o
posteriores de Readline. Si PREFIJO es yes o no se proporciona, configure utiliza los
valores de las variables de make includedir y libdir , que son los subdirectorios por defecto
de prefijo , para encontrar la versión instalada de Readline si esta no está en el sistema
estándar de directorios include y library. Si PREFIJO es no, Bash enlaza con la versión en
'lib/readline'. Si se asigna cualquier otro valor a PREFIJO, configure considera este valor
como una ruta de directorios y buscará la versión instalada de Readline en subdirectorios
de dicho directorio (los ficheros include en PREFIJO/include y los library en PREFIJO/lib).
--with-purify
Define esto para usar el comprobador de asignación de memoria de Púrify proporcionado
por Rational Software.
--enable-minimal-config
Esto produce una shell con capacidades mínimas, cercana a la shell Bourne.
Hay varias opciones '--enable' que modifican la forma en la que se compila y enlaza Bash, en
vez de cambiar características de tiempo de ejecución.
--enable-largefile
Activa el soporte para ficheros grandes si el sistema operativo requiere opciones especiales
de compilación para construir programas que puedan acceder a ficheros de gran tamaño.
Está activado por defecto si el sistema operativo proporciona soporte para ficheros
grandes.
--enable-profiling
Construye un binario de Bash que produce información autobiográfica para ser procesada
por gprof cada vez que se ejecuta.
--enable-static-link
Esto produce que Bash se enlace estáticamente, si se está utilizando gcc. Esto se puede
utilizar para construir una versión para usar como shell del administrador.
Se puede utilizar la opción 'minimal-config' para desactivar todas las opciones siguientes,
pero si se procesa primero, se pueden activar las opciones individuales usando 'enable-feature'.
Todas las opciones siguientes excepto 'disabled-builtins' y 'xpg-echo-default' están
activadas por defecto, a menos que el sistema operativo no las soporte.
--enable-alias
Permite la expansión de alias e incluye los comandos internos alias y unalias (vea la
Sección 6.6 [Alias]).
--enable-arith-for-command
Incluye soporte para la forma alternativa del comando for que se comporta como la
sentencia for del lenguaje C (vea la Sección 3.2.4.1 [Construcciones de Bucle]).

Página 135
Capítulo 10: Instalando Bash

--enable-array-variables
Incluye soporte para variables de shell de tipo array unidimensional (vea la Sección 6.7
[Arrays]).
--enable-bang-history
Incluye soporte para la sustitución de la historia tipo csh (vea la Sección 9.3 [Interaccion
con la Hisotria]).
--enable-brace-expansion
Incluye expansión de llaves tipo csh ( b{a,b}c → bac bbc ). Vea la Sección 3.5.1
[Expansión de Llaves] para una descripción completa.
--enable-casemod-attributes
Incluye soporte para atributos de modificación de mayúsculas y minúsculas en el comando
interno declare y en las sentencias de asignación. Las variables con el atributo uppercase,
por ejemplo, tendrán sus valores convertidos a mayúsculas.
--enable-casemod-expansion
Incluye soporte para expansiones de palabra con modificación de mayúsculas y
minúsculas.
--enable-command-timing
Incluye soporte para reconocer time como una palabra reservada y para mostrar
estadísticas de tiempo para la tubería que sigue a time (vea la Sección 3.2.2 [Tuberías]).
Esto permite que tanto las tuberías como los comandos internos y las funciones sean
cronometrados.
--enable-cond-command
Incluye soporte para el comando condicional [[. (Vea la Sección 3.2.4.2 [Construcciones
Condicionales]).
--enable-cond-regexp
Incluye soporte para encajar expresiones regulares POSIX utilizando el operador binario
'=~' en el comando condicional [[. (vea la Sección 3.2.4.2 [Construcciones
Condicionales]).
--enable-coprocesses
Incluye soporte para coprocesos y la palabra reservada coproc (vea la Sección 3.2.2
[Tuberías]).
--enable-debuger
Incluye soporte para el depurador de Bash (que se distribuye separadamente).
--enable-directory-stack
Incluye soporte para una pila de directorios, y los comandos internos push, popd y dirs
similares a los de csh. (vea la Sección 6.8 [La Pila de Directorios]).
--enable-disabled-builtins
Permite que se invoque a los comandos internos mediante ' builtin xxx' incluso
después de que xxx haya sido desactivado utilizando 'enable -n xxx'. Vea la Sección
4.2 [Comandos Internos de Bash], para obtener más detalles de los comandos internos
builtin y enable.
--enable-dparen-arithmetic
Incluye soporte para el comando (( … )) (vea la Sección 3.2.4.2 [Construcciones
Condicionales]).

Página 136
Capítulo 10: Instalando Bash

--enable-extended-glob
Incluye soporte para las características de ajuste de patrones extendidos descritos
anteriormente bajo la Sección 3.5.8.1 [Concordancia de Patrones]).
--enable-extended-glob-default
Establece el valor por defecto de la opción de shell extglob descrita anteriormente bajo
la sección 4.3.2 [El Comando Interno Builtin] para ser activada.
--enable-help-builtin
Incluye el comando interno help, el cual muestra ayuda sobre los comandos internos y las
variables de la shell (vea la Sección 4.2 [Comandos Internos de Bash]).
--enable-history
Incluye la historia de comandos y los comandos internos fc e history (vea la Sección 9.1
[Características de Historia de Bash]).
--enable-job-control
Esto activa las características de control de tareas (vea el Capítulo 7 [Control de Tareas]),
si el sistema operativo las soporta.
--enable-multibyte
Esto activa el soporte para caracteres multibyte si el sistema operativo proporciona el
soporte necesario.
--enable-net-redirections
Esto activa el manejo especial de nombres de fichero de la forma /dev/tcp/host/port y
/dev/udp/host/port cuando se utiliza en redirecciones (vea la Sección 3.6 [Redirecciones]).
--enable-process-substitution
Esto activa la sustitución de procesos (vea la Sección 3.5.6 [Sustitución de Procesos]) si el
sistema operativo lo soporta.
--enable-progcomp
Activa las características de completado programable (vea la Sección 8.6 [Completado
Programable]). Si Readline no está activado, esta opción no tiene ningún efecto.
--enable-prompt-string-decoding
Activa la interpretación de varios caracteres escapados con barra invertida en las cadenas
de prompt $PS1 , $PS2 , $PS3 y $PS4 . Vea la Sección 6.9 [Imprimiendo un Promp], para
una lista completa de secuencias de escape en cadenas de prompt.
--enable-readline
Incluye soporte para la edición de la línea de comandos y de la historia con la versión de
Bash de la librería Readline (vea el Capítulo 8 [Edición de la Línea de Comandos]).
--enable-restricted
Incluye soporte para una shell restringida. Si esto está activado, Bash, cuando es llamado
con rbash, entra en modo restringido. Vea la Sección 6.10 [La Shell Restringida], para
una descripción del modo restringido.
--enable-separate-helpfiles
Utiliza ficheros externos para la documentación que se muestra con el comando interno
help en vez de almacenar el texto internamente.
--enable-single-help-strings
Almacena el texto mostrado por el comando interno help como una única cadena para
cada tema de la ayuda. Esto ayuda a traducir el texto a diferentes lenguajes. Puede

Página 137
Capítulo 10: Instalando Bash

necesitar desactivar esto si su compilador no maneja cadenas de literales muy largas.


--enable-strict-posix-default
Hace que Bash se comporte por defecto conforme al estándar POSIX (vea la Sección 6.11
[El modo POSIX de Bash]).
--enable-usg-echo-default
Un sinónimo para –-enable-xpg-echo-default.
--enable-xpg-echo-default
Hace que el comando interno echo expanda por defecto los caracteres escapados con una
barra invertida sin necesidad de la opción ' -e'. Esto establece el valor por defecto de la
opción de shell xpg_echo a on, lo que hace que el echo de Bash se comporte de forma
más parecida a la versión especificada por la Especificación Única de Unix versión 3. Vea
la Sección 4.2 [Comandos Internos de Bash], para una descripción de las secuencias de
escape reconocidas por el comando interno echo.
El fichero 'config-top.h' contiene sentencias #define del Preprocesador de C para las opciones
que no son modificables mediante configure. Algunas de estas sentencias no deben ser modificadas;
tenga cuidado de las consecuencias de hacerlo. Lea los comentarios asociados con cada definición para
obtener más información sobre sus efectos.

Página 138
Apéndice A: Informando de errores

Apéndice A: Informando de errores


Por favor informe sobre todos los errores que encuentre en Bash. Pero primero debería asegurarse de
que realmente es un error, y que este aparece en la última versión de Bash. La última versión de Bash
está siempre disponible por FTP desde ftp://ftp.gnu.org/pub/gnu/bash/.
Una vez que haya determinado que realmente existe un error, utilice el comando bashbug para
enviar un informe de error. Si tiene una solución, le invitamos a que nos la comunique. Las
sugerencias e informes de errores 'de filosofía' se pueden enviar a bug-bash@gnu.org o al grupo de
Usenet gnu.bash.bug.
Todos los informes de errores deben incluir:.
• El número de versión de Bash
• El hardware y el sistema operativo.
• El compilador usado para compilar Bash.
• Una descripción del comportamiento del error.
• Una receta o un breve guión de comandos que manifieste el error y sea útil para reproducirlo.
bashbug inserta los tres primeros puntos automáticamente en la plantilla que proporciona para
rellenar el informe de error.
Por favor, envía todos los informes concernientes a este manual a chet.ramey@case.edu2.
(N. de T.: el correo anterior es para la versión en inglés de este manual, para enviar sugerencias o
correcciones a la traducción en español utilice: traduccionBash41@gmail.com)

2 Para errores en la versión original en inglés.

Página 139
Apéndice B: Diferencias Principales con la Shell de Bourne

C.2.- Diferencias Principales con la Shell de Bourne


Bash implementa esencialmente la gramática, la expansión de parámetros y variables, la
redirección y el entrecomillado de la misma forma que lo hace la Shell Bourne. Bash utiliza el
estándar POSIX como especificación para implementar estas características. Hay algunas diferencias
entre la shell Bourne tradicional y Bash; esta sección detalla rápidamente las diferencias importante.
Algunas de estas diferencias se explican en mayor detalle en secciones anteriores. Esta sección utiliza
la versión de sh incluida en SVR4.2 (la última versión de la histórica shell de Bourne) como base de
la comparación.
• Bash es conforme al estándar POSIX, incluso cuando la especificación POSIX difiere del
comportamiento tradicional de sh (vea la Sección 6.11 [El Modo POSIX de Bash]).
• Bash tiene opciones de invocación multi-caracter (vea la Sección 6.1 [Invocando a Bash]).
• Bash tiene edición de línea de comandos (vea el Capítulo 8 [Edición de la Línea de
Comandos]) y el comando interno bind.
• Bash proporciona un mecanismo de completado programable de palabras (vea la Sección 8.6
[Completado Programable]), y los comandos internos complete, compgen, y compopt
para su manipulación.
• Bash tiene historia de comandos (vea la Sección 9.1 [Características de Historia de Bash]) y
los comandos internos history y fc para su manipulación. La lista de historia de Bash
mantiene información de marca de tiempo y utiliza el valor de la variable HISTTIMEFORMAT
para mostrarla.
• Bash implementa expansión de historia estilo csh (vea la Sección 9.3 [Interacción con la
Historia]).
• Bash tiene variables de tipo array unidimensional (vea la Sección 6.7 [Arrays], junto con la
expansión de variables y la sintaxis de asignación para usarlas. Varios de los comandos
internos de Bash tienen opciones para actuar en arrays. Bash proporciona algunas variables
internas de tipo array.
• Se soporta la sintaxis de entrecomillado $'...', que expande caracteres ANSI-C escapados
con una barra invertida en textos encerrados entre comillas simples (vea la Sección 3.1.2.4
[Entrecomillado tipo ANSI-C]).
• Bash soporta la sintaxis de entrecomillado $”...” para hacer traducciones específicas de la
localización a los caracteres encerrados entre comillas dobles. Las opciones de invocación '-D',
'--dump-strings' y '--dump-po-strings' listan las cadenas traducibles que se
encuentran en un guión de comandos (vea la Sección 3.1.2.5 [Traducciones Locales]
• Bash implementa la palabra clave ! Para negar el valor devuelto por una tubería (vea la
Sección 3.2.2 [Tuberías]). Muy útil cuando una sentencia if necesita actuar sólo si una
comprobación falla. La opción de Bash ' -o pipefail' de set produce que una tubería
devuelva un estado de error si cualquiera de sus comando falla.
• Bash tiene la palabra reservada time y cronometra comandos (vea la Sección 3.2.2
[Tuberías]). Se puede controlar la impresión de las estadísticas de tiempo con la variable
TIMEFORMAT .
• Bash implementa el comando aritmético for (( expr1 ; expr2 ; expr3 )), similar al del lenguaje
C (vea la Sección 3.2.4.1 [Construcciones Cíclicas]).
• Bash incluye el comando compuesto select, que permite la generación de menús simples (vea
la Sección 3.2.4.2 [Construcciones Condicionales]).
• Bash incluye el comando compuesto [[, que incluye las comprobaciones condicionales como

Página 140
Apéndice B: Diferencias Principales con la Shell de Bourne

parte de la gramática de la shell (vea la Sección 3.2.4.2 [Construcciones Condicionales]),


incluyendo ajuste opcional de expresiones regulares.
• Bash proporciona ajuste insensible a mayúsculas y minúsculas de forma opcional para las
construcciones case y [[.
• Bash incluye expansión de llaves (vea la Sección 3.5.1 [Expansión de Llaves]) y expansión de
tildes (vea la Sección 3.5.2 [Expansión de Tildes]).
• Bash implementa los alias de comandos y los comandos internos alias y unalias (vea la
Sección 6.6 [Alias]).
• Bash proporciona aritmética de shell, el comando compuesto (( (vea la Sección 3.2.4.2
[Construcciones Condicionales) y expansión aritmética (vea la Sección 6.5 [Aritmética de la
Shell]).
• Las variables presentes en el entorno inicial de la shell se exportan automáticamente a los
procesos hijo. La shell Bourne normalmente no hace esto a menos que las variables se
marquen explícitamente usando el comando export.
• Bash soporta el operador de asignación '+=', que añade al valor actual de la variable nombrada
en el lado izquierdo de la expresión.
• Bash incluye las expansiones de eliminación de patrones POSIX '%', '#' y '%%' para eliminar
subcadenas al inicio o al final de los valores de las variables (vea la Sección 3.5.3 [Expansión
de Parámetros de Shell]).
• Soporta la expansión ${#xx} que devuelve la longitud de ${xx}, si está soportada (vea la
Sección 3.5.3 [Expansión de Parámetros de Shell]).
• Presenta la expansión ${var:desplazamiento[:longitud]} , que expande la subcadena contenida
en var a una subcadena de longitud igual a longitud comenzando en desplazamiento (vea la
Sección 3.5.3 [Expansión de Parámetros de Shell]).
• Soporta la expansión ${var/[/]patrón[/reemplazo]} , la cual busca el patrón en el valor de var y
lo sustituye por reemplazo, si está disponible (vea la Sección 3.5.3 [Expansión de Parámetros
de Shell]).
• Soporta la expansión ${!prefijo}* que expande a los nombres de todas las variables de shell
cuyos nombres comienzan con prefijo (vea la Sección 3.5.3 [Expansión de Parámetros de
Shell]).
• Bash presenta expansión indirecta de variables utilizando ${palabra} (vea la Sección 3.5.3
[Expansión de Parámetros de Shell]).
• Bash puede expandir los parámetros posicionales posteriores al $9 utilizando ${num} .
• Implementa la sustitución de comandos de tipo POSIX $( ) (vea la Sección 3.5.4 [Sustitución
de Comandos]), y la prefiere sobre la de la shell Bourne `` (la cual también está
implementada por compatibilidad hacia atrás).
• Bash tiene sustitución de procesos (vea la Sección 3.5.6 [Sustitución de Procesos]).
• Bash asigna automáticamente variables que proporcionan información sobre el usuario actual
(UID, EUID y GROUPS), el anfitrión actual (HOSTTYPE, OSTYPE, MACHTYPE y
HOSTNAME), y la instancia de Bash que está en ejecución (BASH, BASH_VERSION y
BASH_VERSINFO). Vea la Sección 5.2 [Variables de Bash], para obtener más detalles.
• Se utiliza la variable IFS para separar únicamente los resultados de la expansión, no todas las
palabras (vea la Sección 3.5.7 [Separación de Palabras]). Esto da por solucionado un antiguo
agujero de seguridad en la shell.
• Bash implementa el juego completo de operadores de expansión de nombres de fichero de
POSIX, incluyendo clases de carácter, clases de equivalencia y símbolos de intercalado (vea la

Página 141
Apéndice B: Diferencias Principales con la Shell de Bourne

Sección 3.5.8 [Expansión de Nombres de Fichero]).


• Bash implementa las características de concordancia de patrones extendidos cuando la opción
extglob está activada (vea la Sección 3.5.8.1 [Concordancia de Patrones]).
• Es posible tener una variable y una función con el mismo nombre; sh no separa los dos
espacios de nombres.
• Las funciones de Bash pueden tener variables locales utilizando el comando interno local, y
también se pueden escribir útiles funciones recursivas (vea la Sección 4.2 [Comandos Internos
de Bash]).
• Las asignaciones de variables que preceden a los comandos afectan únicamente a ese
comando, incluso en los comandos internos y en las funciones (vea la Sección 3.7.4
[Entorno]). En sh, todas las asignaciones de variables que preceden a los comandos son
globales a menos que el comando se ejecute desde el sistema de ficheros.
• Bash realiza la expansión de nombres de fichero en los nombres de fichero especificados como
operandos para los operadores de redirección de entrada y salida (vea la Sección 3.6
[Redirecciones]).
• Bash contiene el operador de redirección '<>', permitiendo que un fichero sea abierto tanto
para lectura como para escritura, y el operador de redirección '&>', para dirigir la salida
estándar y la salida de error estándar al mismo fichero (vea la Sección 3.6 [Redirecciones]).
• Bash incluye el operador de redirección '<<<', permitiendo utilizar una cadena como la
entrada estándar para un comando.
• Bash implementa los operadores de redirección ' [n]<&palabra' y '[n]>&palabra', que
mueven un descriptor de fichero a otro.
• Bash trata varios nombres de fichero de forma especial cuando estos se utilizan en operadores
de redirección (vea la Sección 3.6 [Redirecciones]).
• Bash puede abrir conexiones de red a máquinas y servicios arbitrarios con los operadores de
redirección (vea la Sección 3.6 [Redirecciones]).
• Está disponible la opción noclobber para evitar sobreescribir ficheros existentes con la
redirección de la salida (vea la Sección 4.3.1 [El Comando Interno Set]). El operador de
redirección '>|' se puede utilizar para anular la opción noclobber.
• Los comandos internos de Bash cd y pwd (vea la Sección 4.1 [Comandos Internos de la
Shell]) toman las opciones '-L' y '-P' para intercambiar entre los modos físico y lógico.
• Bash permite que una función sobreescirba un comando interno con el mismo nombre, y
proporciona acceso a la funcionalidad de ese comando interno dentro de la función mediante
los comandos internos builtin y command (vea la Sección 4.2 [Comandos Internos de
Bash]).
• El comando interno command permite deshabilitar selectivamente funciones cuando se está
realizando una búsqueda de comandos (vea la Sección 4.2 [Comandos Internos de Bash]).
• Los comandos internos individuales se pueden activar o desactivar utilizando el comando
interno enable (vea la Sección [Comandos Internos de Bash]).
• El comando interno exec toma opciones adicionales que permiten a los usuarios controlar los
contenidos del entorno pasado al comando ejecutado, y cual será el argumento 0 del comando
(vea la Sección 4.1 [Comandos Internos de Bash]).
• Las funciones se pueden exportar a los hijos mediante el entorno utilizando ' export -f' (vea
la Sección 3.3 [Funciones de la Shell]).
• Los comandos internos de Bash export, readonly y declare pueden tomar la opción '-f'
para actuar en funciones de shell, la opción '-p' para mostrar variables con varios atributos

Página 142
Apéndice B: Diferencias Principales con la Shell de Bourne

establecidos en un formato que pueda ser utilizado como entrada de la shell, la opción ' -n'
para eliminar varios atributos de variables, y argumentos ' nombre=valor' para establecer
atributos de variable y valores simultáneamente.
• El comando interno hash permite asociar un nombre a un nombre de fichero arbitrario,
incluso cuando ese nombre de fichero no se puede encontrar buscando en $PATH , mediante
'hash -p' (vea la Sección 4.1 [Comandos Internos de la Shell Bourne]).
• Bash incluye un comando interno help para referenciar rápidamente a las características de la
shell (vea la Sección 4.2 [Comandos Internos Bash]).
• Está disponible el comando interno print f para mostrar salida formateada (vea la Sección 4.2
[Comandos Internos de Bash]).
• El comando interno read (vea la Sección 4.2 [Comandos Internos de Bash]) leerá una línea
terminada en '\' con la opción '-r', y usará la variable REPLY por defecto si no se suministran
argumentos de tipo opción. El comando interno read de Bash también tiene opciones
adicionales para controlar la entrada: la opción ' -s' desactivará la impresión (el eco) de los
caracteres introducidos conforme son leídos, la opción '-t' permitirá a read expirar si la
entrada no se produce en un tiempo especificado por un número de segundos, la opción ' -n'
permitirá leer únicamente un número especificado de caracteres en vez de una línea completa,
y la opción '-d' leerá hasta que se introduzca un determinado carácter en vez de una nueva
línea.
• Se puede utilizar el comando interno return para abortar la ejecución de los guiones de
comandos ejecutados con los comandos internos . o source (vea la Sección 4.1 [Comandos
Internos de la Shell Bourne]).
• Bash incluye el comando interno shopt para obtener un control más detallado de las
capacidades opcionales de la shell (vea la Sección 4.3.2 [El Comando Interno Shopt]), y
permite que estas opciones se establezcan o se elimien en la invocación de la shell (vea la
Sección 6.1 [Invocando a Bash]).
• Bash tiene mucho más comportamiento opcional controlable con el comando interno set (vea
la Sección 4.3.1 [El Comando Interno Set]).
• La opción '-x' (xtrace) muestra otros comandos distintos de los comandos simples cuando se
realiza una traza de ejecución (vea la Sección 4.3.1 [El Comando Interno Set]).
• El comando interno test (vea la Sección 4.1 [Comandos Internos de la Shell Bourne]) es
ligeramente diferente al implementado por el algoritmo POSIX, el cual especifica el
comportamiento basado en el número de argumentos.
• Bash incluye el comando interno caller, que muestra el contenido de cualquier llamada a
subrutina activa (una función de shell o un guión ejecutado con los comandos internos . o
source). Esto hace posible al depurador de Bash.
• El comando interno trap (vea la Sección 4.1 [Comandos Internos de la Shell Bourne]),
permite la especificación de una pseudo-señal DEBUG, similar a EXIT. Los comandos
especificados con una trampa DEBUG se ejecutan antes de cualquier comando simple,
comando for, comando case, comando select, cualquier comando for aritmético, y antes del
primer comando ejecutado en una función de shell. Las funciones de shell no heredan la
trampa DEBUG a menos que la función tenga el atributo trace o se haya activado la opción
functrace utilizando el comando interno shopt. La opción de shell extdebug tiene
efectos adicionales en la trampa DEBUG.
El comando interno trap (vea la Sección 4.1 [Comandos Internos de la Shell Bourne])
permite especificar una pseudo-señal ERR, similar a EXIT y DEBUG. Los comandos

Página 143
Apéndice B: Diferencias Principales con la Shell de Bourne

especificados con una trampa ERR se ejecutan después de que un comando simple falle, con
unas pocas excepciones. La trampa ERR no se hereda por las funciones de shell a menos que la
opción -o errtrace del comando interno set esté activada.
El comando interno trap (vea la Sección 4.1 [Comandos Internos de la Shell Bourne]),
permite especificar una pseudo-señal RETURN, similar a EXIT y DEBUG. Los Comandos
especificados con una trampa RETURN se ejecutan antes de que la ejecución continue tras la
función de shell o un script ejecutado con . O source finalice. Las funciones de shell no
heredan la trampa RETURN a menos que se le haya dado a la función el atributo trace o se
haya activado la opción functrace utilizando el comando interno shopt.
• El comando interno type es más amplio y proporciona más información sobre los nombres
que encuentra (vea la Sección 4.2 [Comandos Internos de Bash]).
• El comando interno umask de Bash permite una opción ' -p' que produce que la salida sea
mostrada de forma que esta pueda ser reutilizada como entrada (vea la Sección 4.1
[Comandos Internos de la Shell Bourne]).
• Bash implementa una pila de directorios tipo csh, y proporciona los comandos internos
pushd, popd y dirs para manipularla (vea la Sección 6.8 [La Pila de Directorios]). Bash
también permite ver los elementos de la pila de directorios en los valores de la variable de shell
DIRSTACK .
• Bash interpreta los caracteres especiales escapados mediante una barra invertida en las cadenas
de prompt cuando se encuentra en modo interactivo (vea la Sección 6.9 [Imprimiendo un
Prompt]).
• El modo restringido de Bash es más útil (vea la Sección 6.10 [La Shell Restringida]); el modo
restringido de la shell SVR4.2 está demasiado limitado.
• El comando interno disown puede eliminar una tarea de la tabla de tareas interna de la shell
(vea la Sección 7.2 [Comandos Internos de Control de Tareas]) o suprimir el envío de la señal
SIGHUP a una tarea cuando la shell finaliza como resultado de un SIGHUP.
• Bash incluye varias características para soportar un depurador aislado para los guiones de
comandos de shell.
• La shell SVR4.2 tiene dos comandos internos relacionados con privilegios ( mldmode y priv)
que no están presente en Bash.
• Bash no tiene los comandos internos stop o newgrp.
• Bash no utiliza la variable SHACCT ni realiza estadísticas de la shell.
• El shell SVR4.2 utiliza una variable TIMEOUT similar a la TMOUT utilizada por Bash.
Se pueden encontrar otras características únicas de Bash en el Capítulo 6 [Características de
Bash].

B.1.- Diferencias de Implementación con la Shell SVR4.2


Puesto que Bash es una implementación completamente nueva no sufre de muchas de las limitaciones
de la shell SVR4.2. Por ejemplo:
• Bash no bifurca una subshell cuando redirecciona hacia o desde una estructura de control
como en una sentencia if o while.
• Bash no permite comillas sin balancear. La shell SVR4.2 insertaría silenciosamente la comilla
de cierre necesaria al llegar al EOF bajo ciertas circunstancias. Esto puede ser la causa de
algunos errores difíciles de encontrar.
• La shell SVR4.2 utiliza un burdo esquema de gestión de memoria basado en atrapar
SIGSEGV. Si la shell se inicia desde un proceso con la señal SIGSEGV bloqueada (p.e.,

Página 144
Apéndice B: Diferencias Principales con la Shell de Bourne

utilizando la llamada a la función system() de la librería C), podría comportarse de forma


incorrecta.
• En un cuestionable intento de seguridad, la shell SVR4.2, cuando es invocada sin la opción ' -
p', modificará sus UID y GID real y efectivo si hay menos de algún valor mágico de umbral,
generalmente 100. Esto puede llevar a resultados inesperados.
• La shell SVR4.2 no permite a los usuarios atrapar las señales SIGSEGV, SIGALRM o
SIGCHLD.
• La shell SVR4.2 no permite que las variables IFS , MAILCHECK, PATH, PS1 o PS2 sean
eliminadas.
• La shell SVR4.2 trata '^' como el equivalente no documentado de '|'.
• Bash permite múltiples argumentos de opción cuando se invoca ( -x -v); la shel SVR4.2
permitía únicamente un argumento opción ( -xv). De hecho, algunas versiones de la shell
fallan estrepitosamente si el segundo argumento comienza con un '-'.
• La shell SVR4.2 finaliza un guión de comandos si cualquier comando interno falla; Bash
finaliza un guión de comandos sólo si falla alguno de los comandos internos especiales de
POSIX, y sólo para ciertos fallos, cómo se enumera en el estándar POSIX.
• La shell SVR4.2 se comporta de forma diferente cuando se invoca con jsh (esto activa el
control de tareas).

Página 145
Apéndice C: Licencia de Documentación Libre de GNU (Versión Original)

Apéndice C: GNU Free Documentation License


Version 1.3, 3 November 2008
© 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. Copyright
http://fsf.org/
Everyone is permitted to copy and distribute verbatim copies of this license document, but
changing it is not allowed.

C.0.- PREAMBLE
The purpose of this License is to make a manual, textbook, or other functional and useful document
free in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with
or without modifying it, either commercially or non/commercially. Secondarily, this License preserves
for the author and publisher a way to get credit for their work, while not being considered responsible
for modifications made by others.
This License is a kind of “copyleft”, which means that derivative works of the document must
themselves be free in the same sense. It complements the GNU General Public License, which is a
copyleft license designed for free software.
We have designed this License in order to use it for manuals for free software, because free
software needs free documentation: a free program should come with manuals providing the same
freedoms that the software does. But this License is not limited to software manuals; it can be used for
any textual work, regardless of subject matter or whether it is published as a printed book. We
recommend this License principally for works whose purpose is instruction or reference.

C.1.- APPLICABILITY AND DEFINITIONS


This License applies to any manual or other work, in any medium, that contains a notice placed by the
copyright holder saying it can be distributed under the terms of this License. Such a notice grants a
world-wide, royalty-free license, unlimited in duration, to use that work under the conditions stated
herein. The “Document”, below, refers to any such manual or work. Any member of the public is a
licensee, and is addressed as “you”. You accept the license if you copy, modify or distribute the work
in a way requiring permission under copyright law.
A “Modified Version” of the Document means any work containing the Document or a portion of
it, either copied verbatim, or with modifications and/or translated into another language.
A “Secondary Section” is a named appendix or a front-matter section of the Document that deals
exclusively with the relationship of the publishers or authors of the Document to the Document’s
overall subject (or to related matters) and contains nothing that could fall directly within that overall
subject. (Thus, if the Document is in part a textbook of mathematics, a Secondary Section may not
explain any mathematics.) The relationship could be a matter of historical connection with the subject
or with related matters, or of legal, commercial, philosophical, ethical or political position regarding
them.
The “Invariant Sections” are certain Secondary Sections whose titles are designated, as being
those of Invariant Sections, in the notice that says that the Document is released under this License. If
a section does not fit the above definition of Secondary then it is not allowed to be designated as
Invariant. The Document may contain zero Invariant Sections. If the Document does not identify any
Invariant Sections then there are none.
The “Cover Texts” are certain short passages of text that are listed, as Front-Cover Texts or
Back-Cover Texts, in the notice that says that the Document is released under this License. A Front-
Cover Text may be at most 5 words, and a Back-Cover Text may be at most 25 words.

Página 146
Apéndice C: Licencia de Documentación Libre de GNU (Versión Original)

A “Transparent” copy of the Document means a machine-readable copy, represented in a format


whose specification is available to the general public, that is suitable for revising the document
straightforwardly with generic text editors or (for images composed of pixels) generic paint programs
or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters
or for automatic translation to a variety of formats suitable for input to text formatters. A copy made
in an otherwise Transparent file format whose markup, or absence of markup, has been arranged to
thwart or discourage subsequent modification by readers is not Transparent. An image format is not
Transparent if used for any substantial amount of text. A copy that is not “Transparent” is called
“Opaque”.
Examples of suitable formats for Transparent copies include plain ascii without markup, Texinfo
input format, LaTEX input format, SGML or XML using a publicly available DTD, and standard-
conforming simple HTML, PostScript or PDF designed for human modification. Examples of
transparent image formats include PNG, XCF and JPG. Opaque formats include proprietary formats
that can be read and edited only by proprietary word processors, SGML or XML for which the DTD
and/or processing tools are not generally available, and the machine-generated HTML, PostScript or
PDF produced by some word processors for output purposes only.
The “Title Page” means, for a printed book, the title page itself, plus such following pages as are
needed to hold, legibly, the material this License requires to appear in the title page. For works in
formats which do not have any title page as such, “Title Page” means the text near the most prominent
appearance of the work’s title, preceding the beginning of the body of the text.
The “publisher” means any person or entity that distributes copies of the Document to the public.
A section “Entitled XYZ” means a named subunit of the Document whose title either is precisely
XYZ or contains XYZ in parentheses following text that translates XYZ in another language. (Here
XYZ stands for a specific section name mentioned below, such as “Acknowledgements”,
“Dedications”, “Endorsements”, or “History”.) To “Preserve the Title” of such a section when you
modify the Document means that it remains a section “Entitled XYZ” according to this definition.
The Document may include Warranty Disclaimers next to the notice which states that this
License applies to the Document. These Warranty Disclaimers are considered to be included by
reference in this License, but only as regards disclaiming warranties:
any other implication that these Warranty Disclaimers may have is void and has no effect on the
meaning of this License.

C.2.- VERBATIM COPYING


You may copy and distribute the Document in any medium, either commercially or noncommercially,
provided that this License, the copyright notices, and the license notice saying this License applies to
the Document are reproduced in all copies, and that you add no other conditions whatsoever to those
of this License. You may not use technical measures to obstruct or control the reading or further
copying of the copies you make or distribute. However, you may accept compensation in exchange for
copies.
If you distribute a large enough number of copies you must also follow the conditions in section
3.
You may also lend copies, under the same conditions stated above, and you may publicly display
copies.

C.3.- COPYING IN QUANTITY


If you publish printed copies (or copies in media that commonly have printed covers) of the
Document, numbering more than 100, and the Document’s license notice requires Cover Texts, you

Página 147
Apéndice C: Licencia de Documentación Libre de GNU (Versión Original)

must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover
Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and
legibly identify you as the publisher of these copies. The front cover must present the full title with all
words of the title equally prominent and visible. You may add other material on the covers in addition.
Copying with changes limited to the covers, as long as they preserve the title of the Document
and satisfy these conditions, can be treated as verbatim copying in other respects.
If the required texts for either cover are too voluminous to fit legibly, you should put the first ones
listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages.
If you publish or distribute Opaque copies of the Document numbering more than 100, you must
either include a machine-readable Transparent copy along with each Opaque copy, or state in or with
each Opaque copy a computer-network location from which the general network-using public has
access to download using public-standard network protocols a complete Transparent copy of the
Document, free of added material. If you use the latter option, you must take reasonably prudent
steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy
will remain thus accessible at the stated location until at least one year after the last time you
distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public.
It is requested, but not required, that you contact the authors of the Document well before
redistributing any large number of copies, to give them a chance to provide you with an updated
version of the Document.

C.4.- MODIFICATIONS
You may copy and distribute a Modified Version of the Document under the conditions of sections 2
and 3 above, provided that you release the Modified Version under precisely this License, with the
Modified Version filling the role of the Document, thus licensing distribution and modification of the
Modified Version to whoever possesses a copy of it. In addition, you must do these things in the
Modified Version:
• A. Use in the Title Page (and on the covers, if any) a title distinct from that of the
Document, and from those of previous versions (which should, if there were any, be listed in
the History section of the Document). You may use the same title as a previous version if the
original publisher of that version gives permission.
• B. List on the Title Page, as authors, one or more persons or entities responsible for
authorship of the modifications in the Modified Version, together with at least five of the
principal authors of the Document (all of its principal authors, if it has fewer than five), unless
they release you from this requirement.
• C. State on the Title page the name of the publisher of the Modified Version, as the
publisher.
• D. Preserve all the copyright notices of the Document.
• E. Add an appropriate copyright notice for your modifications adjacent to the other
copyright notices.
• F. Include, immediately after the copyright notices, a license notice giving the public
permission to use the Modified Version under the terms of this License, in the form shown in
the Addendum below.
• G. Preserve in that license notice the full lists of Invariant Sections and required Cover
Texts given in the Document’s license notice.
• H. Include an unaltered copy of this License.
• I. Preserve the section Entitled “History”, Preserve its Title, and add to it an item stating

Página 148
Apéndice C: Licencia de Documentación Libre de GNU (Versión Original)

at least the title, year, new authors, and publisher of the Modified Version as given on the Title
Page. If there is no section Entitled “History” in the Document, create one stating the title,
year, authors, and publisher of the Document as given on its Title Page, then add an item
describing the Modified Version as stated in the previous sentence.
• J. Preserve the network location, if any, given in the Document for public access to a
Transparent copy of the Document, and likewise the network locations given in the Document
for previous versions it was based on. These may be placed in the “History” section. You may
omit a network location for a work that was published at least four years before the Document
itself, or if the original publisher of the version it refers to gives permission.
• K. For any section Entitled “Acknowledgements” or “Dedications”, Preserve the Title of
the section, and preserve in the section all the substance and tone of each of the ents and/or
dedications given therein.
• L. Preserve all the Invariant Sections of the Document, unaltered in their text and in their
titles. Section numbers or the equivalent are not considered part of the section titles.
• M. Delete any section Entitled “Endorsements”. Such a section may not be included in
the Modified Version.
• N. Do not retitle any existing section to be Entitled “Endorsements” or to conflict in title
with any Invariant Section.
• O. Preserve any Warranty Disclaimers.
If the Modified Version includes new front-matter sections or appendices that qualify as
Secondary Sections and contain no material copied from the Document, you may at your option
designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant
Sections in the Modified Version’s license notice. These titles must be distinct from any other section
titles.
You may add a section Entitled “Endorsements”, provided it contains nothing but endorsements
of your Modified Version by various parties—for example, statements of peer review or that the text
has been approved by an organization as the authoritative definition of a standard.
You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25
words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one
passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements
made by) any one entity. If the Document already includes a cover text for the same cover, previously
added by you or by arrangement made by the same entity you are acting on behalf of, you may not
add another; but you may replace the old one, on explicit permission from the previous publisher that
added the old one.
The author(s) and publisher(s) of the Document do not by this License give permission to use
their names for publicity for or to assert or imply endorsement of any Modified Version.

C.5.- COMBINING DOCUMENTS


You may combine the Document with other documents released under this License, under the terms
defined in section 4 above for modified versions, provided that you include in the combination all of
the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant
Sections of your combined work in its license notice, and that you preserve all their Warranty
Disclaimers.
The combined work need only contain one copy of this License, and multiple identical Invariant
Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same
name but different contents, make the title of each such section unique by adding at the end of it, in

Página 149
Apéndice C: Licencia de Documentación Libre de GNU (Versión Original)

parentheses, the name of the original author or publisher of that section if known, or else a unique
number. Make the same adjustment to the section titles in the list of Invariant Sections in the license
notice of the combined work.
In the combination, you must combine any sections Entitled “History” in the various original
documents, forming one section Entitled “History”; likewise combine any sections Entitled
“Acknowledgements”, and any sections Entitled “Dedications”. You must delete all sections Entitled
“Endorsements.”

C.6.- COLLECTIONS OF DOCUMENTS


You may make a collection consisting of the Document and other documents released under this
License, and replace the individual copies of this License in the various documents with a single copy
that is included in the collection, provided that you follow the rules of this License for verbatim
copying of each of the documents in all other respects.
You may extract a single document from such a collection, and distribute it individually under
this License, provided you insert a copy of this License into the extracted document, and follow this
License in all other respects regarding verbatim copying of that document.

C.7.- AGGREGATION WITH INDEPENDENT WORKS


A compilation of the Document or its derivatives with other separate and independent documents or
works, in or on a volume of a storage or distribution medium, is called an “aggregate” if the copyright
resulting from the compilation is not used to limit the legal rights of the compilation’s users beyond
what the individual works permit. When the Document is included in an aggregate, this License does
not apply to the other works in the aggregate which are not themselves derivative works of the
Document.
If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if
the Document is less than one half of the entire aggregate, the Document’s Cover Texts may be placed
on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if the
Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole
aggregate.

C.8.- TRANSLATION
Translation is considered a kind of modification, so you may distribute translations of the Document
under the terms of section 4. Replacing Invariant Sections with translations requires special
permission from their copyright holders, but you may include translations of some or all Invariant
Sections in addition to the original versions of these Invariant Sections. You may include a translation
of this License, and all the license notices in the Document, and any Warranty Disclaimers, provided
that you also include the original English version of this License and the original versions of those
notices and disclaimers. In case of a disagreement between the translation and the original version of
this License or a notice or disclaimer, the original version will prevail.
If a section in the Document is Entitled “Acknowledgements”, “Dedications”, or “History”, the
requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title.

D.0.1.- TERMINATION
You may not copy, modify, sublicense, or distribute the Document except as expressly provided under
this License. Any attempt otherwise to copy, modify, sublicense, or distribute it is void, and will
automatically terminate your rights under this License.
However, if you cease all violation of this License, then your license from a particular copyright

Página 150
Apéndice C: Licencia de Documentación Libre de GNU (Versión Original)

holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally
terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation
by some reasonable means prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is reinstated permanently if the
copyright holder notifies you of the violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that copyright holder, and you cure
the violation prior to 30 days after your receipt of the notice.
Termination of your rights under this section does not terminate the licenses of parties who have
received copies or rights from you under this License. If your rights have been terminated and not
permanently reinstated, receipt of a copy of some or all of the same material does not give you any
rights to use it.

C.9.- FUTURE REVISIONS OF THIS LICENSE


The Free Software Foundation may publish new, revised versions of the GNU Free Documentation
License from time to time. Such new versions will be similar in spirit to the present version, but may
differ in detail to address new problems or concerns.
See http://www.gnu.org/copyleft/.
Each version of the License is given a distinguishing version number. If the Document specifies
that a particular numbered version of this License “or any later version” applies to it, you have the
option of following the terms and conditions either of that specified version or of any later version that
has been published (not as a draft) by the Free Software Foundation. If the Document does not
specify a version number of this License, you may choose any version ever published (not as a draft)
by the Free Software Foundation. If the Document specifies that a proxy can decide which future
versions of this License can be used, that proxy’s public statement of acceptance of a version
permanently authorizes you to choose that version for the Document.

C.10.- RELICENSING
“Massive Multiauthor Collaboration Site” (or “MMC Site”) means any World Wide Web server that
publishes copyrightable works and also provides prominent facilities for anybody to edit those works.
A public wiki that anybody can edit is an example of such a server. A “Massive Multiauthor
Collaboration” (or “MMC”) contained in the site means any set of copyrightable works thus published
on the MMC site.
“CC-BY-SA” means the Creative Commons Attribution-Share Alike 3.0 license pub- lished by
Creative Commons Corporation, a not-for-profit corporation with a principal place of business in San
Francisco, California, as well as future copyleft versions of that license published by that same
organization.
“Incorporate” means to publish or republish a Document, in whole or in part, as part of another
Document.
An MMC is “eligible for relicensing” if it is licensed under this License, and if all works that
were first published under this License somewhere other than this MMC, and subsequently
incorporated in whole or in part into the MMC, (1) had no cover texts or invariant sections, and (2)
were thus incorporated prior to November 1, 2008.
The operator of an MMC Site may republish an MMC contained in the site under CC-BY-SA on
the same site at any time before August 1, 2009, provided the MMC is eligible for relicensing.

C.11.- ADDENDUM: How to use this License for your documents


To use this License in a document you have written, include a copy of the License in the document

Página 151
Apéndice C: Licencia de Documentación Libre de GNU (Versión Original)

and put the following copyright and license notices just after the title page:
Copyright (C) year your name.
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free
Documentation License, Version 1.3 or any later version published by the Free Software Foundation;
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is
included in the section entitled ‘‘GNU Free Documentation License’’.
If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the “with. . .
Texts.” line with this:
with the Invariant Sections being list their titles, with the Front-Cover Texts being list, and with the Back-
Cover Texts being list.
If you have Invariant Sections without Cover Texts, or some other combination of the three,
merge those two alternatives to suit the situation.
If your document contains nontrivial examples of program code, we recommend releasing these
examples in parallel under your choice of free software license, such as the GNU General Public
License, to permit their use in free software.

Página 152
Apéndice D: Licencia de Documentación Libre de GNU

Apéndice D: Licencia de Documentación Libre de GNU (Traducción)


Versión 1.3, 3 Noviembre 2008
This is an unofficial translation of the GNU Free Documentation License into Spanish. It was not
published by the Free Software Foundation, and does not legally state the distribution terms for
documentation that uses the GNU FDL -- only the original English text of the GNU FDL does that.
However, we hope that this translation will help Spanish speakers understand the GNU FDL better.
Ésta es una traducción no oficial de la GNU Free Document License a Español (Castellano). No
ha sido publicada por la Free Software Foundation y no establece legalmente los términos de
distribución para trabajos que usen la GFDL (sólo el texto de la versión original en Inglés de la GFDL
lo hace). Sin embargo, esperamos que esta traducción ayude a los hispanohablantes a entender mejor
la GFDL. La versión original de la GFDL esta disponible en la Free Software Foundation.
Esta traducción está basada en una de la versión 1.2 por Joaquín Seoane.
Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. <http://www.fsf.org>
Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it
is not allowed.
Se permite la copia y distribución de copias literales de este documento de licencia, pero no se
permiten cambios.[1]

D.0.- PREÁMBULO
El propósito de esta Licencia es permitir que un manual, libro de texto, u otro documento escrito
sea libre en el sentido de libertad: asegurar a todo el mundo la libertad efectiva de copiarlo y
redistribuirlo, con o sin modificaciones, de manera comercial o no. En segundo término, esta Licencia
proporciona al autor y al editor[2] una manera de obtener reconocimiento por su trabajo, sin que se le
considere responsable de las modificaciones realizadas por otros.
Esta Licencia es de tipo copyleft, lo que significa que los trabajos derivados del documento deben
a su vez ser libres en el mismo sentido. Complementa la Licencia Pública General de GNU, que es
una licencia tipo copyleft diseñada para el software libre.
Hemos diseñado esta Licencia para usarla en manuales de software libre, ya que el software libre
necesita documentación libre: un programa libre debe venir con manuales que ofrezcan la mismas
libertades que el software. Pero esta licencia no se limita a manuales de software; puede usarse para
cualquier texto, sin tener en cuenta su temática o si se publica como libro impreso o no.
Recomendamos esta licencia principalmente para trabajos cuyo fin sea instructivo o de referencia.

D.1.- APLICABILIDAD Y DEFINICIONES


Esta Licencia se aplica a cualquier manual u otro trabajo, en cualquier soporte, que contenga una
nota del propietario de los derechos de autor que indique que puede ser distribuido bajo los términos
de esta Licencia. Tal nota garantiza en cualquier lugar del mundo, sin pago de derechos y sin límite de
tiempo, el uso de dicho trabajo según las condiciones aquí estipuladas. En adelante la palabra
Documento se referirá a cualquiera de dichos manuales o trabajos. Cualquier persona es un
licenciatario y será referido como Usted. Usted acepta la licencia si copia, modifica o distribuye el
trabajo de cualquier modo que requiera permiso según la ley de propiedad intelectual.
Una Versión Modificada del Documento significa cualquier trabajo que contenga el Documento o
una porción del mismo, ya sea una copia literal o con modificaciones y/o traducciones a otro idioma.
Una Sección Secundaria es un apéndice con título o una sección preliminar del Documento que
trata exclusivamente de la relación entre los autores o editores y el tema general del Documento (o
temas relacionados) pero que no contiene nada que entre directamente en dicho tema general (por

Página 153
Apéndice D: Licencia de Documentación Libre de GNU

ejemplo, si el Documento es en parte un texto de matemáticas, una Sección Secundaria puede no


explicar nada de matemáticas). La relación puede ser una conexión histórica con el tema o temas
relacionados, o una opinión legal, comercial, filosófica, ética o política acerca de ellos.
Las Secciones Invariantes son ciertas Secciones Secundarias cuyos títulos son designados como
Secciones Invariantes en la nota que indica que el documento es liberado bajo esta Licencia. Si una
sección no entra en la definición de Secundaria, no puede designarse como Invariante. El documento
puede no tener Secciones Invariantes. Si el Documento no identifica las Secciones Invariantes, es que
no las tiene.
Los Textos de Cubierta son ciertos pasajes cortos de texto que se listan como Textos de Cubierta
Delantera o Textos de Cubierta Trasera en la nota que indica que el documento es liberado bajo esta
Licencia. Un Texto de Cubierta Delantera puede tener como mucho 5 palabras, y uno de Cubierta
Trasera puede tener hasta 25 palabras.
Una copia Transparente del Documento, significa una copia para lectura en máquina,
representada en un formato cuya especificación está disponible al público en general, apto para que los
contenidos puedan ser vistos y editados directamente con editores de texto genéricos o (para imágenes
compuestas por puntos) con programas genéricos de manipulación de imágenes o (para dibujos) con
algún editor de dibujos ampliamente disponible, y que sea adecuado como entrada para formateadores
de texto o para su traducción automática a formatos adecuados para formateadores de texto. Una
copia hecha en un formato definido como Transparente, pero cuyo marcaje o ausencia de él haya sido
diseñado para impedir o dificultar modificaciones posteriores por parte de los lectores no es
Transparente. Un formato de imagen no es Transparente si se usa para una cantidad de texto
sustancial. Una copia que no es Transparente se denomina Opaca.
Como ejemplos de formatos adecuados para copias Transparentes están ASCII puro sin marcaje,
formato de entrada de Texinfo, formato de entrada de LaTeX, SGML o XML usando una DTD
disponible públicamente, y HTML, PostScript o PDF simples, que sigan los estándares y diseñados
para que los modifiquen personas. Ejemplos de formatos de imagen transparentes son PNG, XCF y
JPG. Los formatos Opacos incluyen formatos propietarios que pueden ser leídos y editados
únicamente en procesadores de palabras propietarios, SGML o XML para los cuáles las DTD y/o
herramientas de procesamiento no estén ampliamente disponibles, y HTML, PostScript o PDF
generados por algunos procesadores de palabras sólo como salida.
La Portada significa, en un libro impreso, la página de título, más las páginas siguientes que sean
necesarias para mantener, de manera legible, el material que esta Licencia requiere en la portada. Para
trabajos en formatos que no tienen página de portada como tal, Portada significa el texto cercano a la
aparición más prominente del título del trabajo, precediendo el comienzo del cuerpo del texto.
El "Editor" se refiere a cualquier persona o entidad que distribuya copias del Documento a el
público.
Una sección Titulada XYZ significa una parte del Documento cuyo título es precisamente XYZ o
contiene XYZ entre paréntesis, a continuación de texto que traduce XYZ a otro idioma (aquí XYZ se
refiere a nombres de sección específicos mencionados más abajo, como Agradecimientos,
Dedicatorias , Aprobaciones o Historia). Conservar el Título de tal sección cuando se modifica el
Documento significa que permanece una sección Titulada XYZ según esta definición.[3]
El Documento puede incluir Limitaciones de Garantía cercanas a la nota donde se declara que al
Documento se le aplica esta Licencia. Se considera que estas Limitaciones de Garantía están incluidas,
por referencia, en la Licencia, pero sólo en cuanto a limitaciones de garantía: cualquier otra
implicación que estas Limitaciones de Garantía puedan tener es nula y no tiene efecto en el significado
de esta Licencia.

Página 154
Apéndice D: Licencia de Documentación Libre de GNU

D.2.- COPIA LITERAL


Usted puede copiar y distribuir el Documento en cualquier soporte, sea en forma comercial o no,
siempre y cuando esta Licencia, las notas de copyright y la nota que indica que esta Licencia se aplica
al Documento se reproduzcan en todas las copias y que usted no añada ninguna otra condición a las
expuestas en esta Licencia. Usted no puede usar medidas técnicas para obstruir o controlar la lectura o
copia posterior de las copias que usted haga o distribuya. Sin embargo, usted puede aceptar
compensación a cambio de las copias. Si distribuye un número suficientemente grande de copias
también deberá seguir las condiciones de la sección 3.
Usted también puede prestar copias, bajo las mismas condiciones establecidas anteriormente, y
puede exhibir copias públicamente.

D.3.- COPIADO EN CANTIDAD


Si publica copias impresas del Documento (o copias en soportes que tengan normalmente
cubiertas impresas) que sobrepasen las 100, y la nota de licencia del Documento exige Textos de
Cubierta, debe incluir las copias con cubiertas que lleven en forma clara y legible todos esos Textos de
Cubierta: Textos de Cubierta Delantera en la cubierta delantera y Textos de Cubierta Trasera en la
cubierta trasera. Ambas cubiertas deben identificarlo a Usted clara y legiblemente como editor de tales
copias. La cubierta debe mostrar el título completo con todas las palabras igualmente prominentes y
visibles. Además puede añadir otro material en las cubiertas. Las copias con cambios limitados a las
cubiertas, siempre que conserven el título del Documento y satisfagan estas condiciones, pueden
considerarse como copias literales.
Si los textos requeridos para la cubierta son muy voluminosos para que ajusten legiblemente,
debe colocar los primeros (tantos como sea razonable colocar) en la verdadera cubierta y situar el
resto en páginas adyacentes.
Si Usted publica o distribuye copias Opacas del Documento cuya cantidad exceda las 100, debe
incluir una copia Transparente, que pueda ser leída por una máquina, con cada copia Opaca, o bien
mostrar, en cada copia Opaca, una dirección de red donde cualquier usuario de la misma tenga acceso
por medio de protocolos públicos y estandarizados a una copia Transparente del Documento
completa, sin material adicional. Si usted hace uso de la última opción, deberá tomar las medidas
necesarias, cuando comience la distribución de las copias Opacas en cantidad, para asegurar que esta
copia Transparente permanecerá accesible en el sitio establecido por lo menos un año después de la
última vez que distribuya una copia Opaca de esa edición al público (directamente o a través de sus
agentes o distribuidores).
Se solicita, aunque no es requisito, que se ponga en contacto con los autores del Documento antes
de redistribuir gran número de copias, para darles la oportunidad de que le proporcionen una versión
actualizada del Documento.

D.4.- MODIFICACIONES
Puede copiar y distribuir una Versión Modificada del Documento bajo las condiciones de las
secciones 2 y 3 anteriores, siempre que usted libere la Versión Modificada bajo esta misma Licencia,
con la Versión Modificada haciendo el rol del Documento, por lo tanto dando licencia de distribución
y modificación de la Versión Modificada a quienquiera posea una copia de la misma. Además, debe
hacer lo siguiente en la Versión Modificada:
• A. Usar en la Portada (y en las cubiertas, si hay alguna) un título distinto al del
Documento y de sus versiones anteriores (que deberían, si hay alguna, estar listadas en la
sección de Historia del Documento). Puede usar el mismo título de versiones anteriores al
original siempre y cuando quien las publicó originalmente otorgue permiso.

Página 155
Apéndice D: Licencia de Documentación Libre de GNU

• B. Listar en la Portada, como autores, una o más personas o entidades responsables de la


autoría de las modificaciones de la Versión Modificada, junto con por lo menos cinco de los
autores principales del Documento (todos sus autores principales, si hay menos de cinco), a
menos que le eximan de tal requisito.
• C. Mostrar en la Portada como editor el nombre del editor de la Versión Modificada.
• D. Conservar todas las notas de copyright del Documento.
• E. Añadir una nota de copyright apropiada a sus modificaciones, adyacente a las otras
notas de copyright.
• F. Incluir, inmediatamente después de las notas de copyright, una nota de licencia dando
el permiso para usar la Versión Modificada bajo los términos de esta Licencia, como se
muestra en el Apéndice [Apéndice] al final de este documento.
• G. Conservar en esa nota de licencia el listado completo de las Secciones Invariantes y de
los Textos de Cubierta que sean requeridos en la nota de Licencia del Documento original.
• H. Incluir una copia sin modificación de esta Licencia.
• I. Conservar la sección Titulada Historia, conservar su Título y añadirle un elemento que
declare al menos el título, el año, los nuevos autores y el editor de la Versión Modificada, tal
como figuran en la Portada. Si no hay una sección Titulada Historia en el Documento, crear
una estableciendo el título, el año, los autores y el editor del Documento, tal como figuran en
su Portada, añadiendo además un elemento describiendo la Versión Modificada, como se
estableció en la oración anterior.
• J. Conservar la dirección en red, si la hay, dada en el Documento para el acceso público a
una copia Transparente del mismo, así como las otras direcciones de red dadas en el
Documento para versiones anteriores en las que estuviese basado. Pueden ubicarse en la
sección Historia. Se puede omitir la ubicación en red de un trabajo que haya sido publicado
por lo menos cuatro años antes que el Documento mismo, o si el editor original de dicha
versión da permiso.
• K. En cualquier sección Titulada Agradecimientos o Dedicatorias, conservar el Título de
la sección y conservar en ella toda la sustancia y el tono de los agradecimientos y/o
dedicatorias incluidas por cada contribuyente.
• L. Conservar todas las Secciones Invariantes del Documento, sin alterar su texto ni sus
títulos. Números de sección o el equivalente no son considerados parte de los títulos de la
sección.
• M. Borrar cualquier sección titulada Aprobaciones. Tales secciones no pueden estar
incluidas en las Versiones Modificadas.
• N. No cambiar el título de ninguna sección existente a Aprobaciones ni a uno que entre
en conflicto con el de alguna Sección Invariante.
• O. Conservar todas las Limitaciones de Garantía.
Si la Versión Modificada incluye secciones o apéndices nuevos que califiquen como Secciones
Secundarias y contienen material no copiado del Documento, puede opcionalmente designar algunas o
todas esas secciones como invariantes. Para hacerlo, añada sus títulos a la lista de Secciones
Invariantes en la nota de licencia de la Versión Modificada. Tales títulos deben ser distintos de
cualquier otro título de sección.
Puede añadir una sección titulada Aprobaciones, siempre que contenga únicamente aprobaciones
de su Versión Modificada por otras fuentes --por ejemplo, observaciones de peritos o que el texto ha
sido aprobado por una organización como la definición oficial de un estándar.
Puede añadir un pasaje de hasta cinco palabras como Texto de Cubierta Delantera y un pasaje de

Página 156
Apéndice D: Licencia de Documentación Libre de GNU

hasta 25 palabras como Texto de Cubierta Trasera en la Versión Modificada. Una entidad solo puede
añadir (o hacer que se añada) un pasaje al Texto de Cubierta Delantera y uno al de Cubierta Trasera.
Si el Documento ya incluye un textos de cubiertas añadidos previamente por usted o por la misma
entidad que usted representa, usted no puede añadir otro; pero puede reemplazar el anterior, con
permiso explícito del editor que agregó el texto anterior.
Con esta Licencia ni los autores ni los editores del Documento dan permiso para usar sus
nombres para publicidad ni para asegurar o implicar aprobación de cualquier Versión Modificada.

D.5.- COMBINACIÓN DE DOCUMENTOS


Usted puede combinar el Documento con otros documentos liberados bajo esta Licencia, bajo los
términos definidos en la sección 4 anterior para versiones modificadas, siempre que incluya en la
combinación todas las Secciones Invariantes de todos los documentos originales, sin modificar,
listadas todas como Secciones Invariantes del trabajo combinado en su nota de licencia. Así mismo
debe incluir la Limitación de Garantía.
El trabajo combinado necesita contener solamente una copia de esta Licencia, y puede
reemplazar varias Secciones Invariantes idénticas por una sola copia. Si hay varias Secciones
Invariantes con el mismo nombre pero con contenidos diferentes, haga el título de cada una de estas
secciones único añadiéndole al final del mismo, entre paréntesis, el nombre del autor o editor original
de esa sección, si es conocido, o si no, un número único. Haga el mismo ajuste a los títulos de sección
en la lista de Secciones Invariantes de la nota de licencia del trabajo combinado.
En la combinación, debe combinar cualquier sección Titulada Historia de los documentos
originales, formando una sección Titulada Historia; de la misma forma combine cualquier sección
Titulada Agradecimientos, y cualquier sección Titulada Dedicatorias. Debe borrar todas las secciones
tituladas Aprobaciones.

D.6.- COLECCIONES DE DOCUMENTOS


Puede hacer una colección que conste del Documento y de otros documentos liberados bajo esta
Licencia, y reemplazar las copias individuales de esta Licencia en todos los documentos por una sola
copia que esté incluida en la colección, siempre que siga las reglas de esta Licencia para cada copia
literal de cada uno de los documentos en cualquiera de los demás aspectos.
Puede extraer un solo documento de una de tales colecciones y distribuirlo individualmente bajo
esta Licencia, siempre que inserte una copia de esta Licencia en el documento extraído, y siga esta
Licencia en todos los demás aspectos relativos a la copia literal de dicho documento.

D.7.- AGREGACIÓN CON TRABAJOS INDEPENDIENTES


Una recopilación que conste del Documento o sus derivados y de otros documentos o trabajos
separados e independientes, en cualquier soporte de almacenamiento o distribución, se denomina un
agregado si el copyright resultante de la compilación no se usa para limitar los derechos de los
usuarios de la misma más allá de lo que los de los trabajos individuales permiten. Cuando el
Documento se incluye en un agregado, esta Licencia no se aplica a otros trabajos del agregado que no
sean en sí mismos derivados del Documento.
Si el requisito de la sección 3 sobre el Texto de Cubierta es aplicable a estas copias del
Documento y el Documento es menor que la mitad del agregado entero, los Textos de Cubierta del
Documento pueden colocarse en cubiertas que enmarquen solamente el Documento dentro del
agregado, o el equivalente electrónico de las cubiertas si el documento está en forma electrónica. En
caso contrario deben aparecer en cubiertas impresas enmarcando todo el agregado.

Página 157
Apéndice D: Licencia de Documentación Libre de GNU

D.8.- TRADUCCIÓN
La Traducción es considerada como un tipo de modificación, por lo que usted puede distribuir
traducciones del Documento bajo los términos de la sección 4. El reemplazo las Secciones Invariantes
con traducciones requiere permiso especial de los dueños de derecho de autor, pero usted puede
añadir traducciones de algunas o todas las Secciones Invariantes a las versiones originales de las
mismas. Puede incluir una traducción de esta Licencia, de todas las notas de licencia del documento,
así como de las Limitaciones de Garantía, siempre que incluya también la versión en Inglés de esta
Licencia y las versiones originales de las notas de licencia y Limitaciones de Garantía. En caso de
desacuerdo entre la traducción y la versión original en Inglés de esta Licencia, la nota de licencia o la
limitación de garantía, la versión original en Inglés prevalecerá.
Si una sección del Documento está Titulada Agradecimientos, Dedicatorias o Historia el requisito
(sección 4) de Conservar su Título (Sección 1) requerirá, típicamente, cambiar su título.

D.9.- TERMINACIÓN
Usted no puede copiar, modificar, sublicenciar o distribuir el Documento salvo por lo permitido
expresamente bajo esta Licencia. Cualquier intento en otra manera de copia, modificación,
sublicenciamiento, o distribución de él es nulo, y dará por terminados automáticamente sus derechos
bajo esa Licencia.
Sin embargo, si usted cesa toda violación a esta Licencia, entonces su licencia proveniente de un
titular de copyright queda restaurada (a) provisionalmente, a menos y hasta que el titular del copyright
explícita y finalmente termine su licencia, y (b) permanentemente, si el titular del copyright falla en
notificarle de la violación por algún medio razonable en un tiempo menor a 60 días después del cese.
Además, su licencia proveniente de un titular del copyright particular queda restaurada
permanentemente si el titular del copyright le notifica de la violación por algún método razonable, es
la primera vez que usted ha recibido aviso de la violación de esta Licencia (para cualquier trabajo) de
ese titular del copyright, y usted remedia la violación en un tiempo menor a 30 días después de recibir
dicho aviso.
La terminación de sus derechos bajo ésta sección no termina la licencia de terceros que hayan
recibido copias o derechos de usted bajo ésta Licencia. Si sus derechos han sido terminados y no
restaurados permanentemente, recibir una copia de alguna parte o el total del mismo material no le da
ningún derecho de usarlo.

D.9.1.- REVISIONES FUTURAS DE ESTA LICENCIA


De vez en cuando la Free Software Foundation puede publicar versiones nuevas y revisadas de la
Licencia de Documentación Libre GNU. Tales versiones nuevas serán similares en espíritu a la
presente versión, pero pueden diferir en detalles para solucionar nuevos problemas o intereses. Vea
http://www.gnu.org/copyleft/.
Cada versión de la Licencia tiene un número de versión que la distingue. Si el Documento
especifica que se aplica una versión numerada en particular de esta licencia o cualquier versión
posterior, usted tiene la opción de seguir los términos y condiciones de la versión especificada o
cualquiera posterior que haya sido publicada (no como borrador) por la Free Software Foundation. Si
el Documento no especifica un número de versión de esta Licencia, puede escoger cualquier versión
que haya sido publicada (no como borrador) por la Free Software Foundation. Si el Documento
especifica que un apoderado puede decidir qué versión futura de esta Licencia puede ser utilizada, esa
frase de aceptación del apoderado de una versión le autoriza permanentemente a escoger esa versión
para el Documento.

Página 158
Apéndice D: Licencia de Documentación Libre de GNU

D.10.- RE-LICENCIAMIENTO
Un "Sitio de Colaboración Masiva Multiautor" (o "Sitio CMM") significa cualquier servidor
World Wide Web que publique trabajos que puedan ser sujetos a copyright y que también provea
medios prominentes para que cualquiera pueda editar esos trabajos. Una Wiki pública que cualquiera
puede editar es un ejemplo de tal servidor. Una "Colaboración Masiva Multiautor" (o "CMM")
contenida en el sitio significa cualquier colección de trabajos que puedan ser sujetos a copyright
publicados en el sitio de CMM.
"CC-BY-SA" significa la licencia Creative Commons Attribution-Share Alike 3.0
(Reconocimiento-Compartir bajo la misma licencia 3.0 de Creative Commons) publicada por Creative
Commons Corporation, una corporación sin fines de lucro con base en San Francisco, California, así
como versiones futuras copyleft de esa licencia publicada por esa misma organización.
"Incorporar" significa publicar o re-publicar un Documento, como un todo o parcialmente, como
parte de otro Documento.
Un sitio CMM es "elegible para re-licenciamiento" si es licenciado bajo esta Licencia, y si todos
los trabajos que fueron publicados originalmente bajo esta Licencia en algún otro lugar diferente a esta
CMM, y subsecuentemente incorporado como un todo o parcialmente a la CMM, (1)no tenía textos
de cubierta o secciones invariantes, y (2) fueron incorporados previo a Noviembre 1, 2008.
El operador de un Sitio CMM puede volver a publicar una CMM contenida en el sitio bajo CC-
BY-SA en el mismo sitio en cualquier momento antes de Agosto 1, 2009, siempre que la CMM sea
elegible para re-licenciamiento.

D.11.- ADDENDUM: Cómo usar esta Licencia en sus documentos


Para usar esta licencia en un documento que usted haya escrito, incluya una copia de la Licencia
en el documento y ponga el siguiente copyright y nota de licencia justo después de la página de título:
Copyright (c) AÑO SU NOMBRE.
Se concede permiso para copiar, distribuir y/o modificar este documento bajo los términos de la Licencia
de Documentación Libre de GNU, Versión 1.3 o cualquier otra versión posterior publicada por la Free
Software Foundation; sin Secciones Invariantes ni Textos de Cubierta Delantera ni Textos de Cubierta
Trasera. Una copia de la licencia está incluida en la sección titulada GNU Free Documentation License.
Si tiene Secciones Invariantes, Textos de Cubierta Delantera y Textos de Cubierta Trasera,
reemplace la frase sin ... Trasera por esto:
siendo las Secciones Invariantes LISTE SUS TÍTULOS, siendo los Textos de Cubierta Delantera LISTAR,
y siendo sus Textos de Cubierta Trasera LISTAR.
Si tiene Secciones Invariantes sin Textos de Cubierta o cualquier otra combinación de los tres,
mezcle ambas alternativas para adaptarse a la situación.
Si su documento contiene ejemplos de código de programa no triviales, recomendamos liberar
estos ejemplos en paralelo bajo la licencia de software libre que usted elija, como la Licencia Pública
General de GNU (GNU General Public License), para permitir su uso en software libre.

D.12.- Notas:
[1]Ésta es la traducción del Copyright de la Licencia, no es el Copyright de esta traducción no
autorizada.
[2]La licencia original dice publisher, que es, estrictamente, quien publica, diferente de editor,
que es más bien quién prepara un texto para publicar. En castellano editor se usa para ambas cosas.
[3]En sentido estricto esta licencia parece exigir que los títulos sean exactamente
Acknowledgements, Dedications, Endorsements e History, en inglés.

Página 159
Apéndice D: Licencia de Documentación Libre de GNU

D.13.- Referencias:
1.http://www.gnu.org/copyleft/fdl.html
2.http://www.gnu.org/licenses/fdl-1.3-pdiff.ps (formato PostScript)
3.http://curso-sobre.berlios.de/gfdles/gfdles.html
4. http://creativecommons.org/licenses/by-sa/3.0/es/

Página 160
Apéndice E: Índices

Apéndice E: Índices

E.1.- Índice de Comandos Internos de la Shell


: history ...................................................................... 137

: ................................................................................... 44 J
. jobs .......................................................................... 103

. ................................................................................... 44 K
[ kill ............................................................................. 104

[ ................................................................................... 48 L
A let ................................................................................ 56
local ............................................................................ 56
alias ............................................................................ 51 logout ......................................................................... 56
B M
bg ............................................................................. 103 mapfile ....................................................................... 56
bind ............................................................................ 51
break .......................................................................... 45 P
builtin ................................................................... 11, 52 popd ........................................................................... 96
C printf ........................................................................... 57
pushd ......................................................................... 96
caller .......................................................................... 53 pwd ............................................................................ 47
cd ................................................................................ 45
command ................................................................... 53 R
compgen ................................................................. 131 read ............................................................................ 58
complete .................................................................. 132 readarray ................................................................... 59
compopt .................................................................. 135 readonly ..................................................................... 47
continue ..................................................................... 43 return .......................................................................... 48
D S
declare ....................................................................... 53 set ............................................................................... 61
dirs ............................................................................. 95 shift ............................................................................. 48
disown ..................................................................... 104 shopt .......................................................................... 65
E source ........................................................................ 59
suspend ................................................................... 105
echo ........................................................................... 55
enable ........................................................................ 55 T
eval ............................................................................. 45 test ............................................................................. 48
exec ............................................................................ 45 times .......................................................................... 49
exit .............................................................................. 45 trap ............................................................................. 49
export ......................................................................... 46 type ............................................................................ 59
F typeset ....................................................................... 60

fc .............................................................................. 137 U
fg .............................................................................. 103 ulimit ........................................................................... 60
G umask ........................................................................ 50
unalias ....................................................................... 61
getopts ....................................................................... 46 unset .......................................................................... 51
H W
hash ........................................................................... 47 wait .......................................................................... 104
help ............................................................................ 56

Página 161
Apéndice E: Índices

E.2.- Índice de Palabras Reservadas de la Shell


! esac ........................................................................... 19

! ............................................................................ 26, 35 F
[ fi .................................................................................. 19
for ............................................................................... 18
[[ .................................................................................. 20 function ...................................................................... 23
] I
]] .................................................................................. 20 if .................................................................................. 18
{ in ................................................................................. 19
{ .................................................................................. 22 S
} select .......................................................................... 20
} .................................................................................. 22 T
C then ............................................................................ 19
time ............................................................................ 16
case ........................................................................... 19
D U
until ............................................................................. 18
do ............................................................................... 18
done ........................................................................... 18 V
E visible-stats ............................................................. 115
elif ............................................................................... 19 W
else ............................................................................. 19 while ........................................................................... 18

E.3.- Índice de Parámetros y Variables


_ B
_ .................................................................................. 26 BASH ......................................................................... 74
- BASH_ALIASES ...................................................... 74
BASH_ARGC ........................................................... 74
- .................................................................................. 25 BASH_ARGV ............................................................ 74
! BASH_CMDS ........................................................... 75
BASH_COMMAND .................................................. 75
! .................................................................................. 26
BASH_ENV ............................................................... 75
? BASH_EXECUTION_STRING .............................. 75
? .................................................................................. 25 BASH_LINENO ........................................................ 75
BASH_REMATCH ................................................... 75
@ BASH_SOURCE ...................................................... 75
@ ................................................................................ 25 BASH_SUBSHELL .................................................. 75
* BASH_VERSINFO ................................................... 75
BASH_VERSION ..................................................... 76
* .................................................................................. 25 BASH_XTRACEFD ................................................. 76
# BASHOPTS .............................................................. 74
# .................................................................................. 25 BASHPID .................................................................. 74
bell-style .................................................................. 111
$ bind-tty-special-chars ............................................ 111
$ .................................................................................. 26
C
0 CDPATH ................................................................... 73
0 .................................................................................. 26 COLUMNS ................................................................ 76
comment-begin ....................................................... 111
A COMP_CWORD ...................................................... 76
auto_resume ........................................................... 106 COMP_KEY .............................................................. 77
COMP_LINE ............................................................. 76

Página 162
Apéndice E: Índices

COMP_POINT ......................................................... 76 LC_ALL ..................................................................... 80


COMP_TYPE ........................................................... 77 LC_COLLATE .......................................................... 81
COMP_WORDBREAKS ......................................... 77 LC_MESSAGES ................................................ 15, 81
COMP_WORDS ...................................................... 77 LC_NUMERIC .......................................................... 81
completion-prefix-display-length .......................... 112 LC_CTYPE ............................................................... 81
completion-query-items ......................................... 112 LINENO ..................................................................... 81
COMPREPLY ........................................................... 77 LINES ........................................................................ 81
convert-meta ........................................................... 112
M
D MACHTYPE .............................................................. 81
DIRSTACK ................................................................ 77 MAIL .......................................................................... 73
disable-completion ................................................. 112 MAILCHECK ............................................................. 81
E MAILPATH ................................................................ 73
mark-modified-lines ............................................... 114
editing-mode ........................................................... 112 mark-symlinked-directories .................................. 114
EMACS ...................................................................... 77 match-hidden-files .................................................. 114
enable-keypad ........................................................ 112 meta-flag ................................................................. 113
EUID .......................................................................... 78
expand-tilde ............................................................ 113 O
F OLDPWD .................................................................. 81
OPTARG ................................................................... 73
FCEDIT ...................................................................... 78 OPTERR ................................................................... 81
FIGNORE .................................................................. 78 OPTIND ..................................................................... 73
FUNCNAME ............................................................. 78 OSTYPE .................................................................... 81
G output-meta ............................................................. 114
GLOBIGNORE ......................................................... 78 P
GROUPS ................................................................... 78 page-completions ................................................... 114
H PATH ......................................................................... 73
PIPESTATUS ........................................................... 82
histchars .................................................................... 78
POSIXLY_CORRECT ............................................. 82
HISTCMD .................................................................. 78
PPID ........................................................................... 82
HISTCONTROL ....................................................... 79
PROMPT_COMMAND ........................................... 82
HISTFILE .................................................................. 79
PROMPT_DIRTRIM ................................................ 82
HISTFILESIZE .......................................................... 79
PS1 ............................................................................ 73
HISTIGNORE ........................................................... 79
PS2 ............................................................................ 74
history-preserve-point ............................................ 113
PS3 ............................................................................ 82
history-size .............................................................. 113
PS4 ............................................................................ 82
HISTSIZE .................................................................. 80
PWD ........................................................................... 82
HISTTIMEFORMAT ................................................ 80
HOME ........................................................................ 72 R
horizontal-scroll-mode ........................................... 113 RANDOM .................................................................. 82
HOSTFILE ................................................................ 80 REPLY ....................................................................... 82
HOSTNAME ............................................................. 80 revert-all-at-newline ............................................... 114
HOSTTYPE .............................................................. 80
I S
SECONDS ................................................................ 82
IFS .............................................................................. 73 SHELL ....................................................................... 83
IGNOREEOF ............................................................ 80 SHELLOPTS ............................................................ 83
input-meta ............................................................... 113 SHLVL ....................................................................... 83
INPUTRC .................................................................. 80 show-all-if-ambiguous ........................................... 114
isearch-terminators ................................................ 113 show-all-if-unmodified ............................................ 114
K skip-completed-text ............................................... 115
keymap .................................................................... 113 T
L TEXTDOMAIN .......................................................... 15
TEXTDOMAINDIR ................................................... 15
LANG ......................................................................... 80

Página 163
Apéndice E: Índices

TIMEFORMAT ......................................................... 83
TMOUT ..................................................................... 83
U
TMPDIR ..................................................................... 84 UID ............................................................................. 84
V
visible-stats ............................................................. 115

E.4.- Índice de Funciones


A end-kbd-macro (C-x )) ........................................... 127
end-of-history (M->) ............................................... 121
abort (C-g) ............................................................... 127 end-of-line (C-e) ..................................................... 120
accept-line (Nueva_línea o Return) ..................... 121 exchange-point-and-mark (C-x C-x) .................... 128
alias-expand-line () ................................................ 129
B F
forward-backward-delete-char () ......................... 122
backward-delete-char (Rubout) ........................... 122 forward-char (C-f) .................................................. 120
backward-kill-line (C-x Rubout) ............................ 123 forward-search-history (C-s) ................................. 121
backward-kill-word () ............................................. 124 forward-word (M-f) ................................................. 120
backward-kill-word (M-DEL) ................................. 124
backward-word (M-b) ............................................ 121 G
beginning-of-history (M-<) .................................... 121 glob-complete-word (M-g) .................................... 129
beginning-of-line (C-a) ........................................... 120 glob-expand-word (C-x *) ...................................... 129
C glob-list-expansions (C-x g) .................................. 129

call-last-kbd-macro (C-x e) ................................... 127 H


capitalize-word (M-c) ............................................. 123 historiy-and-alias-expand-line () ........................... 130
character-search (C-]) ........................................... 128 history-expand-line (M-^) ...................................... 129
character-search-backward (M-C-]) .................... 128 history-search-forward () ....................................... 122
clear-screen (C-l) ................................................... 121
complete (TAB) ...................................................... 125
I
complete-command (M-!) ..................................... 126 insert-comment (M-#) ............................................ 128
complete-filename (M-/) ........................................ 126 insert-completions (M-*) ........................................ 125
complete-hostname (M-@) ................................... 126 insert-last-argument (M-. o M-_) .......................... 130
complete-into-braces (M-{) ................................... 127
complete-username (M-~) ..................................... 126
J
jobs .......................................................................... 104
complete-variable (M-$) ........................................ 126
copy-backward-word () ......................................... 124 K
copy-forward-word () ............................................. 124 kill-line (C-k) ............................................................ 123
copy-region-as-kill () .............................................. 124 kill-region () ............................................................. 124
D kill-whole-line () ...................................................... 123
kill-word (M-d) ........................................................ 124
dabbrev-expand () ................................................. 127
delete-char (C-d) .................................................... 122 M
delete-char-or-list() ................................................ 126 magic-space () ....................................................... 129
delete-horizontal-space () ..................................... 124 menu-complete () ................................................... 125
digit-argument (M-0, M-1, …, M--) ........................ 125 menu-complete-backward () ................................. 126
display-shell-version (C-x C-v) ............................. 129
do-uppercase-version (M-a, M-b, M-x, …) .......... 127 N
downcase-word (M-l) ............................................. 123 next-history (C-n) ................................................... 121
dump-functions () ................................................... 128 non-incremental-forward-search-history (M-n) ... 122
dump-macros () ...................................................... 129 non-incremental-reverse-search-history (M-p) ... 121
dump-variables () ................................................... 129
dynamic-complete-history (M-TAB) ..................... 127
O
operate-and-get-netx (C-o) ................................... 130
E overwrite-mode () ................................................... 123
edit-and-execute-command (C-xC-e) .................. 130

Página 164
Apéndice E: Índices

P shell-expand-line (M-C-e) ..................................... 129


shell-forward-word () ............................................. 121
possible-command-completions (C-x !) .............. 127 shell-kill-word () ...................................................... 124
possible-completions (M-?) .................................. 125 skip-csi-sequence () .............................................. 128
possible-filename-completions (C-x /) ................. 126 start-kbd-macro (C-x () .......................................... 127
possible-hostname-completions (C-x @) ............ 126
possible-username-completions (C-x ~) .............. 126 T
possible-variable-completions (C-x $) ................. 126 tilde-expand (M-&) ................................................. 128
prefix-meta (ESC) .................................................. 127 transpose-chars (C-t) ............................................ 123
previous-history (C-p) ............................................ 121 transpose-words (M-t) ........................................... 123
Q U
quoted-insert (C-q o C-v) ...................................... 122 undo (C-_ o C-x C-u) ............................................. 128
R universal-argument () ............................................ 125
unix-filename-rubout () .......................................... 124
re-read-init-file (C-x C-r) ........................................ 127 unix-line-discard (C-u) ........................................... 123
redraw-current-line () ............................................. 121 unix-word-rubout () ................................................ 124
reverse-search-history (C-r) ................................. 121 upcase-word (M-u) ................................................ 123
revert-line (M-r) ...................................................... 128
S Y
yank (C-y) ................................................................ 125
self-insert (a, b, A, 1, !, …) ..................................... 122 yank-last-arg (M-. o M-_) ...................................... 122
set-mark (C-@) ...................................................... 128 yank-nth-arg (M-C-y) ............................................. 122
shell-backward-word () .......................................... 121 yank-pop (M-y) ....................................................... 125

Página 165

Potrebbero piacerti anche