- Este texto es una breve descripción de las características presentes en el shell Bash (versión 5.1, 21 de diciembre de 2020). La página principal de Bash es http://www.gnu.org/software/bash/.
- Bash contiene características que aparecen en otros shells populares, y algunas características que sólo aparecen en Bash. Algunos de los shells de los que Bash ha tomado prestados conceptos son el Bourne Shell (sh), el Korn Shell (ksh), y el C-shell (csh y su sucesor, tcsh).
- Este manual pretende ser una breve introducción a las características encontradas en Bash. La página del manual de Bash debería usarse como la referencia definitiva sobre el comportamiento del shell.
- Bash es el shell, o intérprete del lenguaje de comandos, para el sistema operativo GNU. El nombre es un acrónimo de ‘Bourne-Again SHell’, un juego de palabras con Stephen Bourne, el autor del ancestro directo del actual shell de Unix sh, que apareció en la séptima edición de la versión de Bell Labs Research de Unix.
- Bash es en gran medida compatible con sh e incorpora características útiles del shell Korn ksh y del shell C csh. Se pretende que sea una implementación conforme a la parte de IEEE POSIX Shell and Tools de la especificación IEEE POSIX (IEEE Standard 1003.1). Ofrece mejoras funcionales con respecto a sh tanto para el uso interactivo como para la programación.
- Aunque el sistema operativo GNU proporciona otros shells, incluyendo una versión de csh, Bash es el shell por defecto. Al igual que otro software de GNU, Bash es bastante portable. Actualmente se ejecuta en casi todas las versiones de Unix y algunos otros sistemas operativos - existen puertos soportados independientemente para las plataformas MS-DOS, OS/2 y Windows.
En su base, un shell es simplemente un procesador de macros que ejecuta comandos. El término procesador de macros se refiere a una funcionalidad en la que el texto y los símbolos se expanden para crear expresiones más amplias.
Un shell de Unix es tanto un intérprete de comandos como un lenguaje de programación. Como intérprete de comandos, el shell proporciona la interfaz de usuario al rico conjunto de utilidades de GNU. Las características del lenguaje de programación permiten combinar estas utilidades. Se pueden crear archivos que contengan comandos, y que se conviertan en comandos en sí mismos. Estos nuevos comandos tienen el mismo estatus que los comandos del sistema en directorios como /bin, lo que permite a los usuarios o grupos establecer entornos personalizados para automatizar sus tareas comunes.
Los shells pueden utilizarse de forma interactiva o no interactiva. En el modo interactivo, aceptan las entradas escritas desde el teclado. Cuando se ejecutan de forma no interactiva, los shells ejecutan comandos leídos desde un archivo.
Un shell permite la ejecución de comandos GNU, tanto de forma sincrónica como asincrónica. El shell espera a que los comandos sincrónicos se completen antes de aceptar más entradas; los comandos asíncronos continúan ejecutándose en paralelo con el shell mientras éste lee y ejecuta comandos adicionales. Las construcciones de redirección permiten un control detallado de la entrada y la salida de esos comandos. Además, el shell permite controlar el contenido de los entornos de los comandos.
Los shells también proporcionan un pequeño conjunto de comandos incorporados (builtins) que implementan funcionalidades imposibles o inconvenientes de obtener a través de utilidades separadas. Por ejemplo, cd, break, continue y exec no pueden implementarse fuera del shell porque manipulan directamente el propio shell. Los buildins history, getopts, kill o pwd, entre otros, podrían implementarse en utilidades separadas, pero es más conveniente utilizarlos como comandos incorporados. Todos los buildins del shell se describen en las secciones siguientes.
Aunque la ejecución de comandos es esencial, la mayor parte de la potencia (y complejidad) de los shells se debe a sus lenguajes de programación integrados. Como cualquier lenguaje de alto nivel, el shell proporciona variables, construcciones de control de flujo, citas y funciones.
Los shells ofrecen características orientadas específicamente al uso interactivo más que a aumentar el lenguaje de programación. Estas características interactivas incluyen el control de trabajos, la edición de la línea de comandos, el historial de comandos y los alias.
Estas definiciones se utilizan en el resto de este manual.
POSIX
Una familia de estándares de sistemas abiertos basados en Unix. Bash se ocupa principalmente de la parte de Shell y Utilidades del estándar POSIX 1003.1.blank
Un espacio o carácter de tabulación.builtin
Un comando que es implementado internamente por el propio shell, en lugar de por un programa ejecutable en algún lugar del sistema de archivos.control operator
Un token que realiza una función de control. Es una nueva línea o uno de los siguientes: ’||
’, ’&&
’, ’&
’, ’;
’, ’;;
’, ’;&
’, ’;;&
’, ’|
’, ’|&
’, ’(
’, o ’)
’.exit status
El valor devuelto por un comando a su llamador. El valor está restringido a ocho bits, por lo que el valor máximo es 255.field
Una unidad de texto que es el resultado de una de las expansiones del shell. Después de la expansión, cuando se ejecuta un comando, los campos resultantes se utilizan como el nombre del comando y los argumentos.filename
Cadena de caracteres utilizada para identificar un archivo.job
Conjunto de procesos que componen un pipeline, y cualquier proceso que descienda de él, que están todos en el mismo grupo de procesos.job control
Un mecanismo mediante el cual los usuarios pueden detener (suspender) y reiniciar (reanudar) selectivamente la ejecución de procesos.metacharacter
Un carácter que, cuando no está entre comillas, separa palabras. Un metacarácter es un espacio, un tabulador, una nueva línea o uno de los siguientes caracteres: ’|
’, ’&
’, ’;
’, ’(
’, ’)
’, ’<
’ o ’>
’.name
Una palabra formada únicamente por letras, números y guiones bajos, y que comienza con una letra o un guión bajo. Los nombres se utilizan como nombres de variables y funciones del shell. También se denomina identificador.operator
Un operador de control o de redirección. Ver Redirecciones, para una lista de operadores de redirección. Los operadores contienen al menos un metacarácter no citado.process group
Una colección de procesos relacionados, cada uno con el mismo ID de grupo de procesos.process group ID
Un identificador único que representa a un grupo de procesos durante su vida.reserved word
Una palabra que tiene un significado especial para el shell. La mayoría de las palabras reservadas introducen construcciones de control de flujo del shell, como for y while.return status
Un sinónimo de estado de salida.signal
Un mecanismo por el cual un proceso puede ser notificado por el núcleo de un evento que ocurre en el sistema.special builtin
Un comando incorporado al shell que ha sido clasificado como especial por el estándar POSIX.token
Una secuencia de caracteres considerada como una sola unidad por el shell. Es una palabra o un operador.word
Una secuencia de caracteres tratada como una unidad por el shell. Las palabras no pueden incluir metacaracteres no citados.
Este capítulo resume brevemente los “bloques de construcción” del shell: comandos, estructuras de control, funciones del shell, parámetros del shell, expansiones del shell, redirecciones, que son una forma de dirigir la entrada y la salida desde y hacia archivos con nombre, y cómo el shell ejecuta los comandos.
Cuando el shell lee la entrada, procede a través de una secuencia de operaciones. Si la entrada indica el comienzo de un comentario, el shell ignora el símbolo de comentario (‘#’), y el resto de esa línea.
De lo contrario, a grandes rasgos, el intérprete de comandos lee su entrada y la divide en palabras y operadores, empleando las reglas de citación para seleccionar qué significados asignar a las distintas palabras y caracteres.
A continuación, el shell analiza estos tokens en comandos y otras construcciones, elimina el significado especial de ciertas palabras o caracteres, expande otros, redirige la entrada y la salida según sea necesario, ejecuta el comando especificado, espera el estado de salida del comando, y hace que ese estado de salida esté disponible para su posterior inspección o procesamiento.
A continuación se describe brevemente el funcionamiento del shell cuando lee y ejecuta un comando. Básicamente, el shell hace lo siguiente:
- Lee su entrada desde un archivo (ver Scripts del Shell), desde una cadena suministrada como argumento a la opción de invocación -c (ver Invocación de Bash), o desde la terminal del usuario.
- Rompe la entrada en palabras y operadores, obedeciendo las reglas de citación descritas en Citar. Estos tokens están separados por metacaracteres. La expansión de los alias se realiza en este paso (ver Aliases).
- Analiza los tokens en comandos simples y compuestos (ver Comandos del Shell).
- Realiza las diferentes expansiones del shell (ver Expansiones del Shell), dividiendo los tokens expandidos en listas de nombres de archivos (ver Expansión de nombres de archivos) y comandos y argumentos.
- Realiza las redirecciones necesarias (ver Redirecciones) y elimina los operadores de redirección y sus operandos de la lista de argumentos.
- Ejecuta el comando (véase Ejecución de comandos).
- Opcionalmente, espera a que el comando se complete y recoge su estado de salida (ver Estado de salida).
La citación se utiliza para eliminar el significado especial de ciertos caracteres o palabras para el shell. Las citas pueden utilizarse para desactivar el tratamiento especial de los caracteres especiales, para evitar que las palabras reservadas sean reconocidas como tales y para impedir la expansión de parámetros.
Cada uno de los metacaracteres del shell (ver Definiciones) tiene un significado especial para el shell y debe ser entrecomillado si va a representarse a sí mismo. Cuando se utilizan las facilidades de expansión del historial de comandos (ver Interacción con el historial), el carácter de expansión del historial, normalmente ‘!’, debe entrecomillarse para evitar la expansión del historial. Ver Facilidades de Historia de Bash, para más detalles sobre la expansión de la historia.
Existen tres mecanismos de entrecomillado: el carácter de escape, las comillas simples y las comillas dobles.
Una barra invertida no citada ‘' es el carácter de escape de Bash. Conserva el valor literal del siguiente carácter, con la excepción de la nueva línea. Si aparece un par \newline, y la propia barra invertida no está entre comillas, el \newline se trata como una continuación de línea (es decir, se elimina del flujo de entrada y se ignora efectivamente).
Al encerrar los caracteres entre comillas simples (”’) se conserva el valor literal de cada carácter dentro de las comillas. Las comillas simples no pueden aparecer entre comillas simples, ni siquiera cuando van precedidas de una barra invertida.
Encerrar caracteres entre comillas dobles (‘”’) preserva el valor literal de todos los caracteres dentro de las comillas, con la excepción de ‘$’, ‘`’, ‘', y, cuando la expansión del historial está habilitada, ‘!’. Cuando el shell está en modo POSIX (ver Modo POSIX de Bash), el carácter ‘!’ no tiene un significado especial dentro de las comillas dobles, incluso cuando la expansión del historial está activada. Los caracteres ‘$’ y ‘`’ mantienen su significado especial dentro de las comillas dobles (ver Expansiones del shell). La barra invertida conserva su significado especial sólo cuando va seguida de uno de los siguientes caracteres: ‘$’, ‘`’, ‘”’, ‘', o línea nueva. Dentro de las comillas dobles, las barras invertidas que van seguidas de uno de estos caracteres se eliminan. Las barras invertidas que preceden a caracteres sin un significado especial se dejan sin modificar. Una comilla doble puede ser citada dentro de comillas dobles precediéndola de una barra invertida. Si se activa, la expansión del historial se realizará a menos que un ‘!’ que aparezca entre comillas dobles se escape con una barra invertida. La barra invertida que precede al ‘!’ no se elimina.
Los parámetros especiales ‘*’ y ‘@’ tienen un significado especial cuando están entre comillas dobles (véase Expansión de parámetros de la shell).
Las palabras de la forma $’string’ se tratan de forma especial. La palabra se expande a cadena, con caracteres de barra invertida reemplazados según lo especificado por el estándar ANSI C. Las secuencias de escape de barra invertida, si están presentes, se decodifican como sigue:
\a
alerta (campana)\b
retroceso\e
,\E
un carácter de escape (no ANSI C)\f
alimentación de forma\n
línea nueva\r
retorno de carro\t
tabulación horizontal\v
tabulación vertical\\
barra invertida\'
comilla simple\"
comillas dobles\?
signo de interrogación\nnn
el carácter de ocho bits cuyo valor es el valor octal nnn (de uno a tres dígitos octales)\xHH
el carácter de ocho bits cuyo valor es el valor hexadecimal HH (uno o dos dígitos hexadecimales)\uHHHH
el carácter Unicode (ISO/IEC 10646) cuyo valor es el valor hexadecimal HHHH (de uno a cuatro dígitos hexadecimales)\UHHHHHHHH
el carácter Unicode (ISO/IEC 10646) cuyo valor es el valor hexadecimal HHHHHHHH (de uno a ocho dígitos hexadecimales)\cx
un carácter de control-x
El resultado expandido está entre comillas simples, como si el signo de dólar no hubiera estado presente.
- En un intérprete de comandos no interactivo, o en un intérprete de comandos interactivo en el que esté activada la opción interactive_comments del complemento shopt (véase El complemento shopt), una palabra que empiece por ‘#’ hace que se ignore esa palabra y todos los caracteres restantes de esa línea. Un shell interactivo sin la opción interactive_comments activada no permite comentarios. La opción interactive_comments está activada por defecto en los shells interactivos. Consulte la sección de intérpretes de comandos interactivos para obtener una descripción de lo que hace que un intérprete de comandos sea interactivo. * Versión 0.3.6
- Las palabras de la forma se tratan de forma especial. La palabra se expande a cadena, con carácteres de barra invertida reemplazando según lo especificado por el estandar ANSI C. Las secuencias de espace de barra invertida, si están presentes, se decodifican como sigue:
- Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry’s standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
- If you want to emulate the behavior of an editor like Notepad, you might want to turn on visual line mode. While setting word-wrap will cause line wrapping at word boundaries, any action you take on a line (e.g., moving up/down or killing) will still respect the newline character. Visual line mode will treat each display line as though it had a newline at the end.
- Esta es una prueba del modo zen en doom emacs. Esto es genial para concentrarse al escribir y evitar todas las posibles distracciones que se puedan tener al escribir
- djfdjf