Bash 함수에서 반환 및 종료 간의 차이
사이의 차이점은 무엇입니까?return
그리고.exit
종료 코드와 관련된 Bash 함수의 문장?
man bash
return [n]
;
함수가 실행을 중지하고 n이 지정한 값을 호출자에게 반환하도록 합니다.n을 생략하면 반환 상태는 함수 본체에서 마지막으로 실행된 명령의 반환 상태입니다.
exit [n]
:
셸을 n 상태로 종료합니다.n을 생략하면 마지막으로 실행된 명령의 종료 상태가 됩니다.EXIT의 트랩은 셸이 종료되기 전에 실행됩니다.
편집:
종료 코드와 하여, 당이편 질return
종료 코드와 관련이 없습니다.종료 코드는 기능이 아닌 응용 프로그램/스크립트용입니다.따라서 이와 관련하여 스크립트의 종료 코드를 설정하는 유일한 키워드(콜링 프로그램이 사용하여 잡을 수 있는 키워드)는$?
variable은 "(으)"입니다.exit
.
편집 2:
에 대한 나의 마지막 진술은exit
댓글이 달렸어요.차별화하기 위해 만들어졌습니다.return
그리고.exit
OP의 이해를 위해, 그리고 사실, 프로그램/쉘 스크립트의 어떤 특정한 지점에서,exit
호출 프로세스에 대한 종료 코드로 스크립트를 종료하는 유일한 방법입니다.
코드"를합니다. 이 는 "종료 코드"를 합니다.$?
코드에 이며, 해당코 대변며이수, 할수있다니습사와 함께 할 수 .if
,&&
다른 명령을 조건부로 실행할 수 있는 연산자입니다.
코드 이한종및코드값(러료값)))의 값$?
variable은 각 실행에 됩니다.
덧붙여서, 스크립트에 의해 실행된 마지막 명령어의 종료 코드는 호출 프로세스에서 볼 수 있는 스크립트 자체의 종료 코드로 사용됩니다.
마지막으로, 함수는 호출될 때 종료 코드와 관련하여 셸 명령 역할을 합니다.(기능 내) 기능의 종료 코드는 다음을 사용하여 설정됩니다.return
함수에 는 래서함수있을때에그.return 0
실행하면 종료되고 가 00이 .
return
현재 기능이 범위를 벗어나는 동안exit
스크립트가 호출되는 지점에서 종료됩니다.다음은 이를 설명하는 데 도움이 되는 샘플 프로그램입니다.
#!/bin/bash
retfunc()
{
echo "this is retfunc()"
return 1
}
exitfunc()
{
echo "this is exitfunc()"
exit 1
}
retfunc
echo "We are still here"
exitfunc
echo "We will never see this"
산출량
$ ./test.sh
this is retfunc()
We are still here
this is exitfunc()
저는 그들이 두 가지가 어떻게 사용되는지 설명하지 않기 때문에 아무도 그 질문에 완전히 답하지 않았다고 생각합니다.좋아요. exit은 스크립트가 어디에서 호출되든 스크립트를 죽이며 exit, exit 0, exit 7 등과 같은 상태를 할당할 수 있습니다.다른 스크립트 등에 의해 호출된 경우 스크립트를 강제로 중지하는 방법을 결정하는 데 사용할 수 있습니다.출구는 충분합니다.
return은 호출될 때 함수의 동작을 나타내기 위해 지정된 값(일반적으로 1 또는 0)을 반환합니다.예:
#!/bin/bash
isdirectory() {
if [ -d "$1" ]
then
return 0
else
return 1
fi
echo "you will not see anything after the return like this text"
}
다음과 같이 확인합니다.
if isdirectory $1; then echo "is directory"; else echo "not a directory"; fi
이런 식으로.
isdirectory || echo "not a directory"
이 예에서 테스트는 디렉터리가 발견되었는지 여부를 나타내는 데 사용될 수 있습니다.반환 후에는 함수에서 실행되지 않습니다.0은 true이지만 셸에서 false는 1이며 다른 프로그래밍 언어와 다릅니다.
참고: isdirectory 기능은 교육용으로만 제공됩니다.이것은 실제 스크립트에서 이러한 옵션을 수행하는 방법이 아닙니다.*
함수는 스크립트 내부에 있으며 일반적으로 반환 문을 사용하여 호출된 위치에서 반환됩니다.외부 스크립트를 호출하는 것은 완전히 별개의 문제이며 스크립트는 일반적으로 종료 문으로 끝납니다.
"종료 코드와 관련된 Bash 함수의 반환문과 종료문" 간의 차이는 매우 작습니다.둘 다 값 자체가 아니라 상태를 반환합니다.상태가 0이면 성공을 나타내고 다른 상태(1 ~ 255)는 실패를 나타냅니다.반환 문은 호출된 스크립트로 되돌아가고 종료 문은 발생한 모든 위치에서 전체 스크립트를 종료합니다.
return 0 # Returns to where the function was called. $? contains 0 (success).
return 1 # Returns to where the function was called. $? contains 1 (failure).
exit 0 # Exits the script completely. $? contains 0 (success).
exit 1 # Exits the script completely. $? contains 1 (failure).
함수가 반환문 없이 단순히 종료되는 경우 마지막으로 실행된 명령의 상태가 상태 코드로 반환됩니다.$?
).
및 종료는 코드를 합니다. 이는 0부터 255까지입니다.$?
상태 코드에 다른 항목을 입력할 수 없습니다(예: "cat" 반환). 작동하지 않습니다.그러나 스크립트는 상태 코드를 사용하여 255개의 서로 다른 실패 이유를 전달할 수 있습니다.
호출 스크립트에 포함된 변수를 설정하거나 함수에서 에코 결과를 설정하고 호출 스크립트에서 명령 대체를 사용할 수 있습니다. 그러나 반환 및 종료의 목적은 C와 같은 프로그래밍 언어에서 예상되는 값 또는 계산 결과가 아니라 상태 코드를 전달하는 것입니다.
다음을 사용하여 스크립트를 실행할 수 있습니다..
또는source
.
. a.sh
당신이 한다면.exit
에 시대에a.sh
스크립트를 종료할 뿐만 아니라 셸 세션도 종료합니다.
를 포함하는 경우return
에서a.sh
단순히 스크립트 처리를 중지합니다.
exit
현재 프로세스를 종료합니다. 종료 코드가 있든 없든 이 프로세스를 프로그램 기능 이상의 시스템으로 간주합니다.소싱할 때는exit
껍데기를 끝낼 것입니다.그러나 실행 시에는exit
대본return
함수에서 호출 후 반환 코드가 있든 없든 지침으로 돌아갑니다.return
선택 사항이며 함수의 끝에 암시적입니다.return
함수 내부에서만 사용할 수 있습니다.
덧붙이고 싶은 것은 출처가 있는 동안, 하기가 쉽지 않다는 것입니다.exit
셸을 죽이지 않고 함수 내에서 스크립트를 생성합니다.예를 들어 '테스트' 스크립트가 더 낫다고 생각합니다.
#!/bin/bash
function die(){
echo ${1:=Something terrible wrong happen}
#... clean your trash
exit 1
}
[ -f /whatever/ ] || die "whatever is not available"
# Now we can proceed
echo "continue"
다음 작업을 수행합니다.
user$ ./test
Whatever is not available
user$
test
껍질이 닫힐 겁니다
user$ . ./test
Whatever is not available
.test
완료되고 프롬프트가 표시됩니다.
를 해책은잠절포것입다니는함하에 동봉하는 입니다.(
그리고.)
:
#!/bin/bash
function die(){
echo $(1:=Something terrible wrong happen)
#... Clean your trash
exit 1
}
( # Added
[ -f /whatever/ ] || die "whatever is not available"
# Now we can proceed
echo "continue"
) # Added
이제, 두 경우 모두에 한해test
종료됩니다.
OP의 질문:종료 코드와 관련하여 BASH 함수에서 반환문과 종료문의 차이점은 무엇입니까?
첫째, 다음과 같은 사항을 명확히 해야 합니다.
(function|shell)의 실행을 종료하려면 (return|exit) 문이 필요하지 않습니다.A(function|shell)는 코드 목록의 끝에 도달하면 종료되며, (return|exit) 문이 없어도 종료됩니다.
종료된(function|shell)에서 값을 다시 전달하기 위해 (return|exit) 문이 필요하지 않습니다.가 내장되어 있습니다.
$?
항상 숫자 값을 가집니다."?=1"처럼 설정할 수 없는 특수 변수이지만 특수한 방식으로만 설정됩니다(아래 * 참조).(함수 | 하위 셸이라고 함)에서 마지막으로 실행되는 명령 뒤에 $? 값은 (함수 호출자 | 상위 셸)로 다시 전달되는 값입니다.이는 마지막으로 실행된 명령어가 ("return [n]|"exit [n]")이든 플레인("return")이든 호출된 함수 코드의 마지막 명령어가 되는 다른 명령어든 마찬가지입니다.
위의 글머리 기호 목록에서 항상 첫 번째 항목 또는 항상 두 번째 항목에서 함수 및 반환에 대한 문을 가져오거나 셸 및 종료를 각각 선택합니다.
분명한 것은 두 가지 모두 특수 변수의 공통된 사용법을 공유한다는 것입니다.$?
값이 종료된 후 위쪽으로 전달됩니다.
이제 특별한 방법으로$?
설정 가능:
- 인 $?와 .
$?
종료된 기능으로. - 부모 셸이 암시적으로 또는 명시적으로 단일 하위 셸에서 대기하고 해당 하위 셸의 종료에 의해 해제될 때,
$?
에서 는 상위 셸서 최값 같과 것니 값과 같을 입니다.$?
종료된 하위 셸에서. - 일부 는 일부내함수수있다니습정을 할 수 .
$?
그들의 결과에 따라하지만 몇몇은 그렇지 않습니다. - 함수 "에 올 때 "return", "exit", "exit" 모두 됩니다.
$?
그들의 주장으로, 그리고 집행을 종료합니다.
는 것을 주목할 필요가 있습니다.$?
다음과 같이 하위 셸에서 exit를 호출하여 값을 할당할 수 있습니다.
# (exit 259)
# echo $?
3
간단한 단어(주로 코딩 초보자용)로, 우리는 다음과 같이 말할 수 있습니다.
`return`: exits the function,
`exit()`: exits the program (called as process while running)
그리고 만약 당신이 관찰했다면, 이것은 매우 기본적인 것이지만,
`return`: is the keyword
`exit()`: is the function
Bash 스크립트를 함수로 변환하는 경우 일반적으로exit N
와 함께return N
함수를 호출하는 코드는 하위 프로세스의 종료 코드와 동일하게 반환 값을 처리합니다.
용사를 합니다.exit
함수 내부에서 전체 스크립트를 강제로 종료됩니다.
다른 몇 가지 답변에 실행 가능한 측면 추가:
둘 다 종료 코드(기본값 또는 함수에 의해 정의됨)를 제공할 수 있으며, 종료 및 복귀 모두 성공할 경우 '기본값'은 0입니다.모든 상태는 성공을 포함하여 사용자 지정 번호 0-255를 가질 수 있습니다.
반환은 현재 셸에서 실행되는 대화형 스크립트에 자주 사용됩니다.. script.sh
예를 들어, 호출 셸로 돌아갑니다.셸에 수 . - 그면반코호출셸에액수있다습니할세스드환러는.$?
정의된 반환 상태를 제공합니다.이 경우 종료하면 셸도 닫힙니다(SSH 연결 포함).
스크립트가 실행 가능하고 다른 스크립트 또는 셸에서 호출되며 하위 셸에서 실행되는 경우 종료가 필요합니다.그러면 종료 코드가 호출 셸에 액세스할 수 있습니다. 이 경우 반환은 오류를 제공합니다.
은일단.return
이고 키입니다드입니다.exit
는 함수입니다.
그렇긴 하지만, 여기 간단한 설명이 있습니다.
return
함수에서 값을 반환합니다.
exit
현재 셸 밖으로 나가거나 현재 셸을 버립니다.
언급URL : https://stackoverflow.com/questions/4419952/difference-between-return-and-exit-in-bash-functions
'source' 카테고리의 다른 글
TestFlight에서 규정 준수 상태 (0) | 2023.05.22 |
---|---|
Python 2 및 Python 3의 정수 분할 (0) | 2023.05.22 |
SourceKit 서비스가 CPU를 사용하고 X코드를 그라인딩하여 중지 (0) | 2023.05.17 |
.NETIL .maxstack 지시어는 어떻게 작동합니까? (0) | 2023.05.17 |
ng-filename : 단일 필드로 필터링 (0) | 2023.05.17 |