Intelligente Lösungen
in neuer Dimension

Linux - Shell: Debugging deaktivieren ohne Ausgabe von '+ set +x'

Gelegentlich möchte ich ein einem Shell-Skript für definierte Bereiche die ausgeführten Kommandos protokollieren. Das aktiviere ich mit set -x. Am Ende des Bereichs deaktiviere ich die Protokollierung mit set +x. Leider wird dabei genau dieser Deaktivierungsbefehl auch protokolliert. Das gefällt mir nicht und nachfolgend gibt es Lösungen!

Problem

Hier ein Shell-Skript mit einigen protokollierten Kommandos:

1
2
3
4
5
6
7
echo "Uli's Skript"
set -x
sleep 2
TNOW="$(date +%s)"
sleep 2
set +x
echo "Skript-Ende: ${TNOW}"

Wenn ich dieses Skript ausführe, dann gibt es nachfolgende Ausgaben:

1
2
3
4
5
6
7
Uli's Skript
++ sleep 2
+++ date +%s
++ TNOW=1670153534
++ sleep 2
++ set +x
Skript-Ende: 1670153534

Mich stört die Zeile mit “set +x”.

Subshell

Eien Möglichkeit ist die Aktivierung der Protokollierung in einer Subshell:

1
2
3
4
5
6
7
8
echo "Uli's Skript"
(
  set -x
  sleep 2
  TNOW="$(date +%s)"
  sleep 2
)
echo "Skript-Ende: ${TNOW}"

Ausgaben:

1
2
3
4
5
6
Uli's Skript
++ sleep 2
+++ date +%s
++ TNOW=1670153581
++ sleep 2
Skript-Ende:

Probleme/Nachteile:

  • Etwas weniger effizient wegen Subshell
  • “Probleme” mit Variablen

Umlenkung

Eine andere Möglichkeit ist die Umlenkung der Fehlerausgabe von set +x:

1
2
3
4
5
6
7
echo "Uli's Skript"
set -x
sleep 2
TNOW="$(date +%s)"
sleep 2
{ set +x; } 2>/dev/null
echo "Skript-Ende: ${TNOW}"

Ausgabe:

1
2
3
4
5
6
Uli's Skript
++ sleep 2
+++ date +%s
++ TNOW=1670153752
++ sleep 2
Skript-Ende: 1670153752

Problem/Nachteil: Die Umlenkung sieht etwas komplizierter aus! Konkret:

  • Dies geht nicht: set -x 2>/dev/null
  • Dies funktoniert: { set -x; } 2>/dev/null

Historie

  • 2022-12-04: Erste Version