환경을 env로


32

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

$ env FOO=bar baz

$ FOO=bar baz

어떤 효과가 env있습니까?


4
일종의 부수적 인 질문이지만 그러한 단일 하위 명령에 대해 환경 변수를 설정할 때 기능 자체가 무엇입니까? 나는 그것이 무엇인지 모르기 때문에 항상 이것에 대한 정보를 찾는 데 어려움을 겪었습니다.
John Cromartie

1
@JohnCromartie, 질문으로 물어봐야합니다.
CJM

1
배쉬를 들어, 여기에 문서화 : gnu.org/software/bash/manual/...
글렌 잭맨

2
@JohnCromartie 모든 쉘 명령의 선택적 구성 요소이므로 대부분의 쉘 매뉴얼의 "간단한 명령"섹션에 있습니다. POSIX의 경우 여기에 있습니다 . glenn은 이미 bash 매뉴얼의 유사한 섹션을 링크했습니다.
jw013

할당을 통해 존재하지 않는 변수를 설정하면 셸 변수가 생성됩니다. ENV를 통해 설정하거나 변수를 내 보내면 변수가 셸의 실행 환경으로 푸시됩니다. 기존 변수의 값을 변경하면 실행 환경 값이 있으면이를 업데이트하고 그렇지 않으면 쉘 내부 변수에서 값을 변경합니다.
요한

답변:


26

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

주요 차이점은이 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완벽하게 유효합니다.


1
그래도 할 수 FOO=bar exec baz있으므로 env마지막 시점 에는 필요하지 않습니다 .
Stéphane Chazelas

당신이 exec무언가를 할 때 , 그것은 현재 환경을 사용합니까?
glenn jackman

1
Ditto @StephaneChazelas 및을 sudo FOO=bar baz필요로하지 않고 환경 변수를 전달할 수도 있습니다 env.
Mike Miller

1
FOO=bar스크립트 에 넣고 싶을 때만 작동하는 @StephaneChazelas . 경우 FOO항상하지 않습니다 bar, 나는 하드 코딩 원하고, 대신에 그것을 전달하지 않습니다.
패트릭

@glennjackman 예,와 같이 변수를 내보내거나 전달하기 만하면 exec됩니다 FOO=bar exec baz.
Patrick

14

이 특정 예에서 쉘이 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

내가 사용했을 때 동등한 기능을 얻기 위해 tcsh썼다 (setenv FOO bar; baz).
Barmar

6

이미 말한 것 외에도

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당신이 아직 포함되지 않은 환경 변수 문자열을 전달할 수 없습니다 =(하지 당신도 그렇게 할 것이다).


2

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

#!/usr/bin/env perl

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

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


2

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비어 있지 않은 값으로 설정됩니다.

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