Bash-„Skript“-Befehl in Bash-Dateien?

Bash-„Skript“-Befehl in Bash-Dateien?

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.txtan den Anfang der myscriptDatei 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.txtan den Anfang der myscriptDatei 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 myscriptist script ~/script.txtnur ein Befehl, der eine externe ausführbare Datei ausführt. Die ausführbare Datei ist scriptin diesem Fall .

Wenn die ausführbare Datei sleep, taroder 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 scriptist es nicht anders: Die Shell wartet, bis scriptbeendet ist.

scriptist für die interaktive Verwendung vorgesehen. script ~/script.txtfü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 myscriptes in einem Terminalemulator ausgeführt wird, der ein Fenster anzeigt. Wenn ja, dann scripthaben Sie (mit ) wahrscheinlich gesehen, dass diese innere Shell von gestartet wurde, scriptund konnten mit ihr interagieren, während die äußere Shell wartete. scriptprotokolliert, was Sie in der inneren Shell tun. Das Verlassen der inneren Shell beendet sie scriptund 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, scriptdass ein interner Aufruf myscriptIhnen beim Debuggen nicht helfen kann myscript, selbst wenn die äußere Shell fortgesetzt wird.

Es gibt mindestens zwei Methoden zum Debuggen myscript:

  1. Leitet stderr des Skripts in eine Logdatei um. Dies kann innerhalb des Skripts erfolgen mit

    # just after shebang
    exec 2>/path/to/logfile
    

    Wenn myscripteine 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 myscriptsie ohne Terminal ausgeführt wird.

  2. 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 Datei myscriptgeschieht ; berücksichtigen Sie dies.exitkillexecbash

    Wenn aus irgendeinem Grund das interaktive Programm, bashdas vom Skript gestartet wird, das Terminal löscht oder etwas Ähnliches, verwenden Sie sleep 3600stattdessen. 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, myscriptdamit die Shell, die es interpretiert, Befehle und ihre Argumente ausgibt, während sie ausgeführt werden. Dies sollte Ihnen nützliche Einblicke geben.

verwandte Informationen