cancella tutte le variabili senza chiudere il terminale


10

Voglio sapere come cancellare tutte le variabili che ho definito nel prompt dei comandi senza chiudere il terminale?

ad esempio, se ho impostato una variabile nel prompt dei comandi come:

$ a=1

ora voglio eliminare la variabile $a(e molte altre variabili definite in modo simile) senza chiudere il terminale. Potrei usare unsetma sarà frenetico se ci sono grandi no. di variabili


2
exec "$0"forse - ma è difficile dire cosa intendi per globale .
Mikeserv,

3
Perché vuoi farlo?
Hauke ​​Laging,

1
@HaukeLaging Sto lavorando con array che usano script. A volte aggiungo un elemento ad esso. per questo motivo non posso eseguire lo script con vecchi valori (poiché l'array è cambiato). devo chiudere il terminale e ricominciare una nuova sessione. Spero di aver chiarito. in caso contrario, fammi sapere :)
Edward Torvalds,

1
@muru - ottiene un elenco salvato in $varcon var=$(declare -p +F);poi lo passa come argomento a una funzione che fa echo "${2%%=*}".Quella risposta ha alcuni problemi con la dimensione pura - ma dovrebbe funzionare se il tuo ambiente non è enorme.
Mikeserv,

3
Non ho idea di cosa stai cercando di fare. Stai parlando di una shell interattiva o di una sceneggiatura? Le variabili impostate in uno script eseguito da una shell interattiva non influiscono sulla shell padre. Dicci cosa vuoi raggiungere, non quale vicolo cieco stai perseguendo .
Gilles 'SO- smetti di essere malvagio' il

Risposte:


9

Se lo fai (GNU coreutils)

exec env --ignore-environment /bin/bash

userete un ambiente nuovo e fresco


che dire exec "$0"?
Edward Torvalds,

@edwardtorvalds $0è l'argomento zeroth per una shell eseguita. Quindi, se si sta eseguendo bash $0è bash (probabilmente - potrebbe essere -bashin un -lcaso di shell ogin a seconda della versione) . Se stai eseguendo uno script con una #!/bin/bashbangline, $0è il percorso dello script. exec "$0"è probabilmente più flessibile, ma exec bashè più esplicito. Se inserisci quel comando in un terminale, bashdovresti riconoscere che si trova in un ambiente interattivo e fare l'equivalente di bash -i- che farà ~/.bashrcfunzionare anche il tuo file.
Mikeserv,

Questo non aiuta export a=123, quella variabile è ereditata ...
stimola il

1

È possibile utilizzare env, fornito da coreutils GNU (in genere preinstallato su sistemi GNU / Linux):

exec env --ignore-environment /bin/bash

La chiamata di sistema exec è in modo che il processo corrente venga sostituito sul posto dalla nuova versione senza shell della shell.

Ciò ha il vantaggio di cancellare anche eventuali variabili d'ambiente esportate .


Ma questo cancellerebbe la mia variabile PATH modificata, per esempio export PATH=$PATH:~/foo, giusto?
Edward Torvalds,

Hai ragione. Ho modificato la mia risposta in modo che venga utilizzato il percorso assoluto della shell anziché $ 0.
user30747,

Grazie a user30747, hai rubato la tua risposta per correggere la mia. Impossibile eliminare la risposta accettata
Gilles Quenot del
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.