Mit bash4.1 und höher ist dies möglich
BASH_XTRACEFD=7 ./script.bash 7> /dev/null
(Funktioniert auch, wenn bashaufgerufen wird als sh).
Grundsätzlich empfehlen wir, bashdie xtraceAusgabe auf Dateideskriptor 7 anstatt auf Standard 2 auszugeben und diesen Dateideskriptor auf umzuleiten /dev/null. Die fd Nummer ist beliebig. Verwenden Sie ein FD über 2, das in Ihrem Skript nicht anders verwendet wird. Wenn die Shell, in der Sie diesen Befehl eingeben, bashoder ist yash, können Sie sogar eine Zahl über 9 verwenden (obwohl Probleme auftreten können, wenn der Dateideskriptor intern von der Shell verwendet wird).
Wenn die Shell, von der aus Sie das bashSkript aufrufen, ist zsh, können Sie auch Folgendes tun:
(export BASH_XTRACEFD; ./script.bash {BASH_XTRACEFD}> /dev/null)
für die Variable wird automatisch das erste freie fd über 9 vergeben.
Für ältere Versionen bash, eine andere Option, wenn die xtracemit eingeschaltet wird set -x(im Gegensatz zu #! /bin/bash -xoder set -o xtrace) wäre neu zu definieren setals eine exportierte Funktion , die nichts tut , wenn übergeben -x(obwohl das das Skript brechen würde , wenn er (oder irgendein anderes bashSkript sie aufruft) verwendet , um setdie Positionsparameter einzustellen).
Mögen:
set()
case $1 in
(-x) return 0;;
(-[!-]|"") builtin set "$@";;
(*) echo >&2 That was a bad idea, try something else; builtin set "$@";;
esac
export -f set
./script.bash
Eine andere Option ist das Hinzufügen eines DEBUG-Traps in einer $BASH_ENVDatei, die set +xvor jedem Befehl ausgeführt wird.
echo 'trap "{ set +x; } 2>/dev/null" DEBUG' > ~/.no-xtrace
BASH_ENV=~/.no-xtrace ./script.bash
Das geht aber nicht, wenn set -xin einer Sub-Shell gearbeitet wird.
Wie @ilkkachu sagte, sollten Sie, vorausgesetzt, Sie haben Schreibberechtigung für einen Ordner im Dateisystem, zumindest in der Lage sein, eine Kopie des Skripts zu erstellen und es zu bearbeiten.
Wenn Sie nirgendwo eine Kopie des Skripts schreiben können oder wenn es nicht bequem ist, bei jeder Aktualisierung des Originalskripts eine neue Kopie zu erstellen und zu bearbeiten, können Sie möglicherweise folgende Aktionen ausführen:
bash <(sed 's/set -x/set +x/g' ./script.bash)
Dies (und der Kopieransatz) funktioniert möglicherweise nicht richtig, wenn das Skript etwas $0Besonderes mit oder spezielle Variablen ausführt $BASH_SOURCE(z. B. nach Dateien suchen, die sich auf den Speicherort des Skripts selbst beziehen), sodass Sie möglicherweise noch etwas nachbearbeiten müssen Ersetzen Sie $0mit dem Pfad des Skripts ...
./script 2>some_file