Capítulo 1. Empezando con bash

Este trabajo se ha traducido utilizando IA. Agradecemos tus opiniones y comentarios: translation-feedback@oreilly.com

¿Qué es un caparazón y por qué debería importarte?

Cualquier sistema operativo informático reciente (por reciente, entendemos desde 1970 aproximadamente) tiene algún tipo de interfaz de usuario: alguna forma de especificar comandos para que el sistema operativo los ejecute. Pero en muchos sistemas operativos, esa interfaz de comandos estaba realmente incorporada y sólo había una forma de hablar con el ordenador. Además, la interfaz de comandos de un sistema operativo te permitía ejecutar comandos, pero eso era todo. Después de todo, ¿qué más había que hacer?

El sistema operativo Unix popularizó la noción de separar el shell (la parte del sistema que te permite escribir comandos) de todo lo demás: el sistema de entrada/salida, el programador, la gestión de la memoria y todas las demás cosas de las que el sistema operativo se ocupa por ti (y de las que la mayoría de los usuarios no quieren preocuparse). El shell era un programa más; era un programa cuyo trabajo consistía en ejecutar otros programas en nombre de los usuarios.

Pero aquello fue el principio de una revolución. El shell era un programa más que se ejecutaba en Unix; si no te gustaba el estándar, podías crear el tuyo propio. Así que, al final de la primera década de Unix, había al menos dos intérpretes de comandos competidores: el intérprete de comandos Bourne, sh (que era descendiente del intérprete de comandos Thompson original), más el intérprete de comandos C, csh. A finales de la segunda década de Unix, había algunas alternativas más: el intérprete de comandos Korn, ksh, y las primeras versiones del intérprete de comandos bash. Al final de la tercera década de Unix, había probablemente una docena de shells diferentes.

Probablemente no te sientas a pensar: "¿Debería usar csh o bash o ksh hoy?". Probablemente estés contento con el shell estándar que venía con tu sistema Linux (o BSD o macOS o Solaris o HP/UX). Pero desvincular el intérprete de comandos del propio sistema operativo facilitó mucho a los desarrolladores de software (como Brian Fox, creador de bash, y Chet Ramey, actual desarrollador y mantenedor) escribir mejores intérpretes de comandos: podías crear un nuevo intérprete de comandos sin modificar el propio sistema operativo. Era mucho más fácil conseguir que se aceptara un nuevo intérprete de órdenes, ya que no tenías que convencer a ningún vendedor de sistemas operativos para que incorporara el intérprete de órdenes en su sistema; todo lo que tenías que hacer era empaquetar el intérprete de órdenes para que se pudiera instalar como cualquier otro programa.

Aun así, puede que estés pensando que eso suena a mucho alboroto para algo que sólo recibe órdenes y las ejecuta. Y tendrías razón: unintérprete de comandos que sólo te permitiera escribir órdenes no sería muy interesante. Sin embargo, dos factores impulsaron la evolución del shell de Unix: la comodidad del usuario y la programación. Y el resultado es un shell moderno que hace mucho más que limitarse a aceptar órdenes.

Los shells modernos son muy prácticos. Por ejemplo, recuerdan los comandos que has escrito y te permiten reutilizarlos. Las shells modernas también te permiten editar esos comandos, para que no tengan que ser siempre los mismos. Y las shells modernas te permiten definir tus propias abreviaturas de comandos, atajos y otras características. Para un usuario experimentado, teclear comandos (por ejemplo, con abreviaturas, atajos y completado de comandos) es mucho más eficiente y eficaz que arrastrar cosas por una elegante interfaz con ventanas.

Pero más allá de la simple comodidad, los shells son programables. Hay muchas secuencias de comandos que tecleas una y otra vez. Siempre que hagas algo por segunda vez, deberías preguntarte: "¿No puedo escribir un programa que haga esto por mí?". Pues puedes. Un shell también es un lenguaje de programación especialmente diseñado para trabajar con los comandos de tu sistema informático. Así, si quieres generar mil archivos MP3 a partir de archivos WAV, puedes escribir un programa shell (o shell script). Si quieres comprimir todos los archivos de registro de tu sistema, puedes escribir un script de shell para hacerlo. Siempre que te encuentres haciendo una tarea repetidamente, deberías intentar automatizarla escribiendo un script de shell. Hay lenguajes de programación más potentes, como Perl, Python y Ruby, pero el shell de Unix (sea cual sea el tipo de shell que utilices) es un buen punto de partida. Al fin y al cabo, ya sabes cómo escribir comandos; ¿para qué complicar las cosas?

1.1 ¿Por qué bash?

¿Por qué este libro trata de bash y no de otro shell? Porque bash está en todas partes. Puede que no sea el más nuevo, y posiblemente no sea el más elegante ni el más potente (aunque si no, se le acerca), ni tampoco es el único intérprete de comandos que se distribuye como software de código abierto, pero es omnipresente.

La razón tiene que ver con la historia. Los primeros shells eran herramientas de programación bastante buenas, pero no muy cómodas para los usuarios. El intérprete de comandos C añadía muchas comodidades para el usuario (como la posibilidad de repetir un comando que acababas de escribir), pero como lenguaje de programación era peculiar. El intérprete de comandos Korn, que apareció después (a principios de los 80), añadía muchas comodidades para el usuario, mejoraba el lenguaje de programación y parecía estar en vías de adopción generalizada. Pero ksh no era software de código abierto al principio; era un producto de software propietario y, por tanto, era difícil distribuirlo con un sistema operativo libre como Linux. (La licencia del shell Korn se modificó en 2000, y de nuevo en 2005).

A finales de los 80, la comunidad Unix decidió que la normalización era algo bueno, y se formaron los grupos de trabajo POSIX (organizados por el IEEE). POSIX estandarizó las bibliotecas y utilidades de Unix, incluido el shell. El intérprete de comandos estándar se basaba principalmente en la versión de 1988 del intérprete de comandos Korn, con algunas características del intérprete de comandos C y un poco de invención para rellenar los huecos. bash se inició como parte del esfuerzo del Proyecto GNU para producir un sistema POSIX completo, que naturalmente necesitaba un intérprete de comandos POSIX.

bash proporcionaba las funciones de programación que necesitaban los programadores de shell, además de las comodidades que gustaban a los usuarios de la línea de comandos. Originalmente se concibió como una alternativa al intérprete de comandos Korn, pero a medida que el movimiento del software libre cobró importancia y Linux se hizo más popular, bash eclipsó rápidamente a ksh.

