Let ı çağırmak demek A=B command
ve env A=B command
de bash
. Her iki çağrı arasında bir fark olabileceği herhangi bir durum var mı?
Let ı çağırmak demek A=B command
ve env A=B command
de bash
. Her iki çağrı arasında bir fark olabileceği herhangi bir durum var mı?
Yanıtlar:
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ü find
bu komutu çalıştırmak için bir kabuk çağırmıyor.
Öte yandan, env
harici 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 . env
Baş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
, ARGV0
ve STTY
bu bağlamda özel anlamları vardır:
STTY=-echo cat
cat
Terminal echo
devre dışı iken çalışır . Ve:
ARGV0=foo cmd
ishal cmd
ile foo
olarak onun argv[0]
.
Bu özel işlemeyi istemiyorsanız, kullanmanız gerekir env
.
Şunları sudo
destekleyen not :
sudo A=B cmd
Kabuğu kullanmıyor ya da env
bunu 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 env
kabuk için özel bir anlamı yoktur, bu A=$B cmd
nedenle güvenlidir, env A="$B" cmd
(veya sudo A="$B" cmd
) çift tırnak gerektirir.
A=B cmd
Sözdizimi sadece Bourne ve kabukları desteklenir rc
aileleri (değil es
gerçi). Mesela, csh
ya da fish
ailelerinin kabuklarına başvurmak zorundasınız env
.