Katakanlah saya memanggil A=B command
dan env A=B command
masuk bash
. Apakah ada situasi di mana mungkin ada perbedaan antara kedua invokations?
Katakanlah saya memanggil A=B command
dan env A=B command
masuk bash
. Apakah ada situasi di mana mungkin ada perbedaan antara kedua invokations?
Jawaban:
Mereka melayani tujuan yang sama (meneruskan perintah yang diberikan kepada perintah). Namun beberapa perbedaan penting:
A=B command
adalah konstruksi shell (Bourne / POSIX / rc).
Misalnya, Anda dapat melakukan:
A=B find . -exec cmd '{}' +
atau:
find . -exec env A=B cmd '{}' +
Tetapi Anda tidak bisa melakukan:
find . -exec A=B cmd '{}' +
Karena find
tidak meminta shell untuk menjalankan perintah itu.
Di sisi lain, env
menjadi perintah eksternal, Anda tidak dapat melakukan:
f() { ...; }
env A=B f
atau:
env A=B eval '...'
Juga:
A=B cmd
hanya bekerja dengan env vars yang merupakan nama variabel shell yang valid . Anda memerlukan env
nama env var lainnya:
env 'my var=foo' cmd...
bash
me-reset _
variabel:
bash-4.3$ _=xxx env | grep '^_='
_=/usr/bin/env
bash-4.3$ env _=xxx env | grep '^_='
_=xxx
Di zsh
, ARGV0
dan STTY
memiliki makna khusus dalam konteks itu:
STTY=-echo cat
Berjalan cat
dengan terminal echo
dinonaktifkan. Dan:
ARGV0=foo cmd
berjalan cmd
dengan foo
sebagai yang argv[0]
.
Jika Anda tidak ingin pemrosesan khusus itu, Anda harus menggunakannya env
.
Catatan yang sudo
mendukung:
sudo A=B cmd
Itu tidak menggunakan shell atau env
untuk melakukan itu. Itu melakukannya dengan sendirinya.
Itu bisa melewati variabel dengan nama apa pun kecuali yang dimulai dengan -
.
Tugas adalah konstruksi shell sedangkan tanda sama dalam argumen env
tidak memiliki arti khusus untuk shell, jadi A=$B cmd
aman sedangkan env A="$B" cmd
(atau sudo A="$B" cmd
) membutuhkan tanda kutip ganda.
The A=B cmd
sintaks hanya didukung dalam cangkang dari Bourne dan rc
keluarga (tidak es
meskipun). Dalam kerang csh
atau fish
keluarga misalnya, Anda harus menggunakan env
.