Como resultado, bash es el intérprete de comandos de usuario por defecto en todas las distribuciones de Linux que conocemos (hay unos cientos de distribuciones de Linux, así que probablemente haya algunas con algún intérprete de comandos por defecto raro), así como en macOS (y en las versiones anteriores de OS X). También está disponible para casi todos los demás sistemas operativos Unix, incluidos BSD Unix y Solaris. En los raros casos en que bash no viene con el sistema operativo, es fácil de instalar. Incluso está disponible para Windows, a través de Cygwin y también para el nuevo subsistema Linux (Ubuntu). bash es tanto un potente lenguaje de programación como una buena interfaz de usuario, y no te encontrarás sacrificando atajos de teclado para conseguir elaboradas funciones de programación.

Es imposible que te equivoques aprendiendo bash. Los shells por defecto más comunes son el antiguo shell Bourne y bash, que en su mayor parte es compatible con el shell Bourne. Sin duda, uno de estos intérpretes de comandos está presente en cualquier sistema operativo Unix o similar a Unix moderno e importante. Y, como ya se ha dicho, si bash no está presente, siempre puedes instalarlo. Pero hay otros shells. En el espíritu del software libre, los autores y mantenedores de todas estas shells comparten ideas. Si lees los registros de cambios de bash, verás muchos lugares en los que se ha introducido una función o se ha modificado para adaptarla al comportamiento de otro intérprete de comandos. Pero a la mayoría de la gente no le importará. Utilizarán lo que ya existe y estarán contentos con ello. Así que, si te interesa, no dudes en investigar otros shells. Hay muchas alternativas buenas, y puede que encuentres una que te guste más, aunque probablemente no sea tan omnipresente como bash.

1.2 La Shell bash

bash es un shell: un intérprete de comandos. El objetivo principal de bash (o de cualquier shell) es permitirte interactuar con el sistema operativo del ordenador para que puedas realizar lo que necesites. Normalmente eso implica ejecutar programas, por lo que el intérprete de comandos toma las órdenes que escribes, determina a partir de esa entrada qué programas deben ejecutarse y los ejecuta por ti. También te encontrarás con tareas que implican una secuencia de acciones a realizar que son recurrentes, o muy complicadas, o ambas cosas. La programación del shell, normalmente denominada shell scripting, te permite automatizar estas tareas para facilitar su uso, fiabilidad y reproducibilidad.

Por si eres nuevo en bash, empezaremos por lo básico. Si has utilizado Unix o Linux alguna vez, probablemente no seas nuevo en bash, peropuede que no supieras que lo estabas utilizando. bash es en realidad un lenguaje para ejecutar comandos, de modo que los comandos que has estado escribiendo todo el tiempo (por ejemplo, ls, cd, grep, cat) son, en cierto sentido, comandos de bash. Algunos de estos comandos están integrados en el propio bash; otros son programas independientes. Por ahora, no importa cuáles son cuáles.

Terminaremos este capítulo con algunas recetas para conseguir bash. La mayoría de los sistemas vienen con bash preinstalado, pero algunos no. Incluso si tu sistema viene con bash, siempre es una buena idea saber cómo obtenerlo e instalarlo: de vez en cuando se publican nuevas versiones con nuevas funciones.

Si ya estás ejecutando bash y estás algo familiarizado con él, quizá quieras ir directamente al Capítulo 2. No es probable que leas este libro en orden, y si te sumerges en la mitad, encontrarás algunas recetas que demuestran de lo que bash es realmente capaz. Pero primero, lo básico.

1.3 Descodificar la pregunta

Problema

Te gustaría saber qué significan todos los signos de puntuación de tu pantalla.

Solución

Todas las shells de línea de comandos tienen algún tipo de prompt para avisarte de que la shell está lista para aceptar tu entrada. El aspecto del indicador depende de muchos factores, como el tipo y la versión de tu sistema operativo, el tipo y la versión del intérprete de comandos, la distribución y cómo lo haya configurado otra persona. En la familia de intérpretes de comandos Bourne, un $ al final de la línea de comandos significa generalmente que has iniciado sesión como usuario normal, mientras que un # al final significa que eres root. La cuenta root es el administrador del sistema, equivalente a la cuenta Sistema en Windows (que es incluso más poderosa que la cuenta Administrador ). root es todopoderoso y puede hacer cualquier cosa en un sistema Unix o Linux típico.

Los avisos por defecto también suelen mostrar la ruta al directorio en el que te encuentras; sin embargo, suelen abreviarlo, de modo que un ~ significa que estás en tu directorio personal. Algunos avisos por defecto también pueden mostrar tu nombre de usuario y el nombre de la máquina en la que has iniciado sesión. Si ahora te parece una tontería, no lo será cuando estés conectado a cinco máquinas a la vez, posiblemente con nombres de usuario diferentes.

Este es un prompt típico de Linux para un usuario llamado jp en una máquina llamada adams, en el directorio home. El final $ indica que se trata de un usuario normal, no de root:

jp@adams:~$

Este es el mensaje después de cambiar al directorio /tmp. Observa cómo ~, que en realidad significaba /home/jp, ha cambiado a /tmp:

jp@adams:/tmp$

Debate

El prompt del shell es lo que verás más a menudo cuando trabajes en la línea de comandos, y hay muchas formas de personalizarlo más a tu gusto. Pero por ahora, basta con saber interpretarlo. Por supuesto, tu prompt por defecto puede ser diferente, pero deberías ser capaz de averiguar lo suficiente para arreglártelas por ahora.

Hay algunos sistemas Unix o Linux en los que el poder de root puede ser compartido, mediante comandos como su y sudo. O puede que root ni siquiera sea todopoderoso, si el sistema ejecuta algún tipo de sistema de control de acceso obligatorio (MAC) como el SELinux de la NSA.

1.4 Mostrar dónde estás

Problema

No estás seguro de en qué directorio te encuentras y el indicador por defecto no te ayuda.

Solución

Utiliza el comando integrado pwd, o establece en un indicador más útil (como se describe en la Receta 16.2). Por ejemplo:

bash-4.3$ pwd
/tmp

bash-4.3$ export PS1='[\u@\h \w]$ '
[jp@solaris8 /tmp]$

Debate

pwd significa imprimir directorio de trabajo y tiene dos opciones. -L muestra tu ruta lógica y es la predeterminada. -P muestra tu ubicación física,, que puede diferir de tu ruta lógica si has seguido un enlace simbólico. Del mismo modo, el comando cd también proporciona los modificadores -P y -L:

bash-4.3$ pwd
/tmp/dir2

bash-4.3$ pwd -L
/tmp/dir2

bash-4.3$ pwd -P
/tmp/dir1

1.5 Encontrar y ejecutar comandos

Problema

Necesitas encontrar y ejecutar un comando concreto en bash.

Solución

Prueba los comandos type, which, apropos, locate, slocate, find y ls.

Debate

