En bash, cuando se ejecuta con la -x
opción, ¿es posible eximir los comandos individuales del eco?
Estoy tratando de hacer que la salida sea lo más ordenada posible, por lo que estoy ejecutando ciertas partes de mi script en una subshell con set +x
. Sin embargo, la fila en set +x
sí todavía se repite y no agrega información valiosa a la salida.
Recuerdo que en los viejos .bat
tiempos, cuando corría con echo on
, las líneas individuales podían estar exentas al comenzar con un @
. ¿Hay algún equivalente en bash?
#!/bin/bash -x
function i_know_what_this_does() {
(
set +x
echo do stuff
)
}
echo the next-next line still echoes 'set +x', is that avoidable?
i_know_what_this_does
echo and we are back and echoing is back on
Al ejecutar lo anterior, la salida es:
+ echo the next-next line still echoes 'set +x,' is that 'avoidable?'
the next-next line still echoes set +x, is that avoidable?
+ i_know_what_this_does
+ set +x
do stuff
+ echo and we are back and echoing is back on
and we are back and echoing is back on
La razón por la que
set +x
se imprime es queset -x
significa "imprima el comando que está a punto de ejecutar, con expansiones, antes de ejecutarlo . Por lo tanto, el shell no sabe que desea que no imprima cosas hasta que haya impreso la línea diciéndole que no imprimir cosas. Hasta donde sé, no hay forma de evitar que eso suceda.fuente
Aquí está la solución que has estado buscando:
El comando original se ejecuta en el mismo shell bajo una transformación de identidad. Justo antes de ejecutar, obtienes una xtrace no recursiva de los argumentos. Esto le permite rastrear los comandos que le interesan sin enviar spam a stederr con copias duplicadas de cada comando "echo".
fuente
perl
(y problemas con los comandos de varias líneas):+() { :;} 2> /dev/null; xtrace() { (PS4=; set -x; + "$@";{ set +x; } 2> /dev/null); "$@";}
set -x
maniobras me compran algo en comparación con soloprintf >&2 '+ %s\n' "$*"
?xtrace() { printf >&2 '+ %s\n' "$*"; "$@"; }