Aspectos básicos de Bash

Completado

Para entender Bash primero hay que entender su sintaxis. Una vez que conozca la sintaxis, puede aplicarla a todos los comandos de Bash que ejecute.

La sintaxis completa de un comando de Bash es la siguiente:

command [options] [arguments]

Bash trata la primera cadena que encuentra como un comando. En el comando siguiente se usa el comando ls (de "lista") de Bash para mostrar el contenido del directorio de trabajo actual:

ls

Los comandos de Bash suelen ir acompañados de argumentos. Por ejemplo, puede incluir un nombre de ruta de acceso en un comando ls para mostrar el contenido de otro directorio:

ls /etc

La mayoría de los comandos de Bash tienen opciones para modificar su funcionamiento. Las opciones, también denominadas marcas, proporcionan instrucciones más específicas a un comando. Por ejemplo, los archivos y directorios cuyos nombres empiezan por un punto se ocultan al usuario y no se muestran en ls. Pero puede incluir la marca -a (de "all", [todo]) en un comando ls y ver todo lo que incluye el directorio de destino:

ls -a /etc

Incluso puede combinar marcas para mayor brevedad. Por ejemplo, en lugar de escribir ls -a -l /etc para mostrar todos los archivos y directorios del directorio /etc de Linux en formato largo, puede escribir esto:

ls -al /etc

Bash es conciso. En ocasiones es sorprendente (y un orgullo para los usuarios de Bash) todo lo que se puede conseguir con un solo comando.

Obtención de ayuda

Las opciones y los argumentos que se pueden usar, o que se deben usar, varían de un comando a otro. Afortunadamente, la documentación de Bash está integrada en el sistema operativo. La ayuda nunca está a más de un comando de distancia. Para obtener información sobre las opciones de un comando, use el comando man (de "manual"). Por ejemplo, para ver todas las opciones del comando mkdir ("crear directorio"), haga lo siguiente:

man mkdir

man será su mejor aliado mientras aprende Bash. man es cómo se encuentra la información necesaria para entender el funcionamiento de un comando.

La mayoría de los comandos de Bash y Linux admiten la opción --help. Esto muestra una descripción de las opciones y la sintaxis del comando. Como ejemplo, escriba mkdir --help. La salida tendrá un aspecto similar al siguiente:

Usage: mkdir [OPTION]... DIRECTORY...
Create the DIRECTORY(ies), if they do not already exist.
    
Mandatory arguments to long options are mandatory for short options too.
  -m, --mode=MODE   set file mode (as in chmod), not a=rwx - umask
  -p, --parents     no error if existing, make parent directories as needed
  -v, --verbose     print a message for each created directory
  -Z                   set SELinux security context of each created directory
                         to the default type
      --context[=CTX]  like -Z, or if CTX is specified then set the SELinux
                         or SMACK security context to CTX
      --help     display this help and exit
      --version  output version information and exit
    
GNU coreutils online help: <http://www.gnu.org/software/coreutils/>
Report mkdir translation bugs to <http://translationproject.org/team/>
Full documentation at: <http://www.gnu.org/software/coreutils/mkdir>
or available locally via: info '(coreutils) mkdir invocation'

La ayuda que se obtiene de este modo normalmente es más concisa que la que se obtiene con man.

Uso de caracteres comodín

Los caracteres comodín son símbolos que representan uno o varios caracteres en comandos de Bash. El carácter comodín que se usa con más frecuencia es el asterisco. Representa cero caracteres o una secuencia de caracteres. Imagine que el directorio actual contiene centenares de archivos de imagen, pero solo quiere ver los archivos PNG, cuyos nombres de archivo terminan en .png. Este es el comando para mostrar solo esos archivos:

ls *.png

Nota:

Linux no tiene ningún concepto formal de extensión de nombre de archivo como en otros sistemas operativos. Esto no significa que los archivos PNG no tengan una extensión .png. Simplemente significa que Linux no adjunta ningún significado especial al hecho de que los nombres de archivo terminen en .png.

Imagine ahora que el directorio actual también contiene archivos JPEG. Algunos terminan en .jpg, mientras que otros terminan en .jpeg. Esta es una manera de enumerar todos los archivos JPEG:

ls *.jpg *.jpeg

Y esta es otra:

ls *.jp*g

El carácter comodín * coincide con cero o más caracteres, pero el carácter comodín ? representa un único carácter. Si el directorio actual contiene archivos con los nombres 0001.jpg, 0002.jpg, etc., hasta 0009.jpg, el comando siguiente los muestra todos:

ls 000?.jpg

Otra forma de usar caracteres comodín para filtrar los resultados consiste en utilizar corchetes, que denotan grupos de caracteres. El comando siguiente muestra todos los archivos del directorio actual cuyos nombres contienen un punto inmediatamente seguido de una letra J o P en minúscula. Muestra todos los archivos .jpg, .jpeg y .png, pero no los archivos .gif:

ls *.[jp]*

En Linux, los nombres de archivo y los comandos que operan en ellos distinguen mayúsculas de minúsculas. Por tanto, para enumerar todos los archivos del directorio actual cuyos nombres contengan puntos seguidos de una letra J o P mayúscula o minúscula, puede escribir esto:

ls *.[jpJP]*

Las expresiones entre corchetes pueden representar rangos de caracteres. Por ejemplo, el comando siguiente muestra todos los archivos del directorio actual cuyos nombres comienzan con una letra minúscula:

ls [a-z]*

Este comando, por el contrario, muestra todos los archivos del directorio actual cuyos nombres comienzan con una letra mayúscula:

ls [A-Z]*

Y este muestra todos los archivos del directorio actual cuyos nombres comienzan con una letra minúscula o mayúscula:

ls [a-zA-Z]*

En función de todo esto, ¿puede adivinar qué harán los comandos siguientes?

ls [0-9]*
ls *[0-9]*
ls *[0-9]

Si tiene que usar uno de los caracteres comodín como un carácter convencional, puede convertirlo en literal o "aplicarle escape" si lo precede una barra diagonal inversa. Por tanto, si por alguna razón tiene un asterisco como parte de un nombre de archivo, algo que nunca debe hacer de forma intencionada, podría buscarlo con un comando como este:

$ ls *\**