저는 사용자가 자신의 셸에 소스를 제공해야 하는 이식성이 뛰어난 스크립트를 개발 중입니다. 이로 인해 POSIX 스크립트를 사용해야 합니다.
스크립트에는 유용한 함수가 많이 있으며, 그 중 하나는 호출 함수의 상태를 반환한다는 점에서 특별합니다
true
.false
return 0
자, 저는 이런 상황에서 그것을 사용했습니다. 그러나 더 읽기 쉽고 true
for false
도 return 1
각각 작동하는 것 같습니다 .
문제는 이것이 유효한지 여부입니다.아주 똑같은 방식으로아니면 차이가 있는 경우입니다. 감사해요.
답변1
true
이식 가능하지만 자체적으로 반환되지는 않습니다. return true
이식성이 없으며 안정적으로 작동하지 않습니다.
다음과 같은 기능이 있는 경우:
f() {
true
}
그렇다면 예, 종료 상태가 0인 함수에서 반환됩니다. 끝에서 떨어지면 마지막 명령의 종료 상태를 함수의 종료 상태로 반환합니다.
그러나 물론 true
중간체 자체가 제어 흐름에 영향을 주지 않기 때문에 이는 실제 상태로 반환되지 않습니다.
g() {
# silly example condition
if [ 1 = 1 ]; then
true
fi
echo something else
false
}
하지만 명시적인 반환을 추가할 수 있습니다.인수가 없으면 return
마지막 명령의 종료 상태도 사용됩니다.:
특수 매개변수 '?'의 값은 n(부호 없는 십진 정수)으로 설정되어야 하며, n이 지정되지 않은 경우 마지막으로 실행된 명령의 종료 상태로 설정되어야 합니다. n이 부호 없는 십진 정수가 아니거나 255보다 큰 경우 결과는 지정되지 않습니다.
h() {
# silly example condition
if [ 1 = 1 ]; then
true
return
fi
echo something else
false
}
이제 시도하면 return true
일부 쉘에서 원하는 대로 작동할 수 있지만 궁극적으로는 그렇지 않을 수도 있습니다. 적어도 zsh에서는 인수를 산술 표현식으로 처리하는 것으로 보이므로 return true
변수 값이 사용되며 true
설정되지 않은 경우 기본값은 0입니다.
% i() { return 1+1; }
% i; echo $?
2
% unset true
% j() { return true; }
% j; echo $?
0
% true=123
% j; echo $?
123
and true
를 항상 and 로 설정하고 스크립트 라이브러리 사용자가 이를 혼동하지 않을 것이라고 신뢰할 수 있다면 zsh 또는 표준 쉘에서 and 를 사용할 수 있습니다 . 이러한 이름을 사용하는 것은 권장하지 않지만, 또는 같은 이름을 사용할 수도 있습니다.0
false
1
return true
return false
return "$true"
return "$false"
true_return_value
false_return_value
그렇지 않으면 표준 쉘에서 true; return
and 를 사용할 수 있지만 이것이 and 보다 읽기 쉬운 false; return
지는 잘 모르겠습니다 . 어떤 경우든 쉘 프로그래머는 실제 반환 값이 0이라는 사실을 잘 알고 있어야 합니다.return 0
return 1
답변2
true
이식 가능한 유효한 부울 값이 아닙니다 false
.
예를 들어, 간단한 쉘 스크립트
f()
{
return true
}
f && echo whee
다른 쉘에서 실행하는 경우:
$ sh x
return: Illegal number: 'true'
$ bash x
x: line 3: return: true: numeric argument required
$ ksh93 x
whee
$ zsh x
whee
$ ksh x
x[6]: true: bad number
(마지막 쉘은 pdksh 5.2.14입니다)
하지만 return 0
휴대성이 좋아요
$ cat x
f()
{
return 0
}
f && echo whee
$ sh x
whee
$ bash x
whee
$ ksh93 x
whee
$ zsh x
whee
$ ksh x
whee
0이 true로 간주되면 반환을 볼 수도 있으므로 작동합니다 &&
.
이제 우리는 속일 수 있습니다 ...
f()
{
true
}
그것이 하는 일은 true
명령을 호출하는 것입니다... 그런 다음 명시적인 함수가 없는 함수의 반환 코드가 return
마지막 명령 실행의 반환 값이라는 사실을 사용합니다.
그래서 비록 이것이일하다명시적인 동작이 없고 return
암시적인 동작에 의존하기 때문에 읽기가 어렵습니다.
답변3
- return 유틸리티는 쉘이 현재 함수 또는 도트 스크립트 실행을 중지하도록 해야 합니다. 쉘이 현재 함수나 도트 스크립트를 실행하고 있지 않으면 결과는 지정되지 않습니다.
- 특수 매개변수 '?'의 값은 n(부호 없는 십진 정수)으로 설정되어야 하며, n이 지정되지 않은 경우 마지막으로 실행된 명령의 종료 상태로 설정되어야 합니다. n이 부호 없는 십진 정수가 아니거나 255보다 큰 경우 결과는 지정되지 않습니다. 트랩 작업 내에서 리턴이 실행되는 경우 마지막 명령은 트랩 작업 직전에 실행된 명령으로 간주됩니다.
그래서:
return
함수뿐만 아니라 소스 스크립트(도트 스크립트)의 반환을 사용할 수 있습니다 .0개 또는 1개의 인수를 전달할 수 있습니다(옵션 없음,
--
받아들여지지 않을 수도 있다), 그러나 부호 없는 10진수 정수(0
,1
,2
...true
,0x1
,-1
, 가 아니라+1
불명확하고 실제로 이식 가능하지 않음)여야010
하며 10진수 대신 8진수로 처리될 수 있으며 실제로는 zsh와 같습니다. 동일한 상황 sh 에뮬레이션으로)return
매개 변수 없이 이전 명령의 상태를 반환하므로 성공적인{ true; return; }
종료 상태를 반환하는 방법이 될 수 있습니다. 이는{ false; return; }
0이 아닌(실패) 종료 상태를 반환하지만 어떤 종료 상태가 반환되는지는 지정되지 않습니다 (false
사실 다른 것을 사용하는 구현을 본 적이 없습니다 옵션이 활성화된 경우(해결 가능) )를 사용합니다 . 이것이 작동할 것인지 또는 작동해야 하는지 는 불분명합니다 . 사실 dash나 mksh에는 없기 때문에 이식성이 없습니다.1
false
errexit
{ false || return; }
return $(true)
return $(false)
무엇인지는 확실하지 않습니다.쉘은 현재 함수나 도트 스크립트를 실행하고 있지 않습니다.정확히. 어떤 사람들은
return
서브쉘이 함수나 도트 스크립트에서 실행되더라도 이를 서브쉘에서 사용되는 것으로 해석합니다.예함수 본문(예:f() (return 1)
)이 지정되지 않았습니다. 그러나 실제로return
이러한 경우 동작은 다음과 같습니다exit
. 현재 서브셸에서 종료/반환하지만 둘러싸는 함수/점 스크립트에서는 종료되지 않습니다.어쨌든 함수/점 스크립트에서 반환하는 작업은 해당 하위 쉘이 함수/점 스크립트의 마지막 명령이 아닌 경우 하위 쉘 외부에서 수행되어야 합니다. 하위 쉘의 구성은 쉘마다 다르다는 점을 기억하십시오. 예를 들어:
f() { cmd | { IFS= -r read var || return echo whatever cat } echo Here }
return
ksh 또는 zsh의 함수에서 반환되지만 bash(이 옵션이 설정되지 않은 경우) 또는 dash, mksh에서는 반환되지 않습니다.lastpipe
이는 모든 파이프라인 구성 요소, 심지어 하위 셸의 마지막 실행(POSIX 허용)이기 때문입니다. 따라서 다음과 같은 방법으로 해결해야 합니다.f() { cmd | { IFS= -r read var || return echo whatever cat true } || return echo Here }
서브쉘을 강제로 사용하고 그 안에서 사용하면 POSIX와 확실히 호환되고 쉘 전체에서 일관된 동작을 유지할 수 있습니다(그리고 변수 할당이 파이프에서 유지되지 않을 수 있다는
exit
점을 더 명확하게 만듭니다 ).$var
read
f() { cmd | ( IFS= -r read var || exit echo whatever cat true ) || return echo Here }
(이러한 모든
return
/ 에서는exit
실패 종료 상태가 반환됩니다 . / 로 변경하여 특정 실패 종료 상태 값을 제공read
할 수 있습니다 )exit 1
return 1
! return
or 의 동작은! return 1
이식 가능하지 않습니다( for 에는 그다지 유용하지 않지만return
for 가 실패한 종료 상태로 루프에서 벗어날 수 있는 이식 가능한 경우 더 유용할 것입니다).! break
옵션 설정의 특별한 경우가 언급되지 않는 한(그리고 그 효과가 어떻게든 취소되지 않는 한), 어떤 상황에서도 true
and false
명령은 포함하는 함수/점 스크립트를 반환하지 않습니다. 이 경우 실패한 명령에 포함되어 쉘 프로세스가 다음 과 같이 됩니다. 종료(반드시 포함하는 함수/점 스크립트만 포함할 필요는 없음), 이는 일반적으로 내장된 일반 명령이지만 그렇지 않습니다.errexit
false
특수 내장 기능//와 반대되는 제어 흐름 return
연산자는 break
말할 것도 없습니다.continue
코드를 더 명확하게 만들기 위해 선택적으로 성공 및 실패 종료 상태에 대한 변수를 정의할 수 있습니다. 예를 들면 다음과 같습니다.
ok=0 true=0 success=0 yes=0 on=0
failure=1 false=1 no=1 off=1
return "$true"
or return "$false"
or 는 와 동일합니다 . zsh에서는 or 또는 exit
로 단순화할 수 있습니다 .return $true
return true
그러나 산술 표현식에서는 의미가 반전됩니다. C에서와 마찬가지로 0은 거짓을 의미하고 다른 값은 참을 의미합니다. 따라서 while (( true ))
Korn과 유사한 쉘에서 이러한 변수의 값은 예상대로 작동하지 않으므로 / status_ok
대신 이러한 변수의 이름을 변수 status_failure
로 지정하는 것이 좋습니다 .ok
failure