
Ich habe ein Bash-Skript, /usr/bin/local/myscript. Ich führe die Datei normalerweise von einer externen Software aus (in meinem Fall Autohotkey). Im Grunde meine ich damit, dass das Skript sofort beendet wird und das Fenster geschlossen wird, sodass ich keine Protokolle im Fenster, Infoprotokolle oder Fehlerprotokolle sehen kann. Ich möchte also die gesamten laufenden Schritte zum Debuggen „skripten“, wenn das Programm nicht richtig funktioniert. Aber einfach ein script ~/script.txt
an den Anfang der myscript
Datei zu setzen, hat nicht funktioniert, ich weiß nicht, was los ist, die nächsten Zeilen in der Datei wurden im Grunde nicht ausgeführt. Gibt es also eine (richtige) Möglichkeit, „Skript“ in Bash-Dateien zu verwenden, oder eine bessere Alternative zu „Skript“ dafür?
Antwort1
Aber einfach ein
script ~/script.txt
an den Anfang dermyscript
Datei zu setzen, hat nicht funktioniert. Ich weiß nicht, was los ist. Die nächsten Zeilen der Datei wurden grundsätzlich nicht ausgeführt.
Für eine Shell-Interpretation myscript
ist script ~/script.txt
nur ein Befehl, der eine externe ausführbare Datei ausführt. Die ausführbare Datei ist script
in diesem Fall .
Wenn die ausführbare Datei sleep
, tar
oder wäre ls
, würden Sie erwarten, dass die Shell wartet, bis die ausführbare Datei beendet ist, bevor sie den Rest von interpretiert myscript
. Bei script
ist es nicht anders: Die Shell wartet, bis script
beendet ist.
script
ist für die interaktive Verwendung vorgesehen. script ~/script.txt
führt eine interaktive Shell aus, die nicht die Shell ist, die interpretiert myscript
. Sie haben geschrieben „das Fenster schließt sich“ (wenn ohne script
), also nehme ich an, dass myscript
es in einem Terminalemulator ausgeführt wird, der ein Fenster anzeigt. Wenn ja, dann script
haben Sie (mit ) wahrscheinlich gesehen, dass diese innere Shell von gestartet wurde, script
und konnten mit ihr interagieren, während die äußere Shell wartete. script
protokolliert, was Sie in der inneren Shell tun. Das Verlassen der inneren Shell beendet sie script
und erst dann wird die äußere Shell (also myscript
) fortgesetzt. Aber vielleicht haben Sie den Terminalemulator geschlossen, die äußere Shell hat SIGHUP erhalten und wurde nie fortgesetzt.
Dies ist nicht wichtig, da jetzt klar sein sollte, script
dass ein interner Aufruf myscript
Ihnen beim Debuggen nicht helfen kann myscript
, selbst wenn die äußere Shell fortgesetzt wird.
Es gibt mindestens zwei Methoden zum Debuggen myscript
:
Leitet stderr des Skripts in eine Logdatei um. Dies kann innerhalb des Skripts erfolgen mit
# just after shebang exec 2>/path/to/logfile
Wenn
myscript
eine Ausgabe auf der Standardausgabe generiert wird, die wichtig ist und tatsächlich irgendwohin geht (über eine Pipe oder Umleitung), dann möchten Sie dies nicht unterbrechen. Wenn es jedoch normalerweise auf dem Terminal gedruckt wird und Sie dies auch protokollieren möchten, leiten Sie sowohl die Standardausgabe als auch die Standardausgabe in die Protokolldatei um:# just after shebang exec 2>/path/to/logfile 1>&2
Diese Methode funktioniert auch, wenn
myscript
sie ohne Terminal ausgeführt wird.Alternativ können Sie das Skript ganz am Ende eine interaktive Shell ausführen lassen (z. B.
bash
). Die neue Shell verhindert, dass das Fenster geschlossen wird, und Sie können sehen, was das Skript bisher auf dem Terminal ausgegeben hat. Dies erfordert offensichtlich ein Terminal. Beachten Sie, dass es nie die Zeile mit erreichen wird, wenn dies mit oder sich selbst oder einer anderen ausführbaren Dateimyscript
geschieht ; berücksichtigen Sie dies.exit
kill
exec
bash
Wenn aus irgendeinem Grund das interaktive Programm,
bash
das vom Skript gestartet wird, das Terminal löscht oder etwas Ähnliches, verwenden Siesleep 3600
stattdessen. Der Punkt ist, dass Sie nicht wirklich eine zusätzliche Shell benötigen, sondern einen beliebigen Prozess, der den Terminalemulator lange genug geöffnet hält, damit Sie die vorherige Ausgabe prüfen können.
Egal für welche Methode Sie sich entscheiden, platzieren Sie
set -x
früh, myscript
damit die Shell, die es interpretiert, Befehle und ihre Argumente ausgibt, während sie ausgeführt werden. Dies sollte Ihnen nützliche Einblicke geben.