Erstellen Sie eine neue Bash-Shell aus einem .sh-Skript

Erstellen Sie eine neue Bash-Shell aus einem .sh-Skript

Als letzten Befehl meines decrypt.shSkripts wünsche ich mir, dass es im neu erstellten Ordner mit eine neue Shell erstellt unset HISTFILE.

An diesem Punkt sollte der Benutzer in der Lage sein, mit dieser neuen Shell zu interagieren.

In diesem Ordner befindet sich ein encrypt.shSkript, das der Benutzer ausführen kann. Als letzte Aktion muss er den Ordner löschen und diese Shell verlassen, sodass der Benutzer zur ursprünglichen Shell zurückkehrt.

Wie kann ich das erreichen?

Während eine Bash-Lösung für mich nützlich wäre, könnte eine generische Lösung für jemand anderen nützlich sein (aber vielleicht unmöglich?).

Antwort1

Das decrypt.shSkript:

#!/bin/bash

# Create working directory.
tmpdir=$(mktemp -d)

# Remove the temporary directory upon exiting
trap 'rm -r "$tmpdir"' EXIT

# Copy "encrypt.sh" from somewhere.
cp /somewhere/encrypt.sh "$tmpdir"

# Start an interactive shell in the directory with
# HISTFILE set to /dev/null
( cd "$tmpdir" && HISTFILE=/dev/null bash )

Das encrypt.shSkript:

#!/bin/bash

# When exiting, terminate the parent shell
trap 'kill -s HUP "$PPID"' EXIT

# rest of script goes here

Das decrypt.shSkript kümmert sich um das Einrichten und Löschen des Arbeitsverzeichnisses. Das Einrichten des Verzeichnisses umfasst das Erstellen des Verzeichnisses (mit wird mktemp -dein temporäres Verzeichnis erstellt) und das Kopieren des encrypt.shSkripts dorthin, wo sich das Original befindet. Das Löschen des Arbeitsverzeichnisses erfolgt, wenn das decrypt.shSkript beendet wird.

Das encrypt.shSkript beendet seine übergeordnete Shell, wenn es selbst beendet wird, indem es ihm das HUPSignal sendet, das das decrypt.shSkript auffordert, das Arbeitsverzeichnis zu entfernen. Das Verzeichnis wird auch gelöscht, wenn der Benutzer die interaktive Shell beendet, ohne auszuführen encrypt.sh.


Anstatt zu versuchen HISTFILE,/dev/nullnicht gesetztWenn Sie es in der erstellten interaktiven Shell verwenden, können Sie es einfach HOMEin das temporäre Verzeichnis setzen. Die Verlaufsdatei wird unter diesem Verzeichnis erstellt $HOMEund beim Beenden zusammen mit dem Verzeichnis gelöscht decrypt.sh:

( cd "$tmpdir" && HOME="$tmpdir" bash )

Beachten Sie, dass dies das Verhalten der Tilde-Erweiterung und von cdohne Argument sowie von allen anderen Elementen beeinflusst, die die HOMEVariable möglicherweise verwenden.

HISTFILEEine weniger invasive Variante besteht darin, die Variable explizit auf einen Dateinamen im temporären Verzeichnis festzulegen :

( cd "$tmpdir" && HISTFILE="$tmpdir/.bash_history" bash )

Etwas damit verwandt: Ein Tool, das einige dieser Dinge verwendet (erstellt eine interaktive Shell in einem temporären Arbeitsverzeichnis in einer sauberen Umgebung, mit Bereinigung beim Beenden der Shell):

Haftungsausschluss: Das habe ich geschrieben.

verwandte Informationen