bash에서 "exec echo some; echo test"를 실행하면 "some test"가 인쇄되지 않습니까?

bash에서 "exec echo some; echo test"를 실행하면 "some test"가 인쇄되지 않습니까?

Bash에서 실행하면 exec echo "some "; echo "test""일부 테스트"가 인쇄되지 않습니까?

exec나는 작은 쉘 스크립트를 작성 중이고 명령을 호출한 후에는 아무것도 계속하지 않기를 원하므로 이 문제에 대한 확인을 찾고 있습니다.

제가 이해한 바에 따르면, 걱정할 필요는 없다고 생각합니다.

  • man 3 exec
  • man 1p exec

쉘 스크립트는 쉘에 의해 실행될 때 다음을 발생시킵니다.

  1. 쉘은 프로그램을 실행하는데 exec,
  2. exec***다음과 같이 일련의 시스템 호출을 사용하여 스크립트를 실행하는 쉘/bash를 대체하십시오.방해하다쉘의 추가 작업("교체 중")

언급했듯이 이 질문의 주요 목표는 echo testexec를 실행한 후 스크립트에서 발생하는 모든 일을 방지하기 위해 내 추론을 확인하는 것입니다.

가능한 한 일반적인 답변(POSIX)을 얻고 싶습니다. 하지만 혹시 모르니 GNU/Linux와 GNU/Bash에 가장 관심이 있습니다.

답변1

그런데 exec성공하면 현재 쉘을 대체하므로 다음 명령은 실행되지 않습니다. err..

하지만,적어도 Bash에서는,만약에exec 실패하다:

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

만약에주문하다제공되면 새 프로세스를 생성하지 않고 셸을 교체합니다. [...] 만약에주문하다어떤 이유로든 실행할 수 없습니다. 쉘 옵션이 활성화되어 있지 않으면 비대화형 쉘이 종료됩니다 execfail. 이 경우 실패를 반환합니다.

그래서 그런 것조차도 bash -c 'exec /bin/nosuchfile; echo foo'누락된 프로그램 파일에 대한 오류 메시지를 인쇄할 뿐입니다. 스크립트의 오류를 처리하려면 다음과 같은 것이 필요합니다.

#!/bin/bash
shopt -s execfail
exec /someprogram
echo whoops, it failed

그러나 에서 여전히 오류 메시지가 나타납니다 exec. 리디렉션 exec하는 경우아직도 작동해요exec실패 후에도 스크립트가 계속되는 경우 .

답변2

내장 exec함수(명령 인수 1 포함)는 셸 프로세스 2를 대체합니다. 쉘 프로세스의 후속 코드는 실행되지 않습니다.

exec echo "some "; echo "test"따라서 인쇄하는 유일한 방법은 실행 가능한 명령이 PATH에서 호출되고 some text실행 파일이 대신 인쇄되는 경우입니다. 일반적인 상황에서는 실행 파일이 이런 방식으로 명명된 명령에서 예상대로 작동합니다.echosome textsomeechoecho

echo호출 실행 파일이 PATH에 없거나 실행에 실패하면 exec오류 메시지가 표시되고 셸이 종료됩니다. 이 경우에도 echo "test"실행되지 않습니다.

명령 인수가 없으면 다른 짐승입니다. 셸 프로세스를 대체하지 않고 리디렉션만 적용합니다. ² 하위 셸에서는 하위 셸만 영향을 받으며 상위 셸은 정상적으로 계속 실행됩니다. exec

답변3

exec항상 완전한 스크립트만약에명령을 실행하고 성공적으로 수행합니다(명령의 종료 코드와 관련이 없지만 시작과 관련됨).

exec매우 유용한 방법으로 명령 없이 실행할 수 있습니다. 파일 설명자를 영구적으로 리디렉션합니다.

exec 3>/path/to/file

명령이 시작되지 않으면 셸 동작은 구성에 따라 달라집니다. bash기본적으로 종료합니다.

대신 함수를 사용하는 것이 더 나을 것입니다.

safe_exec () {
    cmd="$1"
    if test -z "$cmd" || ! test -f "$cmd" || ! test -x "$cmd"; then
        exit 1
    else
        exec "$@"
    fi
}

safe_exec echo "some "; echo "test"

관련 정보