답변:
그것들은 동일한 목적을 제공합니다 (주어진 env vars를 명령에 전달) 그러나 몇 가지 주목할만한 차이점은 다음과 같습니다.
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 var에서만 작동 합니다. env
다른 환경 변수 이름 이 필요 합니다.
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
합니다.