bash guarda una lista de directorios en los que debe buscar comandos en una variable de entorno llamada PATH. El comando bash builtin type busca en tu entorno (incluidos alias, palabras clave, funciones, builtins, directorios en $PATH, y la tabla hash de comandos) comandos ejecutables que coincidan con sus argumentos y muestra el tipo y la ubicación de las coincidencias. Tiene varias opciones, entre las que destaca la bandera -a, que hace que imprima todas las coincidencias en lugar de detenerse en la primera. El comando which es similar, pero sólo busca en tu $PATH (y alias csh ). Puede variar de un sistema a otro (suele ser un script de shell csh en BSD, pero un binario en Linux), y suele tener una bandera -a como type. Utiliza estos comandos cuando conozcas el nombre de un comando y necesites saber exactamente dónde se encuentra, o para ver si está en este ordenador. Por ejemplo:

$ type which
which is hashed (/usr/bin/which)

$ type ls
ls is aliased to `ls -F -h'

$ type -a ls
ls is aliased to `ls -F -h'
ls is /bin/ls

$ which which
/usr/bin/which

Casi todos los comandos vienen con algún tipo de ayuda sobre cómo utilizarlos. Suele haber documentación en línea llamada páginas man, donde "man" es la abreviatura de manual. Se accede a ellas mediante el comando man, por lo que te dará documentación sobre el comando man ls ls. Muchos programas también tienen una ayuda integrada, a la que se accede proporcionando un argumento "ayúdame" como o . Algunos programas, especialmente en otros sistemas operativos, te darán ayuda si no les das argumentos. Algunos comandos de Unix también lo harán, pero muchos no. Esto se debe a la forma en que los comandos Unix encajan entre sí en algo llamado -h --help "pipelines", que veremos más adelante. Pero, ¿y si no sabes o no recuerdas el nombre del comando que necesitas? apropos busca en los nombres y descripciones de las páginas de manual las expresiones regulares suministradas como argumentos. Esto es increíblemente útil cuando no recuerdas el nombre del comando que necesitas. Es lo mismo que : man -k

$ apropos music
cms (4) - Creative Music System device driver

$ man -k music
cms (4) - Creative Music System device driver

locate y slocate consultan los archivos de la base de datos sobre el sistema (normalmente compilados y actualizados por una tarea ejecutada desde el sistema programador cron) para encontrar archivos o comandos casi instantáneamente. La ubicación de los archivos reales de la base de datos, lo que se indexa en ellos y la frecuencia con la que se comprueba puede variar de un sistema a otro. Consulta las páginas de manual de tu sistema para más detalles. slocate (locate seguro) almacena información sobre permisos (además de nombres de archivos y rutas) para que no liste programas a los que el usuario no tenga acceso. En la mayoría de los sistemas Linux, locate es un enlace simbólico a slocate; otros sistemas pueden tener programas separados, o no tener slocate en absoluto. Aquí tienes un ejemplo:

$ locate apropos
/usr/bin/apropos
/usr/share/man/de/man1/apropos.1.gz
/usr/share/man/es/man1/apropos.1.gz
/usr/share/man/it/man1/apropos.1.gz
/usr/share/man/ja/man1/apropos.1.gz
/usr/share/man/man1/apropos.1.gz

Para más detalles sobre el comando encontrar, consulta el Capítulo 9.

Por último, pero no menos importante, prueba a utilizar ls. Recuerda que si el comando que quieres ejecutar está en tu directorio actual, debes anteponerle el prefijo ./, ya que el directorio de trabajo actual no suele estar en tu $PATH por motivos de seguridad (véanse las Recetas 14.3 y 14.10).

1.6 Obtener información sobre los archivos

Problema

Necesitas más información sobre un archivo, como qué es, a quién pertenece, si es ejecutable, cuántos enlaces duros tiene o cuándo se accedió a él o se modificó por última vez.

Solución

Utiliza los comandos ls, stat, file o find:

$ touch /tmp/sample_file

$ ls /tmp/sample_file
/tmp/sample_file

$ ls -l /tmp/sample_file
-rw-r--r-- 1 jp         jp            0 Dec 18 15:03 /tmp/sample_file

$ stat /tmp/sample_file
File: "/tmp/sample_file"
Size: 0           Blocks: 0        IO Block: 4096   Regular File
Device: 303h/771d Inode:  2310201    Links: 1
Access: (0644/-rw-r--r--) Uid: (  501/      jp)   Gid: ( 501/        jp)
Access: Sun Dec 18 15:03:35 2005
Modify: Sun Dec 18 15:03:35 2005
Change: Sun Dec 18 15:03:42 2005

$ file /tmp/sample_file
/tmp/sample_file: empty

$ file -b /tmp/sample_file
empty

$ echo '#!/bin/bash -' > /tmp/sample_file

$ file /tmp/sample_file
/tmp/sample_file: Bourne-Again shell script text executable

$ file -b /tmp/sample_file
Bourne-Again shell script text executable

Para saber más sobre el comando encontrar, consulta el Capítulo 9.

Debate

El comando ls sólo muestra los nombres de los archivos, mientras que -l proporciona más detalles sobre cada archivo. ls tiene muchas opciones; consulta la página de manual de tu sistema para conocer las que admite. Algunas opciones útiles son:

-a

No ocultes los archivos que empiecen por . (punto).

-A

Como -a, pero se salta los dos directorios comunes . (punto) y .. (punto punto), ya que están presentes en prácticamente todos los directorios.

-F

Muestra el tipo de archivo con uno de los varios designadores de tipo que aparecen al final.

Una barra (/) indica que el archivo es un directorio, un asterisco (*) significa que el archivo es ejecutable, una arroba (@) indica un enlace simbólico, un signo igual (=) es un socket, y una tubería o barra vertical (|) es un búfer FIFO (primero en entrar, primero en salir).

-l

Utiliza el formato de listado largo.

-L

Muestra información sobre el archivo enlazado, en lugar del propio enlace simbólico.

-Q

Nombres de cita (extensión GNU, no admitida en todos los sistemas).

-r

Invierte el orden de clasificación.

-R

Recorre los subdirectorios.

-S

Ordenar por tamaño de archivo.

-1

Utiliza el formato corto, pero con un solo archivo por línea.

stat, file y find tienen muchas opciones que controlan el formato de salida; consulta las páginas de manual de tu sistema para ver las opciones compatibles. Por ejemplo, estas opciones producen una salida similar a ls -l:

$ ls -l /tmp/sample_file
-rw-r--r--  1 jp         jp                14 Dec 18 15:04 /tmp/sample_file

$ stat -c'%A %h %U %G %s %y %n' /tmp/sample_file
-rw-r--r-- 1 jp jp 14 Sun Dec 18 15:04:12 2005 /tmp/sample_file

$ find /tmp/ -name sample_file -printf '%m %n %u %g %t %p'
644 1 jp jp Sun Dec 18 15:04:12 2005 /tmp/sample_file

No todos los sistemas operativos y versiones disponen de todas estas herramientas. Por ejemplo, Solaris no incluye stat por defecto.

