Чи є різниця між попередньою подачею імені-значення-пари до команди та використанням env у bash?


Відповіді:


26

Вони служать тій самій цілі (передайте дану команду команді). Однак кілька помітних відмінностей:

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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.