¿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.

Epeius
fuente
1
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; ...;)

Steven Parkes
fuente
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 comment
for i in {1..4}
do
    echo -n $i
done
1234echo

echo hello
hello

Aquí está el resultado del mismo script con -x:

+ for i in '{1..4}'
+ echo -n 1
1+ for i in '{1..4}'
+ echo -n 2
2+ for i in '{1..4}'
+ echo -n 3
3+ for i in '{1..4}'
+ echo -n 4
4+ 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.

Dennis Williamson
fuente
¡Gran explicación! sin hacer ninguna investigación, me parece que Verbose y eXplicit son lo que representan esas dos letras.
Ape-inago
Creo que -x está más cerca de eXecute.
Steven Parkes
10

Esto también debería funcionar:

#!/bin/bash -x
cd ~/hello
ls
tomoe
fuente
6

Esto debería funcionar:

set -o verbose #echo on
...
set +o verbose #echo off
splattne
fuente
4

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).

Ver más consejos aquí

pihentagy
fuente
3

Hay algunas maneras.

#!/usr/bin/env bash -x

como la línea shebang.

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.

usuario6784
fuente
1

va como

language -x script

idioma = python, perl, bash -x = script de operador = nombre de archivo

Espero eso ayude.

debuggerpk
fuente
3
-xno tiene nada que ver con hacer eco en Python
Eugene Pankov
0

#! /bin/bash -x hace lo que quieres

Rory
fuente