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ı?
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:
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.