환경 또는 환경 없음

환경 또는 환경 없음

명령의 차이점은 무엇입니까

$ env FOO=bar baz

그리고

$ FOO=bar baz

그것은 무엇을 하는가 env?

답변1

기능적으로 동일합니다.

가장 큰 차이점은 env FOO=bar baz쉘을 호출하고 쉘 bazFOO=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 bazexec env FOO=bar baz

답변2

baz이 특정 예에서는 쉘이 POSIX 호환 쉘이고 내장 쉘이 아닌 실행 파일이라고 가정하면 실질적인 차이가 없습니다.

당신의 껍질이아니요csh또는 tcsh구문 과 같은 POSIX 호환 쉘

FOO=bar baz

작동하지 않으며 동등한 쉘 구문이 없습니다. 이러한 셸의 경우 이 env명령은 단일 명령에 대한 환경 변수를 재정의하거나 주입하는 유일한 방법입니다.

예를 들어, baz쉘 내장인 경우 명령 쉘에서 직접 실행되는 대신 새 프로세스가 실행되기 때문에 동일한 결과를 제공하지 않습니다 fc. 게다가 실행 파일도 없고 쉘 환경과 상호작용하는 방식 때문에 쉘 내장으로만 실행될 수 있으므로envenvfcenv안 돼요와 같은 것을 사용하십시오 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

관련 정보