명령의 차이점은 무엇입니까
$ env FOO=bar baz
그리고
$ FOO=bar baz
그것은 무엇을 하는가 env
?
답변1
기능적으로 동일합니다.
가장 큰 차이점은 env FOO=bar baz
쉘을 호출하고 쉘 baz
과 FOO=bar baz
쉘 사이의 중간 프로세스를 직접 호출한다는 점입니다 baz
.
따라서 그러한 측면에서 FOO=bar baz
선호됩니다.
내가 사용하는 유일한 상황은 env FOO=bar
하나의 명령을 다른 명령에 전달해야 할 때입니다.
구체적인 예로, 환경에 대한 일부 수정을 수행한 다음 exec
전달된 명령을 호출하는 래퍼 스크립트가 있다고 가정해 보겠습니다. 예를 들면 다음과 같습니다.
#!/bin/bash
FOO=bob
some stuff
exec "$@"
실행하면 myscript FOO=bar baz
유효 하지 않기 exec
때문에 오류가 발생합니다 exec FOO=bar baz
. 대신에, it does it
라고 부르면 완벽하게 유효합니다.myscript env FOO=bar baz
exec env FOO=bar baz
답변2
baz
이 특정 예에서는 쉘이 POSIX 호환 쉘이고 내장 쉘이 아닌 실행 파일이라고 가정하면 실질적인 차이가 없습니다.
당신의 껍질이아니요csh
또는 tcsh
구문 과 같은 POSIX 호환 쉘
FOO=bar baz
작동하지 않으며 동등한 쉘 구문이 없습니다. 이러한 셸의 경우 이 env
명령은 단일 명령에 대한 환경 변수를 재정의하거나 주입하는 유일한 방법입니다.
예를 들어, baz
쉘 내장인 경우 명령 쉘에서 직접 실행되는 대신 새 프로세스가 실행되기 때문에 동일한 결과를 제공하지 않습니다 fc
. 게다가 실행 파일도 없고 쉘 환경과 상호작용하는 방식 때문에 쉘 내장으로만 실행될 수 있으므로env
env
fc
env
안 돼요와 같은 것을 사용하십시오 fc
.
또한 지정된 환경 변수 세트만 사용하여 빈 환경에서 명령을 실행할 수 있는 env
옵션이 제공됩니다 . -i
이는 env
위생화된 환경에서 프로세스를 시작하는 데 유용합니다. 예를 들어
env -i HOME=/tmp/homedir "PATH=`getconf PATH`" "TERM=$TERM" FOO=bar baz
답변3
말씀드린 것 외에도
VAR=value cmd args > redirs
셸(Bourne/POSIX) 기능으로 전달하는 환경 변수의 이름은 제한되어 있습니다 cmd
. 이는 유효한 쉘 변수 이름이어야 하며 읽기 전용이거나 쉘의 특수 변수일 수 없습니다.
예를 들어 다음과 같은 작업은 수행할 수 없습니다.
1=foo cmd
또는
+++=bar cmd
bash
귀하는 다음을 수행할 수 없습니다:
SHELLOPTS=xtrace cmd
이렇게 할 수도 있지만:
env 1=foo cmd
env +++=bar cmd
env '=baz' cmd
(당신이 이것을 원하거나 원해야 한다는 것이 아닙니다). 또는:
env SHELLOPTS=xtrace cmd
(가끔 이 작업을 수행해야 합니다).
a가 포함되지 않은 (또한 원하지 않는) 환경 변수 문자열 은 env
전달할 수 없습니다 .=
답변4
이것이 정말 유용한 또 다른 상황 env
은 환경을 완벽하게 제어하려는 경우입니다. 저는 서버 프로그램(Informix, 추측할 수 없는 경우)을 실행하고 있으며 해당 환경을 완벽하게 제어하고 싶습니다. 나는 스크립트를 실행하기 위해 스크립트의 마지막 부분에서 이것을 사용합니다 env
. 그러면 여러 변수가 올바른 값으로 설정됩니다.
env -i HOME="$IXD" \
INFORMIXDIR="$IXD" \
INFORMIXSERVER="$IXS" \
${IXC:+INFORMIXCONCSMCFG="$IXC"} \
${IXH:+INFORMIXSQLHOSTS="$IXH"} \
IFX_LISTEN_TIMEOUT=3 \
ONCONFIG="onconfig.$IXS" \
PATH="/bin:/usr/bin:$IXD/bin" \
SHELL=/bin/ksh \
TZ=UTC0 \
$ONINIT "$@"
이 -i
옵션은 기존 환경을 파괴합니다. 후속 VAR=value
옵션은 내가 설정하려는 환경 변수를 설정합니다. 프로그램 이름은 에 있고 $ONINIT
모든 명령줄 인수는 그대로 전달됩니다 "$@"
.
생성자 는 null이 아닌 값으로 설정된 경우 ${IXH:+INFORMIXSQLHOSTS="$IXH"}
에만 전달됩니다 INFORMIXSQLHOSTS="$IXH"
.env
$IXH