구체적인 예를 살펴 보겠습니다. 이 grep
명령은 환경 변수를 사용하여 GREP_OPTIONS
기본 옵션을 설정합니다.
지금. 파일 test.txt
에 다음 줄이 포함되어 있다고 가정합니다 .
line one
line two
명령 grep one test.txt
을 실행하면
line one
-v
옵션으로 grep을 실행하면 일치하지 않는 행이 반환되므로 출력은
line two
이제 환경 변수로 옵션을 설정하려고합니다.
없이 설정 한 환경 변수 export
는 호출중인 명령의 환경에서 상속되지 않습니다.
GREP_OPTIONS='-v'
grep one test.txt
결과:
line one
분명히이 옵션 -v
은에 전달되지 않았습니다 grep
.
셸에서만 사용할 변수를 설정하는 경우 (예 : for i in * ; do
내 보내지 않으려는 경우)이 양식을 사용 하려고합니다 $i
.
그러나 변수는 해당 특정 명령 행의 환경으로 전달되므로 다음을 수행 할 수 있습니다.
GREP_OPTIONS='-v' grep one test.txt
예상되는 결과를 반환합니다
line two
시작된이 특정 프로그램 인스턴스의 환경을 일시적으로 변경하기 위해이 양식을 사용합니다.
변수를 내 보내면 변수가 상속됩니다.
export GREP_OPTIONS='-v'
grep one test.txt
지금 돌아온다
line two
쉘에서 이후에 시작된 프로세스를 사용하기 위해 변수를 설정하는 가장 일반적인 방법입니다.
이것은 모두 bash에서 수행되었습니다. export
bash 내장입니다. VAR=whatever
bash 구문입니다. env
반면에, 그 자체가 프로그램입니다. 경우 env
라고하며, 다음과 같은 사항이 발생합니다 :
- 명령
env
이 새로운 프로세스로 실행됩니다
env
환경을 수정하고
- 인수로 제공된 명령을 호출합니다.
env
프로세스는로 대체 command
방법.
예:
env GREP_OPTIONS='-v' grep one test.txt
이 명령은 (i) env 및 (ii) grep이라는 두 가지 새로운 프로세스를 시작합니다 (실제로 두 번째 프로세스가 첫 번째 프로세스를 대체 함). grep
프로세스 의 관점 에서 결과는 실행 중과 정확히 동일합니다.
GREP_OPTIONS='-v' grep one test.txt
그러나 bash 외부에 있거나 다른 쉘을 시작하지 않으려는 경우 (예 : 호출 exec()
대신 함수 계열을 사용하는 경우)이 관용구를 사용할 수 있습니다 system()
.
추가 참고 사항 #!/usr/bin/env
이 때문에 관용구 #!/usr/bin/env interpreter
가 아닌 이유 가 사용됩니다 #!/usr/bin/interpreter
. 쉘처럼 변수 를 검색 한 다음 명령 실행으로 대체env
하는 execvp()
기능을 사용하기 때문에 프로그램에 대한 전체 경로가 필요하지 않습니다 . 따라서 인터프리터 (perl 또는 python과 같은)가 경로에 "있는"위치를 찾는 데 사용할 수 있습니다.PATH
또한 현재 경로를 수정함으로써 어떤 파이썬 변종이 호출 될지에 영향을 줄 수 있음을 의미합니다. 이것은 다음을 가능하게합니다.
echo -e '#!/usr/bin/bash\n\necho I am an evil interpreter!' > python
chmod a+x ./python
export PATH=.
calibre
Calibre를 시작하는 대신
I am an evil interpreter!
export key=value
구문을 확장하고 휴대용 스크립트 (예에서 사용할 수 없습니다#! /bin/sh
).