명령의 차이점은 무엇입니까
$ env FOO=bar baz
과
$ FOO=bar baz
어떤 효과가 env
있습니까?
명령의 차이점은 무엇입니까
$ 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
완벽하게 유효합니다.
FOO=bar exec baz
있으므로 env
마지막 시점 에는 필요하지 않습니다 .
exec
무언가를 할 때 , 그것은 현재 환경을 사용합니까?
sudo FOO=bar baz
필요로하지 않고 환경 변수를 전달할 수도 있습니다 env
.
FOO=bar
스크립트 에 넣고 싶을 때만 작동하는 @StephaneChazelas . 경우 FOO
항상하지 않습니다 bar
, 나는 하드 코딩 원하고, 대신에 그것을 전달하지 않습니다.
exec
됩니다 FOO=bar exec baz
.
이 특정 예에서 쉘이 POSIX 호환 쉘이고 가정 baz
은 실행 파일이며 쉘 내장이 아니라고 가정하면 효과적인 차이는 없습니다 .
쉘이 POSIX 호환 쉘이 아닌 경우 ( 예 : csh
또는 tcsh
)
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
tcsh
썼다 (setenv 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
비어 있지 않은 값으로 설정됩니다.