Mit bash
4.1 und höher ist dies möglich
BASH_XTRACEFD=7 ./script.bash 7> /dev/null
(Funktioniert auch, wenn bash
aufgerufen wird als sh
).
Grundsätzlich empfehlen wir, bash
die xtrace
Ausgabe 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, bash
oder 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 bash
Skript 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 xtrace
mit eingeschaltet wird set -x
(im Gegensatz zu #! /bin/bash -x
oder set -o xtrace
) wäre neu zu definieren set
als eine exportierte Funktion , die nichts tut , wenn übergeben -x
(obwohl das das Skript brechen würde , wenn er (oder irgendein anderes bash
Skript sie aufruft) verwendet , um set
die 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_ENV
Datei, die set +x
vor 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 -x
in 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 $0
Besonderes 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 $0
mit dem Pfad des Skripts ...
./script 2>some_file