Скажімо, я викликаю 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.