환경을 env로 env FOO=bar baz 과 $

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

$ env FOO=bar baz

$ FOO=bar baz

어떤 효과가 env있습니까?



답변

그것들은 기능적으로 동일합니다.

주요 차이점은이 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유효하지 않습니다.
대신로 myscript env FOO=bar baz실행되는 것으로 호출하고 exec env FOO=bar baz완벽하게 유효합니다.


답변

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

쉘이 POSIX 호환 쉘이 아닌 경우 ( 예 : csh또는 tcsh)

FOO=bar baz

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

예를 들어 baz쉘이 내장되어 있다면 명령 쉘이 직접 실행하는 대신 새 프로세스를 실행 하기 때문에 동일한 결과를 제공하지 않습니다 . 또한, 어떤이없는 이 방식은 쉘 환경과 상호 작용하기 때문에 단지 쉘 내장으로 실행, 그래서 수, 실행 의지 결코 같은 내장과 함께 일을 .fcenvenvfcenvfc

또한 지정된 환경 변수 세트만으로 빈 환경에서 명령을 시작할 수 env있는 -i옵션을 제공합니다 . 그래서 env예를 들어, 위생적 환경에서 프로세스를 시작하기에 매우 유용 할 수 있습니다

env -i HOME=/tmp/homedir "PATH=`getconf PATH`" "TERM=$TERM" FOO=bar baz


답변

이미 말한 것 외에도

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

(때로는 그렇게해야합니다).

참고로 env당신이 아직 포함되지 않은 환경 변수 문자열을 전달할 수 없습니다 =(하지 당신도 그렇게 할 것이다).


답변

사용하는 이유 중 하나는 env수 있도록하는 것입니다 $PATH(때문에 오두막 라인에서 실행 파일의 검색 env을 고려 $PATH실행 파일을 검색 할 때). 이것은 호출하려는 실행 파일이 다른 시스템의 다른 위치에있을 때 유용합니다. 예를 들어

#!/usr/bin/env perl

상관없이이 설치되어 있는지 여부를 펄이 스크립트를 실행하지 않습니다 실행 비트 세트 스크립트의 첫 줄에서 /usr/bin/perl또는에서 /usr/local/bin/perl한 디렉토리 경로에서와 같이, 또는 완전히 다른 장소에서.

물론 경로 검색에는 추가 위험이 있지만, 명시 적으로 작성한 경우보다 위험이 크지 않으며 perl yourscript.pl검색 경로에서 perl을 찾습니다.


답변

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있고 모든 명령 행 인수는로 그대로 전달됩니다 "$@".

${IXH:+INFORMIXSQLHOSTS="$IXH"}구조는 전달 INFORMIXSQLHOSTS="$IXH"env경우 $IXH비어 있지 않은 값으로 설정됩니다.


답변