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ć, unset
ale będzie gorączkowy, jeśli nie będzie dużych. zmiennych
shell
environment-variables
Edward Torvalds
źródło
źródło
exec "$0"
może - ale trudno powiedzieć, co rozumiesz przez globalny .$var
zvar=$(declare -p +F);
przepływa następnie, że jako argument do funkcji, która robiecho "${2%%=*}".
to odpowiedź ma kilka problemów z ogrom - ale to powinno działać, jeśli środowisko nie jest ogromna.Odpowiedzi:
Jeśli to zrobisz (GNU coreutils)
będziesz korzystać ze świeżego i nowego środowiska
źródło
exec "$0"
?$0
jest zerowym argumentem wykonanej powłoki. Tak więc, jeśli używaszbash
$0
tobash
(prawdopodobnie - to może być-bash
w-l
przypadku ogin powłoki w zależności od wersji) . Jeśli używasz skryptu z#!/bin/bash
linią bangline,$0
jest to ścieżka do skryptu.exec "$0"
jest prawdopodobnie bardziej elastyczny, aleexec bash
bardziej wyraźny. Jeśli wpiszesz to polecenie na terminalu,bash
powinieneś rozpoznać je w interaktywnym środowisku i zrobić odpowiednikbash -i
- co spowoduje~/.bashrc
uruchomienie pliku.export a=123
, ta zmienna jest dziedziczona ...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.
źródło
export PATH=$PATH:~/foo
, prawda?