Beim Verlassen eines bestimmten Verzeichnisses Code in einem Abmeldeskript ausführen?

Beim Verlassen eines bestimmten Verzeichnisses Code in einem Abmeldeskript ausführen?

Ich habe Konten auf mehreren verschiedenen Rechnern, um einige Bibliotheken zu testen, zu denen ich beitrage. Einige der Rechner gehören anderen (wie die GCC-Kompilierungsfarm) und ich möchte sie sauber halten.

Ich möchte ein Skript einrichten , das Folgendes .bash_logoutausführt:make cleanexit WennIch befinde mich in einem bestimmten Verzeichnis. Die Verzeichnisanforderung fällt bei mehreren SSH-Sitzungen weg. Wenn ich in einer Sitzung baue/teste, möchte ich keine separate Sitzungsabmeldung, die die Artefakte bereinigt. Das heißt, exitfrom $HOME/libfooführt eine Bereinigung durch, exitfrom hingegen $HOMEnicht.

Ich verstehe die Grundlagen, aber mir ist nicht klar, wie robust das ist:

# $HOME/.bash_logout

if [ "$PWD" = "$HOME/libfoo" ]; then
    make clean 1>/dev/null 2>&1
fi

Gibt es Probleme bei der Nutzung $PWDwährend der Abmeldung? Gibt es noch andere Probleme, die ich möglicherweise übersehen habe?

Antwort1

Ist es Ihre Absicht, das Skript nur beim Abmelden auszuführen?
Von man bash:

Wenn eine Login-Shell beendet wird, liest und führt bash Befehle aus der Datei ~/.bash_logout aus, sofern diese vorhanden ist.

Nur beim Beenden einer Bash-Anmeldeshell.


Wenn Sie beim Schließen jeder Shell ein Skript ausführen möchten, verwenden Sie Trap (siehe man bash):

trap /u1/myuser/on_exit_script.sh EXIT

Fügen Sie es zu .bashrc oder einer anderen für Sie geeigneten Datei hinzu.


Da das Skript beim Beenden ausgeführt wird, ist außerdem $PWD das beim Beenden aktive, was dasselbe sein kann, wie beim Starten der Shell, aber nicht muss. Wenn Sie etwas mit $PWD tun müssen, das beim Beenden verwendet wurde, dann ist dieser Test in der Tat hilfreich:

if [ "$PWD" = "$HOME/libfoo" ]; then

Sollte arbeiten.

Antwort2

Viele meiner Shell-Skripte sind portabel und Shell-agnostisch, daher bevorzuge ich das Abfangen von EXIT gegenüber der Verwendung der bash-spezifischen .bash_logout-Methode. Und für eine wirklich in sich geschlossene Lösung ist es am besten, .bash_logout weder ändern noch erstellen zu müssen und sich auch nicht auf ein separates Skript zu verlassen, das beim Beenden ausgeführt wird. Und noch viel schlimmer wäre es natürlich, zu ändern oder zu überschreiben, was der „exit“-Befehl selbst auf dem System macht – die Lösung sollte niemanden sonst betreffen!

Um die Auswirkungen auf fremde Systeme so gering wie möglich zu halten, lege ich am liebsten ein benutzerdefiniertes Anmeldeprofil an, wenn ich mit der Arbeit an einem System beginne, und lasse dasselbe Profil sich selbst und alle Hilfsskripte oder Konfigurationsdateien, die es erstellt, bereinigen. Dann lade ich dieses Profil als Quelle (mit „.“ was auch unter ksh funktioniert), wodurch alle meine Aliase usw. eingerichtet werden – aber ich möchte nicht, dass es noch da ist, wenn ich fertig bin.

Daher erstelle ich im Skript selbst eine Shell-Funktion „bye“, die die besagte Bereinigung durchführt, und registriere sie für die automatische Bereinigung beim Abmelden, sei es absichtlich oder durch einfaches Trennen der Verbindung, über:

trap bye EXIT

Damit stelle ich sicher, dass ich keine hässlichen Spuren meiner Arbeit hinterlasse. Welche Bereinigungsmaßnahmen es konkret durchführen soll, bleibt Ihnen überlassen, das verzeichnisspezifische "make clean" ist nur eine von vielen Möglichkeiten. Und sobald der Logout auf welche Weise auch immer erfolgt ist, sind alle Spuren des Profils, sogar die Bereinigungsfunktion, verschwunden.

Sie können noch einen Schritt weiter gehen – vielleicht gibt es verschiedene Systemtypen, auf denen Sie unterschiedliche Bereinigungsarten durchführen möchten, oder auf manchen Systemen möchten Sie diese Art der Bereinigung überhaupt nicht durchführen. Sie könnten Schalter in die Shell-Funktion „bye“ einbauen oder verschiedene Schalter „bye1“, „bye2“ erstellen und den gewünschten Schalter basierend auf einem Test registrieren, z. B. der Existenz einer Datei. Auf diese Weise verhindere ich die Löschung meines benutzerdefinierten Profils auf Systemen, die ich längerfristig verwende und auf denen ich dasselbe Profil behalten möchte.

Antwort3

Ich bin nicht sicher, wie man das über ein bash_logout macht, aber Sie könnten ein kleines Skript namens exit schreiben, das Sie in /usr/local/bin/ mit der Art von Code ablegen, den Sie in Ihrer Frage eingegeben haben, sodass, wenn Sie exit in Ihrer Konsole eingeben, es das Gewünschte tut, wenn Sie sich in dem angegebenen Verzeichnis befinden.

verwandte Informationen