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


19

A=B command그리고 env A=B commandin을 호출한다고 가정 해 봅시다 bash. 두 호출 사이에 차이가있을 수있는 상황이 있습니까?

답변:


26

그것들은 동일한 목적을 제공합니다 (주어진 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

실행 cmdfoo그와 같은 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합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.