Subshells erben die Umgebung oder einen Teil davon. Es sieht so aus, als ob Sie beim Ausführen einer Funktion in einer Subshell Ihre Variablen nicht exportieren müssen (vergleiche: Beim Export von Funktionen in der Subshell ist kein Export erforderlich ). Es kann Fälle geben, in denen Sie etwas brauchen, export
aber konzentrieren wir uns auf Ihr Beispiel.
Ihr Ansatz ist fehlerhaft und wird schwer aufrechtzuerhalten, da Vererbung in eine Richtung geht. Jeder (mfunc)
erbt tmp_tmp_files
und arbeitet mit einer eigenen Kopie des Arrays. Es ist unmöglich, das tmp_tmp_files
im Hauptskript verwendete Original zu ändern . Daher kann das Hauptskript nicht alles bereinigen, es verfügt einfach nicht über genügend Informationen.
Wenn Sie sich für die Bereinigung der untergeordneten Funktion entscheiden, müssen Sie darauf achten, dass die temporären Dateien der Funktion von den temporären Dateien des Hauptskripts unterschieden werden. Das vorzeitige Entfernen des letzteren kann dazu führen, dass Ihr Skript fehlschlägt.
Alternativer Ansatz: ein temporäres Verzeichnis
Anstatt ein Array zu erstellen, erstellen Sie ein Verzeichnis und merken Sie sich dessen Pfad. Tun Sie es einmal am Anfang und
export
wenn Sie brauchen:tempdir=$(mktemp -d mscript.XXXXXXXXXX)
Erstellen Sie jede temporäre Datei innerhalb des temporären Verzeichnisses wie folgt:
tempfile=$(mktemp -p "$tempdir")
Entfernen Sie am Ende das gesamte Verzeichnis, unabhängig davon, ob die betreffenden Dateien vom Hauptskript oder von einer Subshell oder sogar von einem Fremdprogramm eines Fremdanbieters erstellt wurden. Sie können einen Trap verwenden, um diesen Schritt auszuführen. Einfach:
rm -r "$tempdir"