¿Alguien sabe si podemos decir set +xen 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 +xlí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 +xes un comando tan exitosocommand, esta variación es una solución:{ STATUS=$?; set +x; } 2>/dev/null. Luego, inspeccione$STATUSen 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 -xtrazado 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,
xse 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/stdinpieza). 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 +xes 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
()vueltaexitno 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_onytrace_offe 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/nullesta construcción que se entiende comúnmente y tampoco cambia el estado de salida.