También vale la pena señalar que los directorios no son más que archivos que el sistema operativo sabe que debe tratar de forma especial, por lo que los comandos que se muestran aquí funcionarán perfectamente en directorios, aunque a veces puede que tengas que modificar un comando para obtener el comportamiento que deseas. Por ejemplo, utiliza ls -d para listar información sobre el propio directorio, en lugar de sólo ls (que lista el contenido del directorio).

Ver también

1.7 Mostrar todos los archivos ocultos (de puntos) del directorio actual

Problema

Quieres ver sólo los archivos ocultos (punto) de un directorio para editar un archivo cuyo nombre has olvidado o eliminar archivos obsoletos. ls -a muestra todos los archivos, incluidos los normalmente ocultos, pero eso suele ser demasiado ruidoso, y ls -a .* hace más de lo que crees, o más de lo que quieres.

Solución

Utiliza ls -d junto con cualquier otro criterio que tengas. Por ejemplo:

ls -d .*
ls -d .b*
ls -d .[!.]*
ls -d .*/

Como todo directorio normal contiene un . y un .., no necesitas verlos. Puedes utilizar ls -A para listar todos los archivos de un directorio excepto esos dos. Para otros comandos en los que listas archivos con un comodín (es decir, un patrón), puedes construir tu comodín de forma que . y .. no coincidan:

$ grep -l 'PATH' ~/.[!.]*
/home/jp/.bash_history
/home/jp/.bash_profile
$

Debate

