내가 and 에 전화했다고 가정해 보세요 A=B command
. 두 호출 간에 차이가 있을 수 있는 상황이 있나요?env A=B command
bash
답변1
이들은 동일한 목적을 수행합니다(주어진 환경 변수를 명령에 전달). 그러나 몇 가지 중요한 차이점이 있습니다.
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
추가 환경 변수 이름은 다음과 같습니다 .
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
.