¿Cómo hacer que los scripts de bash impriman cada comando antes de que se ejecute?
88
Por ejemplo, tengo un archivo bash simple
#!/bin/bash
cd ~/hello
ls
¿Cómo puedo hacer que muestre cada comando antes de ejecutarlo? Justo el efecto opuesto de "@echo off" en las secuencias de comandos por lotes de Windows.
Para aquellos que buscan cuáles son las setopciones, puede encontrarlas en esta página de manual .
mkobit
Simplemente puede extender shebang así#!/bin/bash -x
sobi3ch
Respuestas:
110
bash -x script
o
set-x
en el guion
Puede deshabilitar la opción nuevamente con set +x. Si solo desea hacerlo para algunos comandos, puede usar una subshell: `(set -x; command1; command; ...;)
Siempre he usado esto con gran efecto. La salida se ve un poco más sucia de lo que cabría esperar.
Scott Pack
2
Al configurar PS4puede ajustar la solicitud de -x. Por ejemplo: PS4='Line $LINENO @ $(date +%s.%N): ' bash -x script( dateaunque lo ralentizará)
Walter Tross
23
Estos también funcionan:
set-v
o
#!/bin/bash -v
Pero -v no imprime la cadena PS4 antes de cada línea de script y no rastrea los pasos de una declaración "for" (por ejemplo) individualmente. Hace eco de los comentarios, mientras que -x no.
Aquí hay un ejemplo de la salida usando -v:
#!/bin/bash -v# this is a commentfor i in{1..4}do
echo -n $idone1234echo
echo hello
hello
Aquí está el resultado del mismo script con -x:
+for i in'{1..4}'+ echo -n 11+for i in'{1..4}'+ echo -n 22+for i in'{1..4}'+ echo -n 33+for i in'{1..4}'+ echo -n 44+ echo+ echo hello
hello
Tenga en cuenta que incluí "echo -n" para agregar énfasis a las diferencias entre -v y -x. Además, -v es lo mismo que "-o detallado", pero este último parece no funcionar como parte de un shebang.
set -o xtracey set +o xtraceson tus amigos (es más detallado que -o verbose, y el resultado va a STDERR, en lugar de detallado, que parece iniciar sesión en STDOUT).
La inclusión set -xen el script en sí habilitará la funcionalidad mientras set +xque la deshabilitará. Ambos métodos también funcionarán con el sh shell más portátil.
Si no recuerdo mal, Perl también tiene la opción -x.
set
opciones, puede encontrarlas en esta página de manual .#!/bin/bash -x
Respuestas:
o
en el guion
Puede deshabilitar la opción nuevamente con
set +x
. Si solo desea hacerlo para algunos comandos, puede usar una subshell: `(set -x; command1; command; ...;)fuente
PS4
puede ajustar la solicitud de-x
. Por ejemplo:PS4='Line $LINENO @ $(date +%s.%N): ' bash -x script
(date
aunque lo ralentizará)Estos también funcionan:
o
Pero -v no imprime la cadena PS4 antes de cada línea de script y no rastrea los pasos de una declaración "for" (por ejemplo) individualmente. Hace eco de los comentarios, mientras que -x no.
Aquí hay un ejemplo de la salida usando -v:
Aquí está el resultado del mismo script con -x:
Tenga en cuenta que incluí "echo -n" para agregar énfasis a las diferencias entre -v y -x. Además, -v es lo mismo que "-o detallado", pero este último parece no funcionar como parte de un shebang.
fuente
Esto también debería funcionar:
fuente
Esto debería funcionar:
fuente
set -o xtrace
yset +o xtrace
son tus amigos (es más detallado que-o verbose
, y el resultado va a STDERR, en lugar de detallado, que parece iniciar sesión en STDOUT).Ver más consejos aquí
fuente
Hay algunas maneras.
como la línea shebang.
La inclusión
set -x
en el script en sí habilitará la funcionalidad mientrasset +x
que la deshabilitará. Ambos métodos también funcionarán con el sh shell más portátil.Si no recuerdo mal, Perl también tiene la opción -x.
fuente
va como
idioma = python, perl, bash -x = script de operador = nombre de archivo
Espero eso ayude.
fuente
-x
no tiene nada que ver con hacer eco en Python#! /bin/bash -x
hace lo que quieresfuente