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


답변:


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.