Posso correre ENV_VAR=value command
per funzionare command
con un valore specifico per ENV_VAR
. Qual è l'equivalente di unset ENV_VAR
per command
?
cmd
per quello.
Posso correre ENV_VAR=value command
per funzionare command
con un valore specifico per ENV_VAR
. Qual è l'equivalente di unset ENV_VAR
per command
?
cmd
per quello.
Risposte:
A parte l' -i
opzione, che cancella l'intero ambiente, POSIX env
non fornisce alcun modo per disinserire una variabile.
Tuttavia, con alcune env
implementazioni (inclusi GNU, busybox
'e almeno FreeBSD), puoi fare:
env -u ENV_VAR command
Che funzionerebbe nel rimuovere ogni istanza di una ENV_VAR
variabile dall'ambiente (nota però che non funziona per la variabile d'ambiente con un nome vuoto ( env -u ''
o dà un errore o è inefficace a seconda dell'implementazione anche se tutti accettano env '=value'
, probabilmente una limitazione sostenuto dalla unsetenv()
funzione C che POSIX richiede per restituire un errore per la stringa vuota, mentre non esiste tale limitazione per putenv()
)).
Portabilmente (nelle shell POSIX), puoi fare:
(unset -v ENV_VAR; exec command)
(nota che con alcune shell, usare exec
può cambiare ciò che command
viene eseguito: esegue quello nel filesystem invece di una funzione o builtin per esempio (e alias
ovviamente ignorerebbe l' espansione), come env
sopra. In questi casi vorrai ometterlo) .
Ma ciò non funzionerà per le variabili di ambiente che hanno un nome che non è mappabile a una variabile di shell (si noti che alcune shell come mksh
rimuoveranno comunque quelle variabili dall'ambiente all'avvio), o variabili che sono state contrassegnate come di sola lettura.
-v
è per la shell Bourne e il bash
cui unset
senza -v
potrebbe annullare l'impostazione di una ENV_VAR
funzione se non vi fosse alcuna variabile con quel nome. La maggior parte delle altre shell non disinserire le funzioni se non si passa l' -f
opzione. (è improbabile che faccia la differenza nella pratica).
(Fai attenzione anche al bug / al malfunzionamento di bash
/ mksh
/ il yash
cui unset
, in alcune circostanze, potrebbe non disinserire la variabile, ma rivelare la variabile in un ambito esterno )
Se perl
è disponibile, puoi fare:
perl -e 'delete $ENV{shift@ARGV}; exec @ARGV or die$!' ENV_VAR command
Che funzionerà anche per la variabile d'ambiente con un nome vuoto.
Ora tutti quelli non funzioneranno se si desidera modificare una variabile di ambiente per un builtin o una funzione e non si desidera che vengano eseguiti in una subshell, come in bash
:
env -u LANG printf -v var %.3f 1.2 # would run /usr/bin/printf instead
(unset -v LANG; printf -v var %.3f 1.2) # changes to $var lost afterwards
(qui disinserendo LANG come approccio errato per assicurarsi che .
sia usato e inteso come separatore decimale. Sarebbe meglio usarlo LC_ALL=C printf...
per quello)
Con alcune shell, puoi invece creare un ambito locale per la variabile usando una funzione:
without() {
local "$1" # $1 variable declared as initially unset in bash¹
shift
"$@"
}
without LANG printf -v var %.3f 1.2
Con zsh
, puoi anche usare una funzione anonima:
(){local ENV_VAR; command}
Questo approccio non funzionerà in alcune shell (come quelle basate sulla shell Almquist), le quali local
non dichiarano la variabile inizialmente non impostata (ma ereditano il valore e gli attributi). In quelli, puoi farlo local ENV_VAR; unset ENV_VAR
, ma non farlo in mksh
o yash
( typeset
invece local
che per quello) in quanto non funzionerebbe, il unset
solo annullerebbe il local
.
¹ Inoltre, attenzione che in bash
locale ENV_VAR
(anche se non impostato) manterrebbe l' attributo export . Quindi, se command
fosse una funzione che assegna un valore a ENV_VAR
, la variabile sarebbe disponibile nell'ambiente dei comandi chiamati in seguito. unset ENV_VAR
cancellerebbe quell'attributo. Oppure potresti usare local +x ENV_VAR
ciò che assicurerebbe anche una tabula rasa (a meno che quella variabile non sia stata dichiarata di sola lettura, ma poi non c'è nulla che tu possa fare al riguardo bash
).
env '=foo' python -c 'import os; print os.environ[""]'
. Non mi aspetto che molte persone vorrebbero impostare una variabile del genere.
Non c'è equivalente diretto per quanto ne so; puoi usare una subshell:
(unset ENV_VAR; exec command)
(unset ENV_VAR; exec somecommand)
se si desidera essere equivalenti all'originale in termini di efficienza (consumando la subshell). Così com'è, questo aggiunge un fork extra.
command
è l'ultimo comando nell'invocazione della subshell.
env -u
.
Puoi usare ENV_VAR= command
Questo in realtà non disinserisce la variabile, ma può essere utile in molti casi (gli script di shell di solito usano solo test -n
per verificare se è impostata una variabile):
$ export ENV_VAR=foo
$ mycommand
ENV_VAR: foo
$ ENV_VAR=bar mycommand
ENV_VAR: bar
$ ENV_VAR= mycommand
ENV_VAR:
command
è una scelta sfortunata di segnaposto, poiché in realtà esiste un comando integrato con quel nome.mycommand
osomecommand
o potrebbe essere un'abitudine migliore per entrare.