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.sh
bash 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
, 터미널 창 가까이뿐만 아니라 / 첨자 끝을 종료합니다.
답변
이것은 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와 함께 디자인 문제라고 승인합니다.
답변
나는 똑같은 문제를 겪었고 위의 대답과 궁극적으로 나를 위해 일한 것이 무엇인지 이해했다.
-
예를 들어, 의도 된 스크립트를 호출하는 shebang 행이 있어야합니다.
#!/bin/bash
bash
스크립트를 실행하는 데 사용
나는 두 종류의 shebang을 가진 대본을 가지고 있습니다. 이 때문에, 사용 sh
또는 것은 .
그것이 잘못된 실행으로 이어질로, 믿을 수 없었다 (같은 때 불완전하게 실행하는 데 밖으로 스크립트 보석금)
그러므로 그 대답은
-
- 스크립트에 shebang이 있는지 확인하여 의도 한 핸들러에 대해 의심의 여지가 없도록하십시오.
- .sh 파일을 chmod하여 실행할 수 있도록합니다.
(chmod +x file.sh)
-
sh
또는 없이 직접 호출.
(./myscript.sh)
이것이 비슷한 질문이나 문제가있는 사람에게 도움이되기를 바랍니다.