`exec command [arguments]`의 `command [arguments]`가 실행되는 실행 환경은 무엇입니까?

`exec command [arguments]`의 `command [arguments]`가 실행되는 실행 환경은 무엇입니까?

배쉬 매뉴얼에서

구현하다

exec [-cl] [-a name] [command [arguments]]

명령이 제공되면 새 프로세스를 생성하지 않고 셸을 교체합니다. -l 옵션이 제공되면 쉘은 명령에 전달된 0번째 인수의 시작 부분에 대시를 배치합니다. 이것이 로그인 프로그램이 하는 일입니다.-c 옵션을 사용하면 명령이 빈 환경에서 실행됩니다..

옵션 이 없는 경우 -c실행의 실행 환경은 무엇입니까 command [arguments]?

  • 실행 전의 원래 쉘 프로세스와 동일한 실행 환경인가요 exec command [arguments]?

  • 원래 쉘 프로세스의 실행 환경에는 환경 변수뿐만 아니라 비환경 변수를 포함한 모든 쉘 변수도 포함됩니다. command에서 실행 중인 실행 환경에는 exec command원래 셸 프로세스의 비환경 변수도 포함되어 있나요?

이를 증명할 수 있는 몇 가지 예를 들어주실 수 있나요?

답변1

두 가지 다른 사항을 혼동하고 있습니다.실행 환경그리고환경 변수.

name=value환경 변수는 명령 및 프로세스에 대한 구성 양식으로 사용되는 형식의 문자열입니다 . 예를 들어, PATH명령의 파일 이름만 제공된 경우 실행 가능한 명령을 찾을 수 있는 콜론으로 구분된 디렉터리 목록입니다. 로케일 제어 LANGLC_시작하는 다양한 변수 등입니다.

실행 환경에는 명령 실행 방법에 영향을 미치는 모든 셸 기능이 포함됩니다. 물론 환경 변수뿐만 아니라 작업 디렉터리, 파일 생성 마스크( umask), 셸 함수, 정의된 별칭 등도 포함됩니다.

실행 시점(즉 , 쉘 이 명령 실행을 시작하는 순간)에서 실행 환경은 exec. 다른 프로세스) . 사용하면 환경 변수가 지워집니다. execEXITexec -c

-cBash의 플래그는 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결과 환경 변수를 인쇄하지만 다른 명령일 수도 있습니다.

관련 정보