Bir komuta isim-değer çifti eklemek ve bash içinde env kullanmak arasında bir fark var mı?


19

Let ı çağırmak demek A=B commandve env A=B commandde bash. Her iki çağrı arasında bir fark olabileceği herhangi bir durum var mı?

Yanıtlar:


26

Aynı amaca hizmet ederler (verilen env değişkenlerini komuta iletin). Ancak birkaç önemli fark:

A=B command

bir kabuk (Bourne / POSIX / rc) yapısıdır.

Örneğin, şunları yapabilirsiniz:

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

veya:

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

Ama yapamazsın:

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

Çünkü findbu komutu çalıştırmak için bir kabuk çağırmıyor.

Öte yandan, envharici bir komut olarak şunları yapamazsınız:

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

veya:

env A=B eval '...'

Ayrıca:

A=B cmd

yalnızca geçerli kabuk değişkeni adları olan env değişkenleriyle çalışır . envBaşka bir env var adına ihtiyacınız var:

env 'my var=foo' cmd...

bash_değişkeni sıfırlar :

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

Olarak zsh, ARGV0ve STTYbu bağlamda özel anlamları vardır:

STTY=-echo cat

catTerminal echodevre dışı iken çalışır . Ve:

ARGV0=foo cmd

ishal cmdile fooolarak onun argv[0].

Bu özel işlemeyi istemiyorsanız, kullanmanız gerekir env.

Şunları sudodestekleyen not :

sudo A=B cmd

Kabuğu kullanmıyor ya da envbunu yapmıyor. Kendi başına yapar.

İle başlayanlar dışında herhangi bir ada sahip değişkenleri geçirebilir -.

Atama bir kabuk yapısıdır, ancak argümanındaki eşittir işaretinin envkabuk için özel bir anlamı yoktur, bu A=$B cmdnedenle güvenlidir, env A="$B" cmd(veya sudo A="$B" cmd) çift tırnak gerektirir.

A=B cmdSözdizimi sadece Bourne ve kabukları desteklenir rcaileleri (değil esgerçi). Mesela, cshya da fishailelerinin kabuklarına başvurmak zorundasınız env.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.