아래 샘플 스크립트에 대한 몇 가지 질문이 있습니다.
함수를 호출 _foo
하고 그 출력을 변수로 캡처하고 싶지만 반환 상태( OR $bar
이 아닐 수 있음 )를 사용하거나 실패 시(0이 아닌 경우) 스크립트를 중지하려고 합니다.0
1
exit
- 이렇게 호출하면 in 함수가 작동하지 않는 이유는 무엇입니까
exit
?_foo
(if ! bar="$(_foo)"
). "normal"이 호출되면 작동합니다.exit
if 문을 다음과 같이 변경하면(그러나 출력이 손실됨) 스크립트가 중지됩니다.if ! _foo ; then
- 이는 스크립트
exit
처럼 동작 하며 중지하지 않습니다.return
if ! bar="$(_foo)" ; then
- 할당과 종료 없이 함수를 호출하는 것만으로도 괜찮지만, 이렇게 호출하는 것은
var="$(func)"
아닙니다.
_foo
함수에서 into의 출력을 캡처$bar
하고 반환 상태를 사용하는 더 좋은 방법이 있습니까( 또는 문0
이외의 다른 경우 ?)1
case
어떻게든 사용해야 할 것 같은 느낌이 듭니다 trap
.
간단한 예는 다음과 같습니다.
#!/usr/bin/env bash
set -e
set -u
set -o pipefail
_foo() {
local _retval
echo "baz" && false
_retval=$?
exit ${_retval}
}
echo "start"
if ! bar="$(_foo)" ; then
echo "foo failed"
else
echo "foo passed"
fi
echo "${bar}"
echo "end"
출력은 다음과 같습니다.
$ ./foo.sh
start
foo failed
baz
end
다음은 몇 가지 추가 예입니다.
그러면 종료됩니다:
#!/usr/bin/env bash
set -e
set -u
set -o pipefail
func() {
echo "func"
exit
}
var=''
func
echo "var is ${var}"
echo "did not exit"
종료되지 않습니다.
#!/usr/bin/env bash
set -e
set -u
set -o pipefail
func() {
echo "func"
exit
}
var=''
var="$(func)"
echo "var is ${var}"
echo "did not exit"
답변1
exit
함수뿐만 아니라 함수 내에서 전체 스크립트를 종료합니다(하위 쉘에도 불구하고). 동화:
#!/bin/bash
f() {
exit 3
}
f
exit 0
위 스크립트는 종료 코드 3으로 종료됩니다.
#!/bin/bash
f() {
exit 3
}
(f)
exit 0
종료 코드 0으로 종료됩니다.
$(command)
사용 중인 구문은 하위 쉘 내에서 실행되며 command
하위 exit
쉘이 실행 중인 수준에서만 벗어날 수 있습니다.이내에.
서브셸에서 실행 중인 항목의 종료 코드와 출력을 캡처하려는 경우 서브셸이 시작된 환경에서 계속 사용할 수 있습니다.
#!/bin/bash
subshelloutput="$( echo "output"; exit 3 )"
returnval=$? # captures subshell's exit code
: more stuff follows
답변2
다른 방법으로도 할 수 있습니다.
_foo ()
{
local _retval
declare -n output="$1" # $output is local (by default with declare in a func.)
## and points to $1
output="baz" && false
_retval=$?
echo ${_retval} # change echo to exit
}
이제 _foo
다음과 같이 호출하세요.
$ _foo bar
1
$ echo "$bar"
baz
함수 정의에서 로 변경하면 echo
스크립트가 종료됩니다.exit
exit