wyczyść wszystkie zmienne bez zamykania terminala

10

Chcę wiedzieć, jak usunąć wszystkie zmienne zdefiniowane w wierszu polecenia bez zamykania terminala?

na przykład, jeśli ustawię zmienną w wierszu polecenia jako:

$ a=1

teraz chcę usunąć zmienną $a(i wiele innych zmiennych zdefiniowanych w podobny sposób) bez zamykania terminala. Mógłbym użyć, unsetale będzie gorączkowy, jeśli nie będzie dużych. zmiennych

Edward Torvalds
źródło
2
exec "$0"może - ale trudno powiedzieć, co rozumiesz przez globalny .
mikeserv
3
Dlaczego chcesz to zrobić?
Hauke ​​Laging,
1
@HaukeLaging Pracuję z tablicami za pomocą skryptu. Czasami dodaję do tego jeden element. z powodu którego nie mogę uruchomić skryptu ze starymi wartościami (ponieważ tablica została zmieniona). muszę zamknąć terminal i ponownie rozpocząć nową sesję. Mam nadzieję, że wyjaśniłem. jeśli nie, proszę dać mi znać :)
Edward Torvalds,
1
@muru - dostaje listę zapisany do $varz var=$(declare -p +F);przepływa następnie, że jako argument do funkcji, która robi echo "${2%%=*}".to odpowiedź ma kilka problemów z ogrom - ale to powinno działać, jeśli środowisko nie jest ogromna.
mikeserv
3
Nie mam pojęcia, co próbujesz zrobić. Czy mówisz o interaktywnej powłoce lub skrypcie? Zmienne ustawione w skrypcie wykonanym z powłoki interaktywnej nie wpływają na powłokę nadrzędną. Powiedz nam, co chcesz osiągnąć, a nie ślepy zaułek .
Gilles „SO- przestań być zły”

Odpowiedzi:

10

Jeśli to zrobisz (GNU coreutils)

exec env --ignore-environment /bin/bash

będziesz korzystać ze świeżego i nowego środowiska

Gilles Quenot
źródło
co exec "$0"?
Edward Torvalds,
@edwardtorvalds $0jest zerowym argumentem wykonanej powłoki. Tak więc, jeśli używasz bash $0to bash (prawdopodobnie - to może być -bashw -lprzypadku ogin powłoki w zależności od wersji) . Jeśli używasz skryptu z #!/bin/bashlinią bangline, $0jest to ścieżka do skryptu. exec "$0"jest prawdopodobnie bardziej elastyczny, ale exec bashbardziej wyraźny. Jeśli wpiszesz to polecenie na terminalu, bashpowinieneś rozpoznać je w interaktywnym środowisku i zrobić odpowiednik bash -i- co spowoduje ~/.bashrcuruchomienie pliku.
mikeserv
To nie pomaga export a=123, ta zmienna jest dziedziczona ...
stymulacja
1

Możesz użyć env, który jest dostarczany przez GNU coreutils (zwykle preinstalowany w systemach GNU / Linux):

exec env --ignore-environment /bin/bash

Wywołanie systemowe exec polega na tym, że bieżący proces jest zastępowany w miejscu przez nową, pozbawioną środowiska wersję powłoki.

Ma to tę zaletę, że usuwa także wszystkie eksportowane zmienne środowiskowe.

użytkownik30747
źródło
Ale to wyczyści na przykład moją zmodyfikowaną zmienną PATH export PATH=$PATH:~/foo, prawda?
Edward Torvalds
Masz rację. Zmodyfikowałem swoją odpowiedź, aby zamiast 0 $ użyto bezwzględnej ścieżki powłoki.
user30747,
Dzięki user30747 skradziono twoją odpowiedź, aby poprawić moją. Nie można usunąć zaakceptowanej odpowiedzi
Gilles Quenot