¿Qué hace `set -x`?

261

Tengo un script de shell con la siguiente línea:

[ "$DEBUG" == 'true' ] && set -x
Viejo
fuente
15
Echa un vistazo:help -m set | less
Cyrus
44
Gracias por el help -m setdato. Eso funciona. Intenté man setantes de preguntar, sin embargo, en Ubuntu hayNo manual entry for set
Ole
2
@Ole, setestá integrado en bash, así que si puedes man bashencontrarlo en la sección SHELL BUILTIN COMMANDS. Al ver la página del manual es probable que pueda saltar a él mediante la búsqueda de esta expresión regular: \bset \[.
Usuario5910

Respuestas:

365

set -xhabilita un modo de shell donde todos los comandos ejecutados se imprimen en el terminal. En su caso, se usa claramente para la depuración, 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 deshabilita

John Zwinck
fuente
55
¿Cómo deshabilitar esa característica nuevamente?
feedc0de
85
@DanielBrunner: lo set +xdeshabilita.
John Zwinck
2
¡Esto es MUY útil! Desearía que alguien me lo hubiera dicho antes. ¿Hay otros trucos interesantes como este que puedan aumentar nuestra meta-habilidad en el script?
Estudiante
77
@ Estudiante: set -een la parte superior de su secuencia de comandos hará que la secuencia de comandos salga con un error cada vez que se produce un error (y no se maneja explícitamente). Me parece inmensamente preferible al valor predeterminado, que es seguir adelante de todas formas (como el infame de Visual Basic On Error Resume Next).
John Zwinck
1
@JohnZwinck, desafortunadamente, set -etiene efectos secundarios muy indeseables, hasta el punto de que hace que la revisión del código sea casi imposible (porque el comportamiento de una línea determinada depende de lo que está en la pila de llamadas; si una función se llama en un contexto "verificado", set -eestá deshabilitada para esa invocación y todo lo que a su vez llama). Vea los ejercicios en BashFAQ # 105 .
Charles Duffy
78

set -x

Imprime una traza de comandos simples, para comandos, comandos de caso, comandos de selección y aritmética para comandos y sus argumentos o listas de palabras asociadas después de que se expanden y antes de que se ejecuten. 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 usa, la expresión aritmética anterior se ha expandido. Podríamos ver cómo se evaluó una sola línea paso a paso.

  • El primer paso exprha sido evaluado.
  • El segundo paso echoha sido evaluado.

Para saber más sobre set → visite este enlace

cuando se trata de su script de shell,

[ "$DEBUG" == 'true' ] && set -x

Es posible que su script haya estado imprimiendo algunas líneas de información adicionales cuando el modo de ejecución se seleccionó como DEBUG. Tradicionalmente, las personas solían habilitar el modo de depuración cuando se llamaba un script con argumento opcional como-d

Raju
fuente
6

-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 envíe la información.

-x: inactivo por defecto. Si está activado, el contenido del comando se mostrará antes de que se ejecute el comando (después de la resolución variable, hay un símbolo ++).

Compare 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
lupguo
fuente