¿Alguien sabe si podemos decir set +x
en bash sin que se imprima:
set -x
command
set +x
huellas
+ command
+ set +x
pero solo debería imprimir
+ command
Bash es la versión 4.1.10 (4). Esto me está molestando desde hace algún tiempo: la salida está llena de set +x
líneas inútiles , lo que hace que la función de rastreo no sea tan útil como podría ser.
script.sh 2>&1 | grep -v 'set +x'
Respuestas:
Tuve el mismo problema y pude encontrar una solución que no usa una subcapa:
fuente
set +x
es un comando tan exitosocommand
, esta variación es una solución:{ STATUS=$?; set +x; } 2>/dev/null
. Luego, inspeccione$STATUS
en las siguientes líneas a su gusto.{ set +x; } 2>&-
. Eso cierra fd 2 directamente en lugar de hacerlo apuntar a / dev / null. Algunos programas no se manejan tan bien cuando intentan imprimir en stderr, por lo que / dev / null es de buen estilo en general; pero elset -x
trazado del caparazón lo maneja bien, por lo que funciona perfectamente aquí, y hace que este encantamiento sea un poco más corto.Puede utilizar una subshell. Al salir de la subcapa,
x
se perderá la configuración de :fuente
( set -x \n command \n )
es peor queset -x \n command \n set +x
.cd
: no cambia el directorio actual en el shell padre.Hackeé una solución a esto recientemente cuando me molesté:
Esto le permite habilitar y deshabilitar xtrace como se muestra a continuación, donde estoy registrando cómo se asignan los argumentos a las variables:
Y obtienes una salida que se parece a:
fuente
/dev/stdin
pieza). La advertencia es que activar la expansión de alias en los scripts puede tener efectos secundarios no deseados./dev/stdin
. No tengo conocimiento de ningún efecto secundario específico, ya que el entorno no interactivo no debería cargar ningún archivo que defina alias. ¿Qué efectos secundarios puede haber?set +x
es mucho más difícil (si no imposible) comprometer. Pero sigue siendo una solución buena y directa, probablemente la mejor hasta ahora.¿Qué tal una solución basada en una versión simplificada de @ user108471:
fuente
function () { set_plus_x='{ set +x; } 2>/dev/null' }
Esta es una combinación de algunas ideas que pueden incluir un bloque de código y preservar el estado de salida.
Cuando se ejecuta:
fuente
()
vueltaexit
no es necesaria. Okay. Tal vez eso es paranoico, pero si este código se utiliza en general tiene una buena vía de ataque: redefinirtrace_on
ytrace_off
e inyectar código que lee los comandos ejecutados. Si usa tales "utilidades" solo es instructivo, pero si el código se usa con otros, debe considerar si los beneficios de tales funciones no estandarizadas superan las desventajas. Personalmente, me he conformado con{ set +x; } 2>/dev/null
esta construcción que se entiende comúnmente y tampoco cambia el estado de salida.