C'è una differenza tra anteporre una coppia nome-valore a un comando e usare env in bash?


19

Diciamo che invoco A=B commande env A=B commanddentro bash. Esiste una situazione in cui potrebbe esserci una differenza tra entrambe le invocazioni?

Risposte:


26

Servono allo stesso scopo (passare i dati indicati al comando). Tuttavia alcune differenze notevoli:

A=B command

è un costrutto shell (Bourne / POSIX / rc).

Ad esempio, puoi fare:

A=B find . -exec cmd '{}' +

o:

find . -exec env A=B cmd '{}' +

Ma non puoi fare:

find . -exec A=B cmd '{}' +

Perché findnon sta invocando una shell per eseguire quel comando.

D'altra parte, envessendo un comando esterno, non puoi fare:

f() { ...; }
env A=B f

o:

env A=B eval '...'

Anche:

A=B cmd

funziona solo con env var che sono nomi di variabili shell valide . È necessario envper qualsiasi altro nome var env:

env 'my var=foo' cmd...

bashreimposta la _variabile:

bash-4.3$ _=xxx env | grep '^_='
_=/usr/bin/env
bash-4.3$ env _=xxx env | grep '^_='
_=xxx

In zsh, ARGV0e STTYhanno significati speciali in quel contesto:

STTY=-echo cat

Funziona catcon terminale echodisabilitato. E:

ARGV0=foo cmd

funziona cmdcon fooil suo argv[0].

Se non si desidera tale elaborazione speciale, è necessario utilizzare env.

Si noti che sudosupporta:

sudo A=B cmd

Non sta usando la shell o envper farlo. Lo fa da solo.

Può passare variabili con qualsiasi nome tranne quelli che iniziano con -.

L'assegnazione è un costrutto di shell mentre un segno di uguale nell'argomento di envnon ha alcun significato speciale per la shell, quindi A=$B cmdè sicuro mentre env A="$B" cmd(o sudo A="$B" cmd) richiedono doppie virgolette.

La A=B cmdsintassi è supportata solo nelle shell di Bourne e rcfamiglie (non esperò). Nelle shell delle famiglie csho fish, per esempio, devi ricorrere a env.

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.