쉘 로컬 변수에 종료 코드 할당

쉘 로컬 변수에 종료 코드 할당
#!/bin/bash
function0()
{
 local t1=$(exit 1)
 echo $t1
}

function0

echonull 값을 인쇄합니다. 나는 기대:

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

관련 정보