En un script de shell, ¿cómo hago eco de todos los comandos de shell llamados y expando los nombres de variables?
Por ejemplo, dada la siguiente línea:
ls $DIRNAME
Me gustaría que el script ejecute el comando y muestre lo siguiente
ls /full/path/to/some/dir
El propósito es guardar un registro de todos los comandos de shell llamados y sus argumentos. ¿Existe tal vez una mejor manera de generar tal registro?
set -x
te dará lo que quieresAquí hay un ejemplo de script de shell para demostrar:
Esto expande todas las variables e imprime los comandos completos antes de la salida del comando.
Salida:
fuente
set -o verbose
oset -v
(solo "detallado") oset -o xtrace
oset -x
(solo "xtrace") oset -xv
(ambos) oset -o xtrace -o verbose
(ambos).Yo uso una función para hacer eco y ejecutar el comando:
Que salidas
Para tuberías de comandos más complicadas, etc., puede usar eval:
Que salidas
fuente
++ set +x
salida cuando se apaga, además de verse más limpia. Sin embargo, solo para una o dos afirmaciones, la respuesta de Bhassel usando un subshell es la más conveniente.set +x
, afecta a todos los comandos, ¡lo cual es demasiado!cp "foo bar" baz
ycp foo "bar baz"
, por ejemplo. Por lo tanto, es bueno para mostrar información de progreso a un usuario; menos para depurar resultados o grabar comandos reproducibles. Diferentes casos de uso. Enzsh
, puede conservar las citas con el:q
modificador:exe() { echo '$' "${@:q}" ; "$@" ; }
eval
de su comando. ¡Así que no esperes que funcione correctamenteexe eval "echo 'eval world'"
!También puede alternar esto para seleccionar líneas en su secuencia de comandos envolviéndolas
set -x
yset +x
, por ejemplo,fuente
La respuesta de shuckc para hacer eco de las líneas de selección tiene algunas desventajas: terminas haciendo que se repita también el siguiente
set +x
comando y pierdes la capacidad de probar el código de salida,$?
ya que se sobrescribe con elset +x
.Otra opción es ejecutar el comando en una subshell:
que le dará salida como:
Sin embargo, esto conlleva la sobrecarga de crear una nueva subshell para el comando.
fuente
++ set +x
salida.if [ $? -eq 0 ]
conif (set -x; COMMAND)
.Otra opción es poner "-x" en la parte superior de su script en lugar de en la línea de comando:
fuente
./myScript
ybash myScript
. Todavía es algo bueno señalar, gracias.De acuerdo con la Guía Bash de TLDP para principiantes: Capítulo 2. Escritura y depuración de scripts :
fuente
Escriba "bash -x" en la línea de comando antes del nombre del script Bash. Por ejemplo, para ejecutar foo.sh, escriba:
fuente
Puede ejecutar un script Bash en modo de depuración con la
-x
opción .Esto hará eco de todos los comandos.
También puede guardar la opción -x en el script . Simplemente especifique la
-x
opción en el shebang.fuente
bash -vx
hará lo mismo pero sin la interpolación de variablesPara zsh, echo
Y para depurar,
fuente
Para
csh
ytcsh
, puedeset verbose
oset echo
(o incluso puede configurar ambos, pero puede resultar en alguna duplicación la mayor parte del tiempo).La
verbose
opción imprime más o menos la expresión de shell exacta que escribe.La
echo
opción es más indicativa de lo que se ejecutará durante el desove.http://www.tcsh.org/tcsh.html/Special_shell_variables.html#verbose
http://www.tcsh.org/tcsh.html/Special_shell_variables.html#echo
Special shell variables
verbose If set, causes the words of each command to be printed, after history substitution (if any). Set by the -v command line option.
echo If set, each command with its arguments is echoed just before it is executed. For non-builtin commands all expansions occur before echoing. Builtin commands are echoed before command and filename substitution, because these substitutions are then done selectively. Set by the -x command line option.
fuente
La salida es la siguiente:
fuente
Para permitir que los comandos compuestos se repitan, utilizo
eval
más laexe
función de Soth para hacer eco y ejecutar el comando. Esto es útil para los comandos canalizados que de otro modo solo mostrarían ninguno o solo la parte inicial del comando canalizado.Sin eval:
Salidas:
Con eval:
Que salidas
fuente