#!/bin/bash
function0()
{
local t1=$(exit 1)
echo $t1
}
function0
echo
null 값을 인쇄합니다. 나는 기대:
1
변수에 t1
종료 명령의 반환 값이 할당 되지 않은 이유는 무엇입니까 1
?
답변1
local t1=$(exit 1)
셸에 다음과 같이 알려주세요.
exit 1
서브셸에서 실행합니다.- 해당 출력(예: 표준 출력에 인쇄된 텍스트)을
t1
함수의 로컬 변수에 저장합니다.
그러므로 t1
빈 채로 끝나는 것이 정상입니다.
( $()
라고 불린다.명령 대체.)
종료 코드는 항상 에 할당되므로 $?
다음을 수행할 수 있습니다.
function0()
{
(exit 1)
echo "$?"
}
원하는 효과를 얻으려면. 물론 $?
다른 변수에 할당할 수도 있습니다.
function0()
{
(exit 1)
local t1=$?
echo "$t1"
}
답변2
종료 코드는 다음 위치에 저장됩니다.$?바꾸다. 사용명령 대체출력만 캡처하려면 다음을 사용해야 합니다.(...) 서브쉘 생성:
#!/bin/bash
func() {
(exit 1)
local t1=$?
printf '%d\n' "$t1"
}
func
답변3
bash
이 작품 에서는 :
loc(){ local "x=$(exit "$1"):$?"
printf '$%s:\t%d\n' \
x "${x##*:}" \? "$?"
}
이는 명령 평가 및 변수 할당 순서와 관련이 있습니다. local
자체 반환 값이 있습니다. 이는 명령 대체가 아니라 현재 실행 중인 명령입니다. 이유는 마치...
x=$(exit 1); echo "$?"
$x
...이 명령에는 값을 할당하기 위해 서브쉘을 실행하는 것 외에는 반환이 없기 때문에 1을 반환할 수 있습니다. 따라서 $?
명령 대체가 사용되는 거의 모든 경우처럼 중단되지 않습니다.
어쨌든 local
그걸로하다손상되었지만 적절한 시점에 발견하면 확장 프로그램이 아직 평가 중이며앞으로 local
루틴은 이를 파괴할 가능성이 있지만 여전히 할당할 수 있습니다.
unset x; loc 130; echo "${x-\$x is unset}"
...인쇄...
$x: 130
$?: 0
$x is unset
$?
그러나 많은 쉘에서는 이러한 방식으로 수행되는 중간 평가 에 의존할 수 없다는 점을 알아야 합니다 . 사실 이는 아마도 이러한 쉘이 bash
가능한 모든 순간에 재평가하지 않기 때문일 것입니다. 내 생각에는 이것이 아마도 bash
. 통역사가 값을 사용하기 전에 덮어쓸 가능성이 있는 값을 재귀적으로 반복하고 평가하기를 정말로 원하십니까?
어쨌든, 당신이 할 수 있는 일은 다음과 같습니다.
답변4
@mikeserv의 답변은 훌륭하고 내가 발견한 동작에 대한 설명을 제공하지만 왜 그런 일이 발생했는지 전혀 모릅니다.
local
서브셸의 종료 코드를 먹는 것을 방지하는 간단한 방법을 추가하고 싶었습니다 .
val_check_exit() {
local val=
val=$(echo "hi"; exit 1)
local res=$?
echo "val is ${val}, exit code ${res}"
}
val_check_exit
# outputs:
# val is hi, exit code 1