`exec "$@"`는 무엇을 합니까?

`exec "$@"`는 무엇을 합니까?

최근에 많은 스크립트에서 이것을 보았지만 docker-entrypoint.sh온라인에서 설명을 찾을 수 없습니다. 나의 첫 번째 생각은 이것이 신호와 관련이 있다는 것이었지만 그것은 꽤 터무니없는 추측이었습니다.

답변1

"$@"비트는 단어 분리 및 파일 이름 생성("와일드카드")을 방지하기 위해 개별적으로 인용되는 위치 인수 목록(일반적으로 명령줄 인수)으로 확장됩니다.

exec현재 프로세스를 해당 인수를 실행하여 생성된 프로세스로 바꿉니다 .

즉, exec "$@"명령줄 인수에 의해 제공된 명령은 현재 프로세스가 대체된 상태로 실행됩니다( exec명령이 실행될 수 있는 경우).

답변2

다른대답은 무엇을 설명합니다 exec "$@".스택 오버플로에 대한 이 답변Docker에 중요한 이유를 설명했으며 짐작한 대로 신호와 관련이 있습니다.

이는 Docker에서 신호를 적절하게 프록시하는 데 매우 중요합니다. 예를 들어 Redis가 이 기능 없이 시작되면 켜짐을 exec받지 못하며 완전히 종료될 기회도 없습니다. 어떤 경우에는 데이터 손실이나 좀비 프로세스가 발생할 수 있습니다.SIGTERMdocker stop

하위 프로세스를 시작하면(즉, 사용하지 않음 exec) 상위 프로세스가 신호를 적절하게 처리하고 전달할 책임이 있습니다. supervisord컨테이너에서 여러 프로세스를 실행할 때 이것이 가장 잘 사용되거나 유사한 이유 중 하나는 신호를 적절하게 전달한다는 것입니다.

답변3

"$@"Bourne과 같은 셸에서 목록 컨텍스트는 모든 위치 인수를 별도의 인수로 확장합니다.

스크립트에서 처음에 위치 매개변수는 스크립트 자체에서 받은 매개변수입니다.

exec쉘과 동일한 프로세스에서 명령을 실행하는 것입니다. 이는 스크립트가 실행할 마지막 명령입니다. 그 이후에는 프로세스가 셸 외부에서 다른 명령을 실행하기 때문입니다.

따라서 스크립트가

#! /bin/sh -
exec "$@"

그런 다음 셸 명령줄을 사용하여 스크립트를 호출합니다. 예를 들면 다음과 같습니다.

/path/to/your-script 'echo' "some  test" 'x y'

이는 이전에 쉘이 실행되었던 것과 동일한 프로세스에서 실행될 인수 exec로 및 echo인수 로 호출 되며 (대부분의 구현 에서는 내장된 쉘이 아닌) 스크립트는 및 인수로 해석됩니다.some testx yechosh/bin/echoechosome testx y

관련 정보