로컬로 종료 코드를 캡처하는 방법은 무엇입니까?


11

내 프로젝트에는 다음과 같은 스 니펫이 있습니다.

local output="$(bash "${1##*/}")"
echo "$?"

이로 인해 항상 0으로 인쇄 local되지만 변수를 제거 local하면 $?변수가 올바르게 작동합니다. 서브 쉘에서 종료 코드를 가정합니다.

내 질문은 :이 변수를 로컬로 유지하면서 종료 값을 캡처하는 방법은 무엇입니까?


1
shellcheck이 문제를 포착 할뿐만 아니라 unix.stackexchange.com/a/281749/24718 의 솔루션을 제안하십시오 !
Waleed Khan

답변:


16
#!/bin/bash
thing() {
   local foo=$(asjkdh) ret="$?"
   echo "$ret"
}

127"명령을 찾을 수 없음"에 대한 올바른 오류 코드 인가 에코됩니다 .

local둘 이상의 변수를 정의 하는 데 사용할 수 있습니다 . 따라서 로컬 변수 RET를 작성 하여 하위 쉘의 종료 코드를 캡처하여 local성공하고 $?0으로 설정 합니다.


bash이 표현을 왼쪽에서 오른쪽으로 평가 하는 것이 보장 됩니까?
Max Ried

내가 아는 한, 변수 할당은이 문맥에서 왼쪽에서 오른쪽으로 순서대로 진행됩니다.
DopeGhoti

@MaxRied 이것이 확실하게 작동한다는 사실은 그렇습니다. 그러나 POSIX 나 bash참조 설명서 에서 이것에 대한 정보를 찾을 수 없습니다 .
고양이

10
따로, 모든 대문자 변수 이름을 사용하는 것은 나쁜 형태입니다. pubs.opengroup.org/onlinepubs/009695399/basedefs/… 에서 POSIX 환경 변수 스펙을 참조하십시오. 여기에는 쉘 또는 시스템에 의미가있는 변수에 대해 예약 된 모든 대문자 이름과 하나 이상의 소문자가있는 이름이 설명되어 있습니다. 쉘 변수와 환경 변수는 네임 스페이스를 공유한다는 점을 명심하십시오 (충돌시 전자에 할당하면 후자를 무시할 수 있기 때문에).
Charles Duffy

의견은 긴 토론을위한 것이 아닙니다. 이 대화는 채팅 으로 이동 되었습니다 .
terdon

27

지역 변수를 지정하기 전에 선언하십시오 :

thing() {
  local output
  output="$(bash "${1##*/}")"
  echo "$?"
}

내 의견으로는 이것은 추가 RET변수를 설정하는 것보다 더 읽기 쉽습니다. YMMV는 있지만 예상대로 작동합니다.


2
이다 훨씬 간단 : 여러 과제의 반환 코드를 확인하려면 별도의 변수를 사용하는 것보다, 같은 분명해야 더 좋은 local var1 var2 ...밥이 당신의 삼촌이다.
l0b0

@ l0b0 밥 내 삼촌입니다. : D
고양이
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.