[linux] bash 스크립트를 종료하지만 터미널을 종료하지 않는 방법

exit쉘 스크립트에서 명령을 사용 하면 스크립트가 터미널 (프롬프트)을 종료합니다. 스크립트를 종료 한 다음 터미널에 머무를 수있는 방법이 있습니까?

내 스크립트 run.sh는 직접 또는 다른 스크립트에서 제공함으로써 실행됩니다.

편집 : 더 구체적으로 두 스크립트 run2.sh가 있습니다

...
. run.sh
echo "place A"
...

run.sh같은

...
exit
...

나는하여 실행할 때 . run2.sh, 그리고 그것을 공격하는 경우 exit에 코드 라인을 run.sh, 나는 그것이 단자에 중지하고 거기에 있고 싶어. 그러나를 사용 exit하면 전체 터미널이 닫힙니다.

추신 : 사용하려고 return했지만 코드 라인 echo이 계속 실행됩니다 ….



답변

“문제”는 실제로 스크립트를 소싱하고 실행하지 않는다는 것입니다. 파일을 소싱 할 때, 그 내용은 서브 쉘을 생성하는 대신 현재 쉘에서 실행됩니다. 따라서 종료를 포함하여 모든 것이 현재 쉘에 영향을 미칩니다.

을 사용하는 대신을 사용 exit하려고합니다 return.


답변

예; return대신 사용할 수 있습니다 exit. 주요 목적은 쉘 함수에서 리턴하는 것이지만 source-d 스크립트 내에서 사용하면 해당 스크립트에서 리턴됩니다.

으로 의 §4.1 “Bourne 쉘 내장 명령” 강타 참조 설명서 풋 그것은 :

     return [n]

쉘 함수가 리턴 값 n 으로 종료되도록합니다 . 경우 N이 공급되지 않으며, 반환 값은 함수에서 실행 된 마지막 명령의 종료 상태입니다. 이도에 실행되는 스크립트의 실행을 종료하기 위해 사용될 수있다 .(또는 source하나 반환) 내장 해당 스크립트의 종료 상태와 스크립트에서 실행 된 마지막 명령의 종료 상태 또는. RETURN트랩 과 관련된 모든 명령 은 기능 또는 스크립트 이후 실행이 재개되기 전에 실행됩니다. 또는 return로 스크립트 실행 중에가 아닌 함수 외부에서 사용되는 경우 반환 상태는 0 이 아닙니다 ..source


답변

을 사용하여 스크립트를 실행하는 대신 또는 . run2.sh을 사용하여 스크립트를 실행할 수 있습니다sh run2.shbash run2.sh

새로운 하위 셸이 시작되고 스크립트를 실행 한 다음 스크립트 끝에서 닫히고 다른 셸은 열린 상태로 유지됩니다.


답변

return 문 / 명령 뒤에 여분의 exit 명령을 추가하여 명령 줄에서 스크립트를 실행하고 터미널에서 소싱 할 수 있습니다.

스크립트의 예제 종료 코드 :

   if [ $# -lt 2 ]; then
     echo "Needs at least two arguments"
     return 1 2>/dev/null
     exit 1
   fi

exit명령 뒤에 스크립트를 소싱 할 때 명령이 있는 행은 호출되지 않습니다 return.

스크립트를 실행할 때 return명령에 오류가 발생합니다. 따라서 오류 메시지를로 전달하여 표시하지 않도록합니다 /dev/null.


답변

실제로, 나는 당신이 어떻게 뭉치 게되는지 혼란스러워 할 것이라고 생각합니다 run a script.

내장 스크립트가로 끝나더라도 sh스크립트를 실행하는 데 사용 하는 sh ./run2.sh경우 exit터미널 창이 계속 유지됩니다.

당신이 사용하는 경우 .또는 source, 터미널 창 가까이뿐만 아니라 / 첨자 끝을 종료합니다.

자세한 내용 은 사용 ? 의 차이점은 무엇입니까? 를 참조하십시오 .shsource


답변

이것은 run2.sh 스크립트 안에 run 함수를 넣는 것과 같습니다. bash tty에서 run2.sh 파일을 소싱하는 동안 실행 내부 종료 코드를 사용합니다. 실행 기능에 스크립트를 종료 할 수있는 전원을 제공하고 run2.sh에 종료자를 종료 할 수있는 전원을 제공하십시오. 그런 다음 실행 기능에는 테미 네이터를 종료하는 전원이 있습니다.

    #! /bin/sh
    # use . run2.sh

    run()
    {
        echo "this is run"
        #return 0
        exit 0
    }

    echo "this is begin"
    run
    echo "this is end"

어쨌든, 나는 Kaz와 함께 디자인 문제라고 승인합니다.


답변

나는 똑같은 문제를 겪었고 위의 대답과 궁극적으로 나를 위해 일한 것이 무엇인지 이해했다.

  1. 예를 들어, 의도 된 스크립트를 호출하는 shebang 행이 있어야합니다.

    #!/bin/bashbash스크립트를 실행하는 데 사용

나는 두 종류의 shebang을 가진 대본을 가지고 있습니다. 이 때문에, 사용 sh또는 것은 .그것이 잘못된 실행으로 이어질로, 믿을 수 없었다 (같은 때 불완전하게 실행하는 데 밖으로 스크립트 보석금)

그러므로 그 대답은

    • 스크립트에 shebang이 있는지 확인하여 의도 한 핸들러에 대해 의심의 여지가 없도록하십시오.
    • .sh 파일을 chmod하여 실행할 수 있도록합니다. (chmod +x file.sh)
    • sh또는 없이 직접 호출.

      (./myscript.sh)

이것이 비슷한 질문이나 문제가있는 사람에게 도움이되기를 바랍니다.