Ocho opciones poco conocidas de Bash

Algunas opciones de Bash son bien conocidas y se usan a menudo. Por ejemplo, muchos al principio de un script escriben

set -o xtrace

para depuración,

set -o errexit

para salir en caso de error o

set -o errunset

para salir si una variable llamada no está establecida.

Pero hay muchas otras opciones. A veces están descritas de forma confusa en las manpages, así que he recopilado algunas de las más útiles aquí, con explicación.

Nota: en Mac puede haber una versión anterior de bash (3.x, en lugar de 4.x), donde no todas estas opciones están disponibles. En este caso, consulte aquí o aquí.

set o shopt?

Hay dos formas de establecer parámetros de bash: desde un script o desde la línea de comandos. Se pueden usar comandos integrados set y shopt. Ambos cambian el comportamiento de la shell, hacen en gran medida lo mismo (con diferentes argumentos), y se diferencian en su origen. Los parámetros set se heredan o se toman prestados de los parámetros de otras shells, mientras que los parámetros shopt se crean en bash.

Si quiere ver las opciones actuales, ejecute:

$ set -o
$ shopt

Para activar la opción en set se usa una sintaxis corta o larga:

$ set -o errunset
$ set -e

El efecto es el mismo.

Para desactivar una opción, hay que poner un más en lugar de un menos:

$ set +e

Durante mucho tiempo no pude recordar esta sintaxis, ya que la lógica parece incorrecta (el menos activa la opción y el más la desactiva).

En shopt para activar y desactivar opciones se usan (más lógicas) flags -s (set) y -u (unset):

$ shopt -s cdspell # <= on
$ shopt -u cdspell # <= off

Cambio de directorios

Hay algunas opciones que ayudan a trabajar con directorios.

1. cdspell

Con esta configuración, bash comenzará a entender errores tipográficos y te llevará a la carpeta cuyo nombre escribiste incorrectamente.

$ shopt -s cdspell
$ mkdir abcdefg
$ cd abcdeg
abcdefg
$ cd ..

He usado esta opción durante muchos años, y muy raramente (quizás una vez al año) toma una decisión muy extraña. Pero en los demás días cdspell ahorra tiempo, literalmente cada día.

2. autocd

Si no estás dispuesto a lidiar con la ineficiencia de ingresar repetidamente cd, puedes establecer esta opción para moverte a la carpeta X si el comando X no existe.

$ shopt -s autocd
$ abcdefg
$ cd ..

Combinado con la autocompletación, permite saltar rápidamente entre carpetas:

$ ./abc[TAB][RETURN]
cd -- ./abcdefg

Solo no le pongas el nombre rm -rf * (sí, por cierto, esto es posible).

3. direxpand

Es una opción genial que expande variables de entorno al presionar Tab:

$ shopt -s direxpand
$ .\/[TAB]     # se reemplaza por...
$ \/full\/path\/to\/current_working_folder
$ ~\/[TAB]     # se reemplaza por...
$ \/full\/path\/to\/home\/folder
$ $HOME\/[TAB] #  se reemplaza por...
$ \/full\/path\/to\/home\/folder

Salida limpia

4. checkjobs

Este parámetro detiene la salida de la sesión si todavía hay tareas en segundo plano en ejecución.

En lugar de salir, se muestra una lista de tareas pendientes. Si aún deseas salir, ingresa de nuevo exit.

$ shopt -s checkjobs
$ echo $$
68125             # <= ID del proceso para la consola
$ sleep 999 &
$ exit
There are running jobs.
[1]+  Running                 sleep 999 &
$ echo $$
68125             # <= ID del proceso para la consola sigue siendo el mismo
$ exit
There are running jobs.
[1]+  Running                 sleep 999 &
$ exit
$ echo $$
$ 59316           # <= esta vez el ID del proceso ha cambiado

Superpoderes de expansión

5. globstar

¡Esta opción te da superpoderes de expansión! Si introduces:

$ shopt -s globstar
$ ls **

entonces la consola mostrará recursivamente todos los directorios y subdirectorios.

En combinación con direxpand puedes explorar rápidamente todo lo que está por debajo en la jerarquía:

$ shopt -s direxpand
$ ls **[TAB][TAB]
¿Mostrar todas las 2033 posibilidades? (y o n) 

6. extglob

Esta opción activa funciones que se asocian más comúnmente con expresiones regulares. A veces, esto es muy útil:

$ shopt -s extglob
$ touch afile bfile cfile
$ ls
afile bfile cfile
$ ls ?(a*|b*)
afile bfile
$ ls !(a*|b*)
cfile

Aquí, los patrones se colocan entre paréntesis y se separan por una barra vertical. Aquí están los operadores disponibles:

? = соответствует нулю или одному вхождению заданных шаблонов
! = показать всё, что не соответствует заданным шаблонам
* = ноль или более вхождений
+ = одно или более вхождений
@ = ровно одно вхождение

Protección contra accidentes

7. histverify

Al principio puede ser un poco intimidante usar el lanzamiento rápido de comandos desde el historial con abreviaturas !! y !$.

La opción histverify te permite ver primero cómo Bash interpreta el comando antes de que realmente se ejecute:

$ shopt -s histverify
$ echo !$          # <= Al presionar Enter, el comando no se ejecuta
$ echo histverify  # <= Se muestra primero en la pantalla,
histverify         # <= y luego se ejecuta 

8. Noclobber

De nuevo, para proteger contra accidentes, específicamente contra la sobreescritura de un archivo que ya existe con un operador de redirección (>). Esto puede ser catastrófico si no tienes una copia de seguridad.

La opción set -C prohíbe tal sobreescritura. Si es necesario, puedes eludir la protección con el operador >|:

$ touch afile
$ set -C
$ echo something > afile
-bash: afile: cannot overwrite existing file
$ echo something >| afile
$

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster