배쉬 매뉴얼에서
구현하다
exec [-cl] [-a name] [command [arguments]]
명령이 제공되면 새 프로세스를 생성하지 않고 셸을 교체합니다. -l 옵션이 제공되면 쉘은 명령에 전달된 0번째 인수의 시작 부분에 대시를 배치합니다. 이것이 로그인 프로그램이 하는 일입니다.-c 옵션을 사용하면 명령이 빈 환경에서 실행됩니다..
옵션 이 없는 경우 -c
실행의 실행 환경은 무엇입니까 command [arguments]
?
실행 전의 원래 쉘 프로세스와 동일한 실행 환경인가요
exec command [arguments]
?원래 쉘 프로세스의 실행 환경에는 환경 변수뿐만 아니라 비환경 변수를 포함한 모든 쉘 변수도 포함됩니다.
command
에서 실행 중인 실행 환경에는exec command
원래 셸 프로세스의 비환경 변수도 포함되어 있나요?
이를 증명할 수 있는 몇 가지 예를 들어주실 수 있나요?
답변1
두 가지 다른 사항을 혼동하고 있습니다.실행 환경그리고환경 변수.
name=value
환경 변수는 명령 및 프로세스에 대한 구성 양식으로 사용되는 형식의 문자열입니다 . 예를 들어, PATH
명령의 파일 이름만 제공된 경우 실행 가능한 명령을 찾을 수 있는 콜론으로 구분된 디렉터리 목록입니다. 로케일 제어 LANG
로 LC_
시작하는 다양한 변수 등입니다.
실행 환경에는 명령 실행 방법에 영향을 미치는 모든 셸 기능이 포함됩니다. 물론 환경 변수뿐만 아니라 작업 디렉터리, 파일 생성 마스크( umask
), 셸 함수, 정의된 별칭 등도 포함됩니다.
실행 시점(즉 , 쉘 이 명령 실행을 시작하는 순간)에서 실행 환경은 exec
. 다른 프로세스) . 사용하면 환경 변수가 지워집니다. exec
EXIT
exec -c
-c
Bash의 플래그는 exec
환경 변수만 지웁니다. 당신이 달리면
bash -c `exec env`
새로운 Bash 셸을 시작한 다음 이를 명령으로 바꿉니다 env
. 다른 인수가 지정되지 않으면 모든 환경 변수가 단순히 출력됩니다. 그러나 -c
플래그가 exec
다음 에 추가되면
bash -c `exec -c env`
아무 것도 인쇄하지 않습니다. env
이는 환경 변수(즉, 빈 환경) 없이 실행되기 때문입니다.
(단지 exec env
터미널에서 실행하면 터미널에서 실행 중인 쉘이 명령으로 대체되고 env
종료되면 터미널이 닫힙니다. 너무 빨리 일어나서 여러분이 볼 수 없을 수도 있습니다. 그래서 Bash에서 명시적으로 실행합니다. 터미널이 사용하는 쉘이 아닌 하위 Bash가 교체됩니다.
나는 이것이 일반적으로 사용되기 -c
때문에 실제 스크립트에서 사용되는 옵션을 본 적이 없습니다 . env -i
예를 들어:
bash -c `exec env -i PATH=$PATH env`
매개변수를 사용하면 이 env
명령은 환경 변수를 수정하는 명령을 실행하는 데 사용됩니다. 이 -i
옵션은 처음부터 시작하는 데 사용됩니다. 즉, 기존 환경 변수를 모두 지웁니다. 쉘은 실행 전 전체 명령(라인)을 파싱하기 때문에 env -i VAR=$VAR OTHER=$OTHER
쉘이 명령라인을 파싱하는 동안 특정 환경변수를 기존 값으로 정의해 보존할 수 있다. env
위에서 final은 env
결과 환경 변수를 인쇄하지만 다른 명령일 수도 있습니다.