¿Qué hace `set -x`?
Tengo un script de shell con la siguiente línea:
[ "$DEBUG" == 'true' ] && set -x
set -x
habilita un modo del shell donde todos los comandos ejecutados se imprimen en la terminal. En su caso, se usa claramente para depurar, que es un caso de uso típico para set -x
: imprimir cada comando a medida que se ejecuta puede ayudarlo a visualizar el flujo de control del script si no funciona como se esperaba.
set +x
lo desactiva.
$(conjunto -x)
Imprime un rastro de comandos simples, para comandos, comandos de mayúsculas y minúsculas, comandos de selección y aritmética para comandos y sus argumentos o listas de palabras asociadas después de expandirlos y antes de ejecutarlos. El valor de la variable PS4 se expande y el valor resultante se imprime antes del comando y sus argumentos expandidos.
[ fuente ]
Ejemplo
set -x
echo $(expr 10 + 20)
+ expr 10 + 20
+ echo 30
30
set +x
echo $(expr 10 + 20)
30
El ejemplo anterior ilustra el uso de set -x
. Cuando se utiliza, la expresión aritmética anterior se ha ampliado. Pudimos ver cómo se ha evaluado paso a paso una sola línea.
- El primer paso
expr
ha sido evaluado. - El segundo paso
echo
ha sido evaluado.
Para saber más sobre set → visita este enlace
cuando se trata de tu script de shell,
[ "$DEBUG" == 'true' ] && set -x
Es posible que su secuencia de comandos haya estado imprimiendo algunas líneas adicionales de información cuando el modo de ejecución se seleccionó como DEBUG
. Tradicionalmente, la gente solía habilitar el modo de depuración cuando se llamaba un script con un argumento opcional como-d
-u: deshabilitado por defecto. Cuando se activa, se muestra un mensaje de error cuando se utiliza una variable no configurada.
-v: inactivo por defecto. Después de la activación, se mostrará el contenido original de la información (sin resolución variable) antes de que se emita la información.
-x: inactivo por defecto. Si está activado, el contenido del comando se mostrará antes de ejecutarlo (después de la resolución variable, hay un símbolo ++).
Compara las siguientes diferencias:
/ # set -v && echo $HOME
/root
/ # set +v && echo $HOME
set +v && echo $HOME
/root
/ # set -x && echo $HOME
+ echo /root
/root
/ # set +x && echo $HOME
+ set +x
/root
/ # set -u && echo $NOSET
/bin/sh: NOSET: parameter not set
/ # set +u && echo $NOSET