Debido a la forma en que el shell maneja los comodines de archivo, la secuencia .* no se comporta como cabría esperar o desear. La forma en que funciona la expansión de nombres de archivo o globbing es que cualquier cadena que contenga los caracteres *, ?, o [ se trata como un patrón, y se sustituye por una lista ordenada alfabéticamente de nombres de archivo que coincidan con el patrón. * coincide con cualquier cadena, incluida la cadena nula, mientras que ? coincide con cualquier carácter individual. Los caracteres encerrados en [] especifican una lista o rango de caracteres, cualquiera de los cuales coincidirá. También existen varios operadores de coincidencia de patrones extendidos que no vamos a tratar aquí (consulta "Caracteres de coincidencia de patrones" y "Operadores de coincidencia de patrones extendidos extglob" en el Apéndice A). Así, *.txt significa cualquier archivo que termine en .txt, mientras que *txt significa cualquier archivo que termine en txt (sin punto). f?o coincidiría con foo o fao, pero no con fooo. Teniendo esto en cuenta, podrías pensar que .* coincidiría con cualquier archivo que empezara por un punto.

El problema es que .* coincide tanto con el directorio . como con el .. (presentes en todos los directorios), que se muestran junto con cualquier otro nombre de archivo que empiece por punto. Cuando a ls se le da un nombre de directorio, no sólo lista ese nombre de directorio, sino también el contenido de ese directorio. Así, en lugar de obtener sólo los archivos que empiezan por punto del directorio actual, obtiene esos archivos más todos los archivos y directorios del directorio actual (.), todos los archivos y directorios del directorio padre (..) y los nombres y contenidos de cualquier subdirectorio del directorio actual que empiece por punto. Esto puede ser muy confuso, por no decir otra cosa, y suele ser más de lo que quieres.

Puedes experimentar con el mismo comando ls con -d y sin él, y luego probar con echo . *. El comando echo simplemente te muestra en qué expande el shell tu .*, que se convertirían en los argumentos del comando ls.

Prueba también con echo .[!.]*. .[!.]* es un patrón de expansión de nombre de archivo en el que [] indica una lista de caracteres que deben coincidir, pero el ! inicial niega la lista. Así que aquí buscamos un punto, seguido de cualquier carácter que no sea un punto, seguido de cualquier número de caracteres cualesquiera. También puedes utilizar ^ para negar una clase de caracteres, pero ! se especifica en el estándar POSIX y, por tanto, es más portable.

Hay otro caso especial en el comando ls que ayuda en este caso. Si se especifica la opción -d y si el patrón del nombre de archivo termina con una barra oblicua, el comando ls sólo mostrará los directorios que coincidan con ese patrón, en lugar de todos los nombres de archivo que coincidan. Por ejemplo:

$ ls -d .v*
.vim  .viminfo  .vimrc
$ ls -d .v*/
.vim
$

El primer comando muestra los tres nombres de archivo que empiezan por .v sin listar (debido a la opción -d ) el contenido de ninguno que pudiera ser un directorio. El segundo comando de este ejemplo utiliza una barra al final del patrón (.v*/) para que el comando ls sólo muestre los directorios que coincidan con el patrón; en este caso, sólo el directorio llamado .vim y ningún otro.

Advertencia

Si ves barras dobles en la salida del comando ls -d .v*/, así:

$ ls -d .v*/
.vim//
$

es probable que sea porque en realidad puedes estar ejecutando un alias de ls que incluya la bandera -F. Utiliza una barra invertida delante del nombre del comando para evitar cualquier alias:

$ \ls -d .v*/
.vim/
$

Algunas combinaciones son simplemente difíciles de emparejar. .[!.]* pasará por alto un archivo llamado ..foo. Puedes añadir algo como .??* para que coincida con cualquier cosa que empiece por un punto y que también tenga al menos tres caracteres, pero entonces ls -d .[!.]* .??* mostrará cualquier cosa que coincida dos veces con ambos patrones. O puedes utilizar .??* solo, pero se perderán archivos como .a:

$ touch ..foo .a .normal_dot_file normal_file

$ ls -a
. .. ..foo .a .normal_dot_file normal_file

$ ls -d .??*
..foo .normal_dot_file

$ ls -d .[!.]*
.a .normal_dot_file

$ ls -d .[!.]* .??* | sort -u
..foo
.a
.normal_dot_file

Lo que utilices dependerá de tus necesidades y de tu entorno; no existe una solución válida para todos.

Nota

Puedes utilizar echo * como sustituto de emergencia de ls si el comando ls está dañado o no está disponible por algún motivo. Esto funciona porque * es expandido por el intérprete de comandos a todo lo que hay en el directorio actual, lo que da como resultado una lista similar a la que obtendrías con ls.

1.8 Utilizar las Citas Shell

Problema

Necesitas una regla general para utilizar las comillas de la línea de comandos.

Solución

Encierra una cadena entre comillas simples a menos que contenga elementos que quieras que el intérprete de comandos interpolar.

Debate

El texto no entrecomillado, e incluso el que va entre comillas dobles, está sujeto a la expansión y sustitución del intérprete de comandos. Tenlo en cuenta:

$ echo A coffee is $5?!
A coffee is ?!

$ echo "A coffee is $5?!"
-bash: !": event not found

$ echo 'A coffee is $5?!'
A coffee is $5?!

En el primer ejemplo, $5 se trata como una variable a expandir, pero como no existe se establece como nula. En el segundo ejemplo, ocurre lo mismo, pero ni siquiera llegamos allí porque ! se trata como una sustitución del historial, que falla en este caso porque no coincide con nada del historial. El tercer ejemplo funciona como se esperaba.

Para mezclar algunas expansiones del intérprete de comandos con algunas cadenas literales, puedes utilizar el carácter de escape del intérprete de comandos \ o cambiar el entrecomillado. El signo de exclamación es un caso especial porque el carácter de escape de barra invertida que lo precede no se elimina. Puedes evitarlo utilizando comillas simples o un espacio al final, como se muestra aquí:

$ echo 'A coffee is $5 for' "$USER" '?!'
A coffee is $5 for jp ?!

$ echo "A coffee is \$5 for $USER?\!"
A coffee is $5 for jp?\!

$ echo "A coffee is \$5 for $USER?! "
A coffee is $5 for jp?!

Además, no puedes incrustar una comilla simple dentro de comillas simples, aunque utilices una barra invertida, ya que nada (ni siquiera la barra invertida) se interpola dentro de las comillas simples. Pero puedes solucionarlo utilizando comillas dobles con escapes, o escapando una comilla simple fuera de las comillas simples que la rodean.

# We'll get a continuation prompt since we now have unbalanced quotes
$ echo '$USER won't pay $5 for coffee.'
> ^C

# WRONG
$ echo "$USER won't pay $5 for coffee."
jp won't pay for coffee.

# Works
$ echo "$USER won't pay \$5 for coffee."
jp won't pay $5 for coffee.

# Also works
$ echo 'I won'\''t pay $5 for coffee.'
I won't pay $5 for coffee.

Ver también

  • Enel capítulo 5 encontrarás más información sobre las variables del shell y la sintaxis $VAR

  • Enel capítulo 18 encontrarás más información sobre ! y los comandos de historial

1.9 Utilizar o reemplazar Builtins y Comandos Externos

Problema

Quieres sustituir un comando incorporado por tu propia función o comando externo, y necesitas saber exactamente qué está ejecutando tu script (por ejemplo, /bin/echo o el comando incorporado echo). O has creado un nuevo comando y puede entrar en conflicto con un comando externo o incorporado existente.

Solución

Utiliza el tipo y los comandos para ver si existe un comando determinado y si está incorporado o es externo:

$ type cd
cd is a shell builtin

$ type awk
awk is /usr/bin/awk

$ which cd
/usr/bin/which: no cd in (/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/ \
local/sbin:/usr/bin/X11:/usr/X11R6/bin:/root/bin)

$ which awk
/usr/bin/awk

Debate

Un comando incorporado es precisamente eso; está incorporado en el propio shell, mientras que un comando externo es un archivo externo lanzado por el shell. El archivo externo puede ser un binario, o puede ser un script del propio shell, y es importante entender la diferencia por un par de razones. En primer lugar, cuando utilices una versión determinada de un shell concreto, los programas integrados siempre estarán disponibles, pero los programas externos pueden estar instalados o no en un sistema concreto. En segundo lugar, si le das a uno de tus propios programas el mismo nombre que a un builtin, los resultados serán muy confusos, ya que el builtin siempre tendrá preferencia (ver Receta 19.4). Es posible utilizar el comando enable para activar y desactivar los comandos de los builtins, aunque te recomendamos encarecidamente que no lo hagas a menos que estés absolutamente seguro de que entiendes lo que estás haciendo. enable -a listará todos los builtins y su estado de activación o desactivación.

Uno de los problemas de los comandos integrados es que generalmente no puedes utilizar las opciones -h o --help para obtener recordatorios de uso, y si existe una página de manual, a menudo es sólo un puntero a la gran página de manual de bash. Ahí es donde resulta útil el comando help, que a su vez es un comando incorporado, . help muestra ayuda sobre los comandos incorporados al shell:

help: help [-dms] [pattern ...]
    Display information about builtin commands.

    Displays brief summaries of builtin commands.  If PATTERN is
    specified, gives detailed help on all commands matching PATTERN,
    otherwise the list of help topics is printed.

    Options:
      -d	output short description for each topic
      -m	display usage in pseudo-manpage format
      -s	output only a short usage synopsis for each topic matching
    	PATTERN

    Arguments:
      PATTERN	Pattern specifying a help topic

    Exit Status:
    Returns success unless PATTERN is not found or an invalid option is given.

Cuando necesites redefinir un builtin, utiliza el comando builtin para evitar bucles. Por ejemplo, podemos definir una función shell (ver Receta 10.4) para cambiar cómo funciona el comando cd:

cd () {
    builtin cd "$@"
    echo "$OLDPWD --> $PWD"
}

Para forzar el uso de un comando externo en lugar de cualquier función o builtin que de otro modo tendría precedencia, utiliza enable -n, que desactiva los builtins del shell, o command, que ignora las funciones del shell. Por ejemplo, para utilizar la prueba que se encuentra en $PATH en lugar de la versión del shell builtin, escribe enable -n test y luego ejecuta test. O utiliza command ls para utilizar el comando ls nativo en lugar de cualquier función ls que hayas creado.

Ver también

1.10 Determinar si estás ejecutando interactivamente

Problema

Tienes algún código que quieres que se ejecute sólo si se está (o no se está) ejecutando de forma interactiva.

Solución

Utiliza la declaración case del Ejemplo 1-1.

Ejemplo 1-1. ch01/interactivo
#!/usr/bin/env bash
# cookbook filename: interactive

case "$-" in
    *i*) # Code for interactive shell here
     ;;
    *)   # Code for noninteractive shell here
     ;;
esac

Debate

$- es un listado de todas las opciones actuales del intérprete de comandos. Contendrá i si el intérprete de comandos es interactivo.

También puedes ver código como el siguiente (funcionará, pero la solución del Ejemplo 1-1 es el método preferido):

if [ -n "$PS1" ]; then
    echo This shell is interactive
else
    echo This shell is not interactive
fi

Ver también

1.11 Establecer bash como tu shell por defecto

Problema

Estás utilizando un sistema BSD, Solaris o alguna otra variante de Unix para la que bash no es el shell por defecto. Estás cansado de iniciar bash explícitamente todo el tiempo, y quieres que bash sea tu shell por defecto.

Solución

En primer lugar, asegúrate de que bash está instalado. Prueba a escribir bash --version en la línea de comandos. Si aparece una versión, es que está instalado:

$ bash --version
GNU bash, version 3.00.16(1)-release (i386-pc-solaris2.10)
Copyright (C) 2004 Free Software Foundation, Inc.
$

Si no ves un número de versión, puede que te falte un directorio en tu ruta. chsh -l o cat /etc/shells pueden darte una lista de shells válidos en algunos sistemas. Si no, pregunta al administrador de tu sistema dónde está bash, o si se puede instalar.

