Jak wydrukować wszystkie zmienne inne niż środowiskowe?

0

Jak wydrukować wszystkie zmienne inne niż środowiskowe?

Są to wszystkie zmienne, które dodałem od momentu uruchomienia powłoki, na przykład podczas wykonywania:

read abc
    123
# echo ${abc} => 123

Lub

xyz='123'
# echo ${xyz} => 123

Chcę je wszystkie wydrukować, aby wiedzieć, co zostało dodane do pamięci, abym mógł to wyczyścić.

Arcticooling
źródło

Odpowiedzi:

2

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 posixtworzy setlistę 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ę bashna 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).

Michael Homer
źródło
Bardzo mi pomogłeś i jestem pewien, że inni będą uczyć się z tej odpowiedzi i cieszyć się danymi. Podniosłem kciuk i bardzo dziękuję, drogi Michael!
Arcticooling,