명령 앞에 이름-값 쌍을 추가하는 것과 bash에서 env를 사용하는 것 사이에 차이점이 있습니까?

명령 앞에 이름-값 쌍을 추가하는 것과 bash에서 env를 사용하는 것 사이에 차이점이 있습니까?

내가 and 에 전화했다고 가정해 보세요 A=B command. 두 호출 간에 차이가 있을 수 있는 상황이 있나요?env A=B commandbash

답변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.fooargv[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.

관련 정보