Jeśli używasz Bash, to polecenie wyświetli nazwy wszystkich zmiennych powłoki, które nie są dziedziczone przez proces potomny i nie są częścią domyślnej tablicy:
diff -U 1 <(set -o posix ; set |cut -d= -f1) <(exec bash -ic 'set -o posix ; set' | cut -d= -f1)|grep '^[-][^-]'|cut -d- -f2|grep -vE '^(COLUMNS|HISTFILESIZE|HISTSIZE|LINES|PIPESTATUS)$'
Spowoduje to utworzenie listy wszystkich nazw zmiennych w bieżącej powłoce (z set
) oraz listy wszystkich nazw zmiennych w nowo utworzonym podprocesie działającym z tą samą powłoką, znajdzie wszystkie te obecne na pierwszej liście, a nie drugiej (z diff
, ostatnie cięcie i pierwszy grep) i przycina niektóre domyślne zmienne specyficzne dla Bash, których podproces nie będzie miał, ponieważ nie jest powłoką skierowaną do użytkownika. set -o posix
tworzy set
listę tylko zmiennych, a nie funkcji.
Pominie zarówno odziedziczone zmienne środowiskowe, jak i zmienne, które zostały wyraźnie zaznaczone do eksportu.
Zamień się bash
na swoją skorupę. Będziesz także musiał zmienić listę ignorowanych zmiennych w ostatnim grep
, i prawdopodobnie może stracić set -o posix
. Jeśli twoja powłoka nie ma substytucji procesu , będziesz musiał zamiast tego użyć plików tymczasowych lub dostępu do deskryptorów plików (np /dev/fd
.) Specyficznych dla platformy .
Z drugiej strony, jeśli wszystko, co chcesz zrobić, to wyczyścić swoje lokalne zmienne i funkcje, to
exec bash
będzie miał ten efekt (jednocześnie ponownie czytając niektóre pliki konfiguracyjne i potencjalnie tracąc lokalne zmiany w opcjach powłoki).