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 -xte 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 verboseoset -v(solo "detallado") oset -o xtraceoset -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 +xsalida 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" bazycp 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:qmodificador:exe() { echo '$' "${@:q}" ; "$@" ; }evalde 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 -xyset +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 +xcomando 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 +xsalida.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
./myScriptybash 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
-xopción .Esto hará eco de todos los comandos.
También puede guardar la opción -x en el script . Simplemente especifique la
-xopción en el shebang.fuente
bash -vxhará lo mismo pero sin la interpolación de variablesPara zsh, echo
Y para depurar,
fuente
Para
cshytcsh, puedeset verboseoset echo(o incluso puede configurar ambos, pero puede resultar en alguna duplicación la mayor parte del tiempo).La
verboseopción imprime más o menos la expresión de shell exacta que escribe.La
echoopció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 variablesverbose 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
evalmás laexefunció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