chsh -l proporciona una lista de shells válidos en Linux, pero abre un editor y te permite cambiar la configuración en BSD. -l no es una opción válida para chsh en macOS, pero simplemente ejecutando chsh se abrirá un editor que te permitirá cambiar la configuración, y chpass -s shell cambiará tu shell.

Si bash está instalado, utiliza el comando chsh -s para cambiar tu shell por defecto: por ejemplo, chsh -s /bin/bash. Si por alguna razón eso falla, prueba con chsh, passwd -e, passwd -l, chpass, o usermod -s /usr/bin/bash. Si sigues sin poder cambiar tu shell, pregunta a tu administrador del sistema, que puede que tenga que editar el archivo /etc/passwd. En la mayoría de los sistemas, /etc/passwd tendrá líneas de la forma:

cam:pK1Z9BCJbzCrBNrkjRUdUiTtFOh/:501:100:Cameron Newham:/home/cam:/bin/bash
cc:kfDKDjfkeDJKJySFgJFWErrElpe/:502:100:Cheshire Cat:/home/cc:/bin/bash

Como root, sólo tienes que editar el último campo de las líneas del archivo de contraseñas con el nombre completo de la ruta del shell que elijas. Si tu sistema tiene un comando vipw, deberías utilizarlo para garantizar la coherencia del archivo de contraseñas.

Advertencia

Algunos sistemas se negarán a permitir un shell de inicio de sesión que no esté listado en /etc/shells. Si bash no aparece en ese archivo, tendrás que pedirle al administrador del sistema que lo añada.

Debate

Algunos sistemas operativos, especialmente los Unix BSD, suelen colocar bash en la partición /usr. Puede que quieras pensártelo dos veces antes de cambiar el shell de rooten tales sistemas. Si el sistema tiene problemas al arrancar y tienes que trabajar en él antes de que se monte /usr, tienes un verdadero problema: no hay un intérprete de órdenes que pueda utilizar root. Por lo tanto, lo mejor es no cambiar el shell por defecto para root. Sin embargo, no hay razón para no hacer que bash sea el shell por defecto para las cuentas de usuario normales. Y ni que decir tiene que es una mala práctica utilizar la cuenta root a menos que sea absolutamente necesario. Utiliza tu cuenta normal (de usuario) siempre que sea posible. Con comandos como sudo, rara vez necesitarás un intérprete de comandos root.

Si todo lo demás falla, probablemente puedas sustituir tu shell de inicio de sesión actual por bash utilizando exec, pero esto no es para los débiles de corazón. Consulta "A7) ¿Cómo puedo hacer que bash sea mi shell de inicio de sesión?" en las FAQ debash.

Ver también

1.12 Mantener bash actualizado

Problema

Esto no es realmente una receta normal, y probablemente no haga falta decirlo, pero es un tema que nadie puede permitirse ignorar y queríamos decirlo de todos modos. Necesitas mantener tanto bash como todo tu sistema actualizados con los parches de seguridad.

Solución

Mantener actualizado todo tu sistema está fuera del alcance de este libro; consulta al administrador de tu sistema y la documentación.

Cómo mantengas actualizado bash depende de cómo lo hayas obtenido en primer lugar. En el caso ideal, forma parte del sistema en general y se actualiza cuando se actualiza el sistema. Puede que no sea así si utilizas un sistema muy antiguo que ya no recibe soporte, en cuyo caso tendrás que actualizarlo todo. Si estás utilizando tu sistema de paquetes y el repositorio de origen aún se mantiene activamente, deberías obtener las actualizaciones de allí; por ejemplo, de Extra Packages for Enterprise Linux (EPEL) o de un Archivo Personal de Paquetes (PPA) de Ubuntu.

Si instalaste desde el código fuente, dependerá de ti actualizarlo y reconstruirlo como corresponda.

Debate

Todos sabemos por qué debemos mantenernos actualizados, pero de todos modos citaremos una razón bien conocida: CVE-2014-6271, más conocida como la vulnerabilidad shellshock .

1.13 Obtener bash para Linux

Problema

Quieres conseguir bash para tu sistema Linux, o quieres asegurarte de que tienes la última versión.

Solución

bash está incluido en prácticamente todas las distribuciones modernas de Linux. Para asegurarte de que tienes la última versión disponible para tu distribución, utiliza las herramientas de empaquetado integradas en la distribución. Debes ser root o tener sudo o la contraseña de root para actualizar o instalar aplicaciones.

Algunas distribuciones de Linux (sobre todo la familia Debian) utilizan el shell Debian Almquist, o dash,como /bin/sh porque es más pequeño y, por tanto, se ejecuta un poco más rápido que bash. Ese cambio causó mucha confusión cuando los scripts asumían que /bin/sh era realmente bash, ya que los scripts que utilizaban funciones de bash con #!/bin/sh fallaban. Consulta la Receta 15.3 para más detalles.

Para Debian y sistemas derivados de Debian como Ubuntu y Linux Mint, utiliza una de las diversas herramientas de interfaz gráfica de usuario (GUI) o una herramienta de línea de comandos como apt-get, aptitude o apt para asegurarte de que está instalado y actualizado:

apt-get update && apt-get install bash bash-completion bash-doc

Para las distribuciones Red Hat , incluidas Fedora, Community OS (CentOS) y Red Hat Enterprise Linux (RHEL), utiliza la herramienta GUI Añadir/Quitar aplicaciones. Sólo para la línea de comandos, utiliza

yum update bash

Para SUSE, utiliza la versión GUI o terminal de YaST. También puedes utilizar la herramienta rpm de la línea de comandos.

Debate

Es imposible abarcar todas las distribuciones de Linux y difícil incluso abarcar las principales, ya que todas evolucionan rápidamente. Afortunadamente, gran parte de esa evolución se produce en el ámbito de la facilidad de uso, por lo que no debería ser muy difícil averiguar cómo instalar software en la distribución que elijas.

Al utilizar LiveCDs, lo más probable es que las actualizaciones e instalaciones de software fallen debido al soporte de sólo lectura. Las versiones de dichas distribuciones que se hayan instalado en un disco duro deben poder actualizarse.

Si en te preguntas qué versión de bash está disponible en una determinada distribución de Linux, busca la distribución en DistroWatch.com y consulta la tabla de paquetes. Por ejemplo, https://distrowatch.com/table.php?distribution=mint muestra lo que ves en la Tabla 1-1.

Tabla 1-1. Versiones de Bash en Linux Mint
Paquete 18 sarah 17,3 rosa 16 petra 15 olivia 14 nadia 13 maya 12 lisa 11 katya 10 julia ...

bash (4.4)

4.3

4.3

4.2

4.2

4.2

4.2

4.2

4.2

4.1

...

1.14 Obtener bash para xBSD

Problema

Quieres conseguir bash para tu sistema FreeBSD, NetBSD u OpenBSD, o quieres asegurarte de que tienes la última versión.

Solución

Según la página debash de Chet Ramey:

Bash-4.3 está incluido en la colección de ports de FreeBSD, en la colección de paquetes de OpenBSD y en la colección de paquetes de NetBSD.

Para ver si bash está instalado, comprueba el archivo /etc/shells. Para instalar o actualizar bash, utiliza el comando pkg_add. Si eres un usuario experimentado de BSD, puede que prefieras utilizar la colección de ports, pero no lo trataremos aquí.

Si te preguntas qué versión de bash está disponible en una determinada distribución BSD, busca la distribución en DistroWatch.com y consulta la tabla de paquetes. Por ejemplo

Para FreeBSD, utiliza el comando:

pkg_add -vr bash

Para NetBSD, navega hasta Software de aplicación para NetBSD y localiza el último paquete bash para tu versión y arquitectura, luego utiliza un comando como:

pkg_add -vu ftp://ftp.netbsd.org/pub/NetBSD/packages/pkgsrc-2005Q3/NetBSD-2.0/ \
i386/All/bash-3.0pl16nb3.tgz

Para OpenBSD, utiliza el comando pkg_add -vr. Puede que tengas que ajustar la ruta FTP a tu versión y arquitectura. Además, puede que exista una versión compilada estáticamente. Por ejemplo:

pkg_add -vr ftp://ftp.openbsd.org/pub/OpenBSD/3.8/packages/i386/bash-3.0.16p1.tgz

Debate

FreeBSD y OpenBSD colocan bash en /usr/local/bin/bash, mientras que NetBSD utiliza /usr/pkg/ bin/bash.

1.15 Obtener bash para macOS

Problema

Quieres conseguir bash para tu Mac, o quieres asegurarte de que tienes la última versión.

Solución

Según la página debash de Chet Ramey:

Las versiones actuales de Mac OS X [ahora llamado macOS] (que datan de Jaguar/Mac OS X 10.2) incluyen bash-3.2 como /bin/sh. También hay paquetes precompilados para OS X de bash-4.3 disponibles en muchos sitios web, aunque los paquetes fuente suelen estar más actualizados. Bash para Darwin (la base para MacOS X) está disponible en MacPorts, Homebrew o Fink.

Debate

También es posible crear una versión más reciente de bash a partir del código fuente, pero esto sólo se recomienda a los usuarios experimentados (consulta el Apéndice E).

1.16 Obtener bash para Unix

Problema

Quieres conseguir bash para tu sistema Unix, o quieres asegurarte de que tienes la última versión.

Solución

Si aún no está instalado o no está en el repositorio de programas de tu sistema operativo, consulta la página bash de Chet Ramey para descargar binarios, o constrúyelo desde el código fuente (consulta el Apéndice E).

Debate

Según la página debash de Chet Ramey:

El proyecto OpenPKG pone a disposición RPMs fuente de bash-4.3 para diversos sistemas Unix y Linux como parte esencial de la versión actual.

Los usuarios de Solaris 2.x, Solaris 7/8/9/10/11 pueden obtener una versión precompilada de bash-4.3 en el sitio Unixpackages (suscripción) o en OpenCSW. Oracle distribuye bash-3.2 como parte compatible de Solaris 10 y bash-4.1 como parte de Solaris 11. La versión de Solaris/Illumos distribuida como OpenIndiana incluye bash-4.3 desde septiembre de 2016.

Los usuarios de AIX pueden obtener versiones precompiladas de bash-4.3 y versiones anteriores para varias versiones de AIX en Groupe Bull, y fuentes y binarios de bash-4.3 para varias versiones de AIX en perzl.org. IBM ofrece bash-4.2 y bash-4.3 para AIX 5L, AIX 6.1 y AIX 7.1 como parte de la caja de herramientas AIX para aplicaciones GNU/Linux. Utilizan el formato RPM; también puedes conseguir RPM para AIX desde allí.

Los usuarios de HP-UX pueden obtener los binarios y el código fuente de bash-4.3 en el Centro de Portabilidad y Archivo de Software para HP-UX.

1.17 Obtener bash para Windows

Problema

Quieres conseguir bash para tu sistema Windows, o quieres asegurarte de que tienes la última versión.

Solución

Utiliza Cygwin o Ubuntu en Windows, o una máquina virtual. O no utilices bash.

Descarga Cygwin y ejecútalo. Sigue las instrucciones y elige los paquetes a instalar, incluido bash, que se encuentra en la categoría shells y está seleccionado por defecto. Una vez instalado Cygwin, tendrás que configurarlo. Consulta la Guía del Usuario para más detalles.

Para Ubuntu en Windows necesitas una versión de Windows 10 del verano de 2016 o posterior; entonces sigue las instrucciones de instalación, detalladas en la Discusión.

Para utilizar una máquina virtual, consulta la Receta 15.4.

Por último, aunque odiemos decirlo, quizá la solución correcta sea utilizar herramientas nativas como PowerShell.

Debate

Cygwin

Cygwin es un entorno similar a Linux para Windows que proporciona un aspecto y una sensación de Linux.

Del sitio de Cygwin:

Cygwin lo es:

  • una gran colección de herramientas GNU y de Código Abierto que proporcionan una funcionalidad similar a la de una distribución Linux en Windows.

  • una DLL (cygwin1.dll) que proporciona una funcionalidad sustancial de la API POSIX.

Cygwin no lo es:

  • una forma de ejecutar aplicaciones nativas de Linux en Windows. Debes reconstruir tu aplicación desde el código fuente si quieres que funcione en Windows.

  • una forma de hacer que las aplicaciones nativas de Windows conozcan mágicamente la funcionalidad de UNIX®, como señales, ptys, etc. De nuevo, tienes que crear tus aplicaciones desde el código fuente si quieres aprovechar la funcionalidad de Cygwin.

La DLL de Cygwin funciona actualmente con todas las versiones x86 de 32 y 64 bits recientes y comercializadas de Windows, empezando por Windows Vista.

Nota

La anterior versión 2.5.2 de Cygwin fue la última compatible con Windows XP y Server 2003.

Cygwin es un verdadero entorno tipo Unix que se ejecuta sobre Windows. Es una herramienta excelente, pero a veces puede resultar excesiva. Para obtener los binarios nativos de Windows de las utilidades GNU Text (sin incluir bash), consulta http://unxutils.sourceforge.net/.

Ubuntu en Windows

Ejecutar Ubuntu en Windows es muy interesante, pero aparte de que incluye bash está fuera del alcance de este libro, así que no lo trataremos en detalle. Para más detalles, consulta las referencias que aparecen en la sección Ver también.

Brevemente:

  • Activa el Modo Desarrollador (consulta http://bit.ly/2h21MSZ).

    • Busca "Características de Windows".

    • Elige "Activar o desactivar las características de Windows" y activa "Subsistema de Windows para Linux".

      • ¡¡¡Esto probablemente requiere un reinicio!!! En serio!?!

  • Abre el símbolo del sistema y escribe bash.

    • Descarga el Subsistema de Windows para Linux de la tienda de Windows.

Utilizando PowerShell u otras herramientas nativas

PowerShell es la respuesta de Microsoft a la potencia y flexibilidad de las herramientas de línea de comandos y el sustituto de los archivos por lotes command.com y cmd.exe. Aparte del hecho de que es la respuesta nativa de Windows al shell scripting, está fuera del alcance de este libro, por lo que no lo trataremos.

Aunque palidecen en comparación con cualquiera de las herramientas de Unix/Linux, los antiguos lenguajes de script de shell eran más potentes de lo que mucha gente sabía. Pueden ser apropiados para tareas muy sencillas en las que cualquiera de las otras soluciones comentadas aquí resulten exageradas. Consulta http://www.jpsdomain.org/windows/winshell.html para más detalles.

Para obtener potentes shells de línea de comandos basados en caracteres y GUI con una interfaz más consistente pero con sabor a DOS/Windows, consulta http://jpsoft.com. Ninguno de los autores está afiliado a esta empresa, pero uno de ellos es un usuario satisfecho desde hace mucho tiempo.

1.18 Obtener bash sin obtener bash

Problema

Quieres probar una shell o un script de shell en un sistema que no tienes tiempo ni recursos para construir o comprar.

O te apetece leer una receta zen justo ahora.

Solución

Consigue una cuenta shell gratuita casi en http://polarhome.com, que tiene una pequeña y simbólica cuota única, o en otro proveedor.

Como casi todas las distribuciones Linux y BSD tienen una imagen LiveCD o LiveDVD, que casi seguro que también puede utilizarse como LiveUSB, puedes descargarlas y arrancarlas para experimentar. También es una buena idea si estás pensando en cambiar, para poder verificar que todo tu hardware es compatible y funciona. La parte complicada puede ser conseguir que la BIOS o UEFI de tu sistema arranque desde el CD/DVD o USB. Solía ser complicado "grabar" una ISO en una memoria USB, pero ahora hay muchas herramientas e instrucciones detalladas en la web para la distribución que elijas.

Como alternativa, puedes utilizar una solución de virtualización; consulta la Receta 15.4.

Debate

Polarhome ofrece muchos servicios gratuitos y cuentas shell casi gratuitas. Según el sitio web:

polarhome.com es un esfuerzo educativo no comercial para la popularización de los sistemas operativos con shell y los servicios de Internet, que ofrece cuentas de shell, el entorno de desarrollo, correo y otros servicios en línea en todos los sistemas disponibles (actualmente en diferentes sabores de Linux, MacOS X, OpenVMS, Solaris, OpenIndiana, AIX, QNX, IRIX, HP-UX, Tru64, SCO OpenServer, UnixWare, FreeBSD, OpenBSD, NetBSD, DragonFly/BSD, MirBSD, Ultrix, Minix, GNU Hurd, Syllable y OPENSTEP).

1.19 Aprender más sobre la documentación de bash

Problema

Te gustaría leer más sobre bash pero no sabes por dónde empezar.

Solución

Bueno, estás leyendo este libro, ¡que es un buen punto de partida! Los otros libros de O'Reilly sobre bash y shell scripting son Learning the bash Shell, 3ª Edición, de Cameron Newham y Classic Shell Scripting de Nelson H. F. Beebe y Arnold Robbins.

Por desgracia, no toda la documentación oficial de bash ni los archivos de soporte son fácilmente accesibles en línea. El Manual de Referencia de Bash está disponible en el sitio web del Proyecto GNU, pero gran parte del resto del material es más difícil de encontrar o de acceder. Nuestro sitio web complementario ha hecho todo el trabajo por ti y proporciona la documentación de referencia oficial de bash y otro material útil en línea para que sea fácil consultarlo. Compruébalo, y remite a otros a él cuando sea necesario.

Documentación oficial

La FAQ oficial de bash está en ftp://ftp.cwru.edu/pub/bash/FAQ. Consulta especialmente "H2) ¿Qué tipo de documentación sobre bash existe?". También se recomienda encarecidamente la guía de referencia oficial; más adelante encontrarás más detalles.

La página de bash de Chet Ramey contiene un montón de información muy útil. Chet (el actual mantenedor de bash ) también mantiene lo siguiente:

LÉEME

Un archivo que describe bash

NOTICIAS

Un archivo que enumere escuetamente los cambios notables entre la versión actual y la anterior.

CAMBIOS

Un historial completo de cambios en bash

INSTALAR

Instrucciones de instalación

NOTAS

Notas de configuración y funcionamiento específicas de la plataforma

COMPAT

Lista de problemas de compatibilidad entre bash3 y bash1

El último código fuente de bash y la documentación están siempre disponibles en http://ftp.gnu.org/gnu/bash/.

Te recomendamos encarecidamente que descargues tanto el código fuente como la documentación, aunque utilices binarios preempaquetados (en el Apéndice B encontrarás un índice de los ejemplos y el código fuente incluidos). Aquí tienes una breve lista de la documentación incluida en el directorio ./doc del tarball fuente (por ejemplo, para http://ftp.gnu.org/gnu/bash/bash-4.4.tar.gz/, bash-4.4/doc):

PREGUNTAS FRECUENTES

Un conjunto de preguntas frecuentes sobre bash con respuestas

INTRO

Breve introducción a bash

artículo.ms

Un artículo que Chet escribió sobre bash para The Linux Journal

bash.1

La página man de bash

bashbug.1

La página man de bashbug

builtins.1

Una página de manual que documenta los builtins extraídos de bash.1

bashref.texi

El manual de referencia de Bash

bashref.info

El Manual de Referencia Bash procesado por makeinfo

rbash.1

La página restringida del shell bash

línea de lectura.3

La página man de readline

Los archivos .ps son versiones PostScript de los archivos enumerados aquí. Los archivos .html son versiones HTML de la página de manual y del manual de referencia. Los archivos .0 son páginas de manual formateadas. Las versiones .txt son ASCII, la salida de groff -Tascii.

En el tarball de documentos (por ejemplo, http://ftp.gnu.org/gnu/bash/bash-doc-4.4.tar.gz), encontrarás versiones formateadas de:

bash-doc-4.4:

bash.0

La página de manual de bash (también .pdf, .ps, .html)

bashbug.0

La página man de bashbug

bashref

El Manual de Referencia GNU Bash (también .pdf, .ps, .html, .dvi)

builtins.0

La página man de builtins

rbash.0

La página restringida del shell bash

Ver también

Get Libro de cocina bash, 2ª edición now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.