Löschen Sie alle Variablen, ohne das Terminal zu schließen

10

Ich möchte wissen, wie alle Variablen, die ich in der Eingabeaufforderung definiert habe, gelöscht werden können, ohne das Terminal zu schließen .

Zum Beispiel, wenn ich eine Variable in der Eingabeaufforderung wie folgt festlege:

$ a=1

Jetzt möchte ich die Variable $a(und viele andere auf ähnliche Weise definierte Variablen) löschen , ohne das Terminal zu schließen. Ich könnte es gebrauchen, unsetaber es wird hektisch, wenn es große Nein gibt. von Variablen

Edward Torvalds
quelle
2
exec "$0"vielleicht - aber es ist schwer zu sagen, was du mit global meinst .
Mikesserv
3
Warum willst du das machen?
Hauke ​​Laging
1
@HaukeLaging Ich arbeite mit Arrays mit Skript. Ich füge manchmal ein Element hinzu. Aus diesem Grund kann ich das Skript nicht mit alten Werten ausführen (da das Array geändert wurde). Ich muss das Terminal schließen und eine neue Sitzung erneut starten. Ich hoffe ich habe es klar gemacht. wenn nicht, lass es mich bitte wissen :)
Edward Torvalds
1
@muru - er bekommt eine Liste, die in einem $varmit gespeichert ist, var=$(declare -p +F);und übergibt diese als Argument an eine Funktion, die dies tut. echo "${2%%=*}".Diese Antwort hat ein paar Probleme mit der Größe - aber es sollte funktionieren, wenn Ihre Umgebung nicht riesig ist.
Mikesserv
3
Ich habe keine Ahnung, was Sie versuchen zu tun. Sprechen Sie über eine interaktive Shell oder ein Skript? In einem Skript festgelegte Variablen, die von einer interaktiven Shell ausgeführt werden, wirken sich nicht auf die übergeordnete Shell aus. Sagen Sie uns, was Sie erreichen möchten, nicht welche Sackgasse Sie verfolgen .
Gilles 'SO - hör auf böse zu sein'

Antworten:

9

Wenn Sie dies tun (GNU Coreutils)

exec env --ignore-environment /bin/bash

Sie werden eine frische und neue Umgebung nutzen

Gilles Quenot
quelle
was ist mit exec "$0"?
Edward Torvalds
@edwardtorvalds $0ist das nullte Argument für eine ausgeführte Shell. Also, wenn Sie laufen, bash $0ist bash (wahrscheinlich - es kann -bashin einem -lOgin-Shell-Fall sein, abhängig von der Version) . Wenn Sie ein Skript mit einer #!/bin/bashBangline ausführen, $0ist dies der Pfad zum Skript. exec "$0"ist wahrscheinlich flexibler, aber exec bashexpliziter. Wenn Sie diesen Befehl an einem Terminal eingeben, bashsollten Sie erkennen, dass er sich in einer interaktiven Umgebung befindet, und das Gleiche tun wie bash -i- wodurch auch Ihre ~/.bashrcDatei ausgeführt wird.
Mikeserv
Dies hilft nicht export a=123, diese Variable wird vererbt ...
Stimur
1

Sie können Folgendes verwenden env: GNU-Coreutils (normalerweise auf GNU / Linux-Systemen vorinstalliert):

exec env --ignore-environment /bin/bash

Der Exec-Systemaufruf ist so, dass Ihr aktueller Prozess direkt durch die neue, umgebungslose Version Ihrer Shell ersetzt wird.

Dies hat den Vorteil, dass auch exportierte Umgebungsvariablen gelöscht werden.

user30747
quelle
Aber das würde zum Beispiel meine modifizierte PATH-Variable löschen export PATH=$PATH:~/foo, oder?
Edward Torvalds
Du hast recht. Ich habe meine Antwort so geändert, dass der absolute Pfad der Shell anstelle von $ 0 verwendet wird.
user30747
Dank user30747 haben Sie Ihre Antwort gestohlen, um meine zu korrigieren. Akzeptierte Antwort kann nicht gelöscht werden
Gilles Quenot