Resumen
El comando `set` permite ajustar finamente el entorno de ejecución de los scripts del shell. Proporciona varias funciones, como detener el script en caso de error, evitar el uso de variables no definidas y rastrear la ejecución de comandos.
Funciones principales
- Establecer y desestablecer opciones del shell
- Establecer parámetros posicionales
- Soporte para depuración de scripts
Opciones principales
El comando `set` ofrece varias opciones de un solo carácter y opciones con nombres largos a través de la opción `-o`. A continuación se presentan algunas de las opciones de uso frecuente.
Opciones de control de script
Opciones -o (nombres largos)
Comando generado:
Combina los comandos.
Descripción:
`set` Ejecutando el comando.
Combina las opciones anteriores para ejecutar virtualmente los comandos junto con la IA.
Ejemplos de uso
Terminar el script inmediatamente en caso de error
#!/bin/bash
set -e
echo "Inicio"
false # Este comando devuelve un código de salida distinto de cero.
echo "Este mensaje no se imprimirá."
Configura el script para que termine inmediatamente si ocurre un error.
Generar un error al usar una variable no definida
#!/bin/bash
set -u
echo "Inicio"
echo "$UNDEFINED_VAR" # Esta variable no está definida, por lo que se producirá un error.
Hace que el script termine cuando se intenta usar una variable no inicializada.
Rastreo de ejecución de comandos (depuración)
#!/bin/bash
set -x
VAR="Hola"
echo "$VAR Mundo"
ls -l /tmp
Imprime todos los comandos que ejecuta el script, lo que ayuda a la depuración.
Detección de errores en canalizaciones
#!/bin/bash
set -o pipefail
echo "Inicio"
false | echo "Este mensaje se imprimirá, pero el script se considerará fallido."
# Si se usa junto con set -e, el script terminará en false.
Hace que toda la canalización se considere fallida si un comando intermedio falla.
Combinación potente de uso frecuente
set -euo pipefail
Una combinación recomendada para escribir scripts de shell estables.
Verificar las opciones actuales del shell
set -o
Verifica el estado de todas las opciones configuradas en el shell actual.
Establecer parámetros posicionales
set -- "manzana" "banana" "cereza"
echo "Primer parámetro: $1"
echo "Todos los parámetros: $@"
Puede usar `set --` para establecer manualmente los parámetros posicionales ($1, $2, etc.) de un script. Esto es útil para pruebas o en situaciones específicas.
Consejos y precauciones
El comando `set` puede mejorar significativamente la robustez de los scripts del shell, pero se debe usar con precaución.
Combinación recomendada
Se recomienda encarecidamente añadir la combinación `set -euo pipefail` al principio de la mayoría de los scripts del shell para mejorar la estabilidad.
- set -e: Termina inmediatamente en caso de error para prevenir comportamientos inesperados.
- set -u: Detecta errores potenciales causados por el uso de variables no definidas de forma temprana.
- set -o pipefail: Detecta fallos en comandos intermedios dentro de una canalización para determinar con precisión el éxito o fracaso de toda la canalización.
Desactivar opciones
Puede desactivar opciones específicas usando `+`, como `set +e` o `set +u`. Esto es útil cuando necesita cambiar temporalmente el comportamiento de una opción solo en una parte específica del script. Por ejemplo, si un comando específico falla pero desea que el script continúe ejecutándose, puede usar `set +e` y luego restaurarlo a `set -e` una vez que la tarea haya finalizado.
Uso en depuración
`set -x` es muy útil para la depuración, ya que muestra detalladamente el proceso de ejecución del script. Se recomienda añadirlo al principio del script y eliminarlo o comentarlo una vez finalizada la depuración. `set -v` imprime las líneas de entrada tal cual, lo que ayuda a comprender el flujo del script.
Parámetros posicionales y `--`
`set --` establece todos los argumentos siguientes como parámetros posicionales ($1, $2, etc.) y evita que estos argumentos se interpreten como opciones, incluso si comienzan con `-`. Esto es particularmente importante cuando se redefine `$@` o `$*` dentro de un script.