쉘 로컬 변수에 종료 코드 지정


답변:


59

local t1=$(exit 1) 쉘에게 다음을 지시합니다.

  • exit 1서브 쉘에서 실행 ;
  • 출력을 (표준 출력으로 출력하는 텍스트에서와 같이) t1함수의 로컬 변수 에 저장하십시오.

따라서 t1빈 상태가되는 것이 정상입니다 .

( $()라고도 명령 교체 ).

종료 코드는 항상에 할당 $?되므로 할 수 있습니다

function0()
{
  (exit 1)
  echo "$?"
}

원하는 효과를 얻을 수 있습니다. 물론 $?다른 변수를 할당 할 수 있습니다 :

function0()
{
  (exit 1)
  local t1=$?
  echo "$t1"
}

1
알다시피, 당신은 항상 파이프에 반환을 넣을 수 있습니다. `$ (trap 'printf ":: ERRNO : $?"'0; # 이제는 아무 것도하지 마십시오.이 트랩은 마지막으로 쓰여진 문자열이 전체 대체 컨텍스트에 대한 마지막 리턴이되도록합니다.
mikeserv

1
@mikeserv 당신은 백틱을 그리워 했습니까? $(trap 'printf "::ERRNO:$?"' 0; # now do whatever however
Doktor J

13

종료 코드가 $ 에 저장 되었습니까? 변하기 쉬운. 명령 대체를 사용 하여 출력 만 캡처하려면 (...)를 사용하여 서브 쉘을 작성 해야합니다 .

#!/bin/bash

func() {
  (exit 1)
  local t1=$?
  printf '%d\n' "$t1"
}

func

과제의 요점은 t1=$?그것을 사용하는 것입니다. 그리고하지 않을 $?할당 연산에 의해 사방 얻을? 내가해서는 안될 것인지 묻고있는 것 같아요printf '%d\n' "${t1}"
Dani_l

@Dani_l : 고마워, 오타입니다. 업데이트되었습니다.
cuonglm 2016 년

Command Substitution은 다르게 리디렉션되지 않는 한 표준 출력 만 캡처합니다.
phyatt

7

에서 bash이 작품 :

loc(){  local   "x=$(exit "$1"):$?"
        printf  '$%s:\t%d\n' \
                 x "${x##*:}" \? "$?"
}

명령 평가 및 변수 할당 순서와 관련이 있습니다. local반환 값은 모두 고유하며 명령 대체가 아니라 현재 실행중인 명령입니다. 이유는 ...

x=$(exit 1); echo "$?"

... 1을 반환 할 수있는 것은 서브 쉘 실행이 $x값 을 할당하는 것을 제외하고 해당 명령에 반환이 없기 때문에 $?명령 대체가 사용되는 다른 모든 경우와 마찬가지로 혼란스럽지 않습니다.

어쨌든,와 local않습니다 사방 얻을 - 제품 확장은 아직 평가되고하면서 -하지만 당신은 단지 적절한시기에 그것을 잡을 경우 전에 local 당신은 여전히 할당 할 수 있습니다 -의 루틴을 소지품 할 수있는 기회가있다.

unset x; loc 130; echo "${x-\$x is unset}"

...인쇄물...

$x: 130
$?: 0
$x is unset

많은 쉘 $?에서 그런 식으로 중간 평가에 의존 할 수는 없다는 것을 알아야합니다. 사실, 아마도 그 껍질이 가능한 모든 시점에서 재평가를 귀찮게하지 않기 bash때문일 것입니다 bash. 인터프리터가 재귀 적으로 반복 평가하는 값을 사용하기 전에 덮어 쓸 가능성이 높은 값을 정말로 원하십니까?

어쨌든, 그렇게 할 수 있습니다.


-1

종료 코드를 얻으려는 이유에 따라 if some-command; then echo "Success $?"; else echo "Failure $?"; fi명령의 출력으로 아무것도하지 않는 명령을 실행할 수도 있습니다. 명령 실행의 종료 코드 만 평가합니다. 당신은 추가 할 수 있습니다 or( or($을 around the command and you'll still get the same results. A better example might be경우 그렙 -q 'somestring'somefile, 그렇지 "종료 코드를 somestring하는 $입니다 찾지 못 하셨나요?"; 다음 "? 찾을 수 somestring 종료 코드는 $는"에코 fi`합니다.

또한 return 3마지막 명령의 결과 인 명시 적 또는 암시 적 리턴 코드 일 수있는 함수의 리턴 코드를 테스트 할 수 있습니다 .이 경우 echo에는 끝에 그렇지 않으면 이전 종료 코드를 마스크 / 재설정합니다.

command_last () {
  echo "True is `true`"
  echo "False is `false`"
  false
}
command_last; echo $?
# Outputs:
# True is 0
# False is 1
# 1

echo_last () {
  echo "True is `true`"
  echo "False is `false`"
  false
  # echo'ing literally anything (or nothing) returns true aka exit 0
  echo
}
echo_last; echo $?
# Outputs:
# True is 0
# False is 1
#            # Blank line due to empty echo
# 0

마지막으로 배열 정의 VAR=(SOME_COMMAND)이기 때문에 할 수 없기 때문에 더러운 트릭 VAR=()이 필요합니다 VAR=( $(echo 'Some value') ).


명령 대체가 종료 코드를 제공하지 않기 때문에 모든 주장 된 출력이 잘못되었습니다. 이는 문제의 핵심입니다. "더러운 트릭"이 무엇과 어떤 관련이 있는지는 확실하지 않습니다.
Nick Matteo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.