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


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


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.