Скажімо, я викликаю A=B command
і env A=B command
в bash
. Чи є ситуація, коли може бути різниця між обома викликами?
Скажімо, я викликаю A=B command
і env A=B command
в bash
. Чи є ситуація, коли може бути різниця між обома викликами?
Відповіді:
Вони служать тій самій цілі (передайте дану команду команді). Однак кілька помітних відмінностей:
A=B command
- конструкція оболонки (Bourne / POSIX / rc).
Наприклад, ви можете:
A=B find . -exec cmd '{}' +
або:
find . -exec env A=B cmd '{}' +
Але ви не можете робити:
find . -exec A=B cmd '{}' +
Тому що find
не викликає оболонку для запуску цієї команди.
З іншого боку, env
будучи зовнішньою командою, ви не можете робити:
f() { ...; }
env A=B f
або:
env A=B eval '...'
Також:
A=B cmd
працює лише з env vars, які є дійсними назвами змінних оболонок . Вам потрібно env
для будь-якого іншого env var імені:
env 'my var=foo' cmd...
bash
скидає _
змінну:
bash-4.3$ _=xxx env | grep '^_='
_=/usr/bin/env
bash-4.3$ env _=xxx env | grep '^_='
_=xxx
В zsh
, ARGV0
і STTY
має особливе значення в цьому контексті:
STTY=-echo cat
Працює cat
з echo
вимкненим терміналом . І:
ARGV0=foo cmd
працює cmd
з foo
його argv[0]
.
Якщо ви не хочете такої спеціальної обробки, вам доведеться скористатися env
.
Зауважте, що sudo
підтримується:
sudo A=B cmd
Це не використовувати оболонку або env
робити це. Це робить це само собою.
Він може передавати змінні з будь-яким ім'ям, крім тих, що починаються з -
.
Призначення - це конструкція оболонки, тоді як знак рівності в аргументі env
не має особливого значення для оболонки, тому A=$B cmd
безпечний, тоді як env A="$B" cmd
(або sudo A="$B" cmd
) потрібні подвійні лапки.
A=B cmd
Синтаксис підтримується тільки в оболонках Bourne і rc
сімей (НЕ es
хоча). Наприклад, в оболонках csh
або fish
сімей, ви повинні вдатися env
.