할당은 명령 대체가 없는 한 종료 상태가 있는 명령과 같습니다.

할당은 명령 대체가 없는 한 종료 상태가 있는 명령과 같습니다.

POSIX 셸에서 다음 예제와 해당 출력을 참조하세요.

  1. false;echo $?또는 false || echo 1:1
  2. false;foo="bar";echo $?또는 foo="bar" && echo 0:0
  3. foo=$(false);echo $?또는 foo=$(false) || echo 1:1
  4. foo=$(true);echo $?또는 foo=$(true) && echo 0:0

가장 많이 투표 된 답변이 언급했듯이https://stackoverflow.com/questions/6834487/what-is-the-variable-in-shell-scripting:

$?마지막으로 실행된 명령의 반환 값을 찾는 데 사용됩니다.

이 경우 약간 오해의 소지가 있을 수 있으므로 이 스레드의 게시물에서도 참조되는 POSIX 정의를 살펴보겠습니다.

? 가장 가까운 파이프의 소수 종료 상태로 확장됩니다(파이프 참조).

따라서 할당 자체는 종료 값이 0인 명령(또는 파이프라인 부분)으로 계산되는 것처럼 보이지만 적용됩니다.앞으로할당의 오른쪽(예: 내 예에서는 명령 대체 호출)

나는 이러한 행동이 실용적인 관점에서 어떻게 의미가 있는지 이해하지만, 일자리 자체가 이 순서로 계산된다는 것이 나에게는 조금 이상해 보입니다. 이것이 나에게 이상하게 보이는 이유를 더 명확하게 하기 위해 할당이 함수라고 가정해 보겠습니다.

ASSIGNMENT( VARIABLE, VALUE )

그러면 foo="bar"그럴 것이다

ASSIGNMENT( "foo", "bar" )

foo=$(false)다음과 같을 것이다

ASSIGNMENT( "foo", EXECUTE( "false" ) )

EXECUTE달리고 있다는 뜻이다첫 번째그리고직후 ASSIGNMENT실행되었지만 여기의 상태는 여전히 EXECUTE중요합니다.

내 평가가 정확합니까, 아니면 뭔가 잘못 이해했거나 놓쳤습니까? 이것이 내가 이 행동이 "이상하다"고 생각하는 올바른 이유입니까?

답변1

작업의 종료 상태는 다음과 같습니다.이상한. 할당이 실패하는 가장 확실한 방법은 대상 변수가 표시되는 경우입니다 readonly.

$ err(){ echo error ; return ${1:-1} ; }
$ PS1='$? $ '
0 $ err 42
error
42 $ A=$(err 12)
12 $ if A=$(err 9) ; then echo wrong ; else E=$? ; echo "E=$E ?=$?" ; fi
E=9 ?=0
0 $ readonly A
0 $ if A=$(err 10) ; then echo wrong ; else E=$? ; echo "E=$E ?=$?" ; fi
A: is read only
1 $

if 문의 true 경로나 false 경로는 모두 사용되지 않으며 할당에 실패하면 전체 문의 실행이 중단됩니다. POSIX 모드의 bash와 ksh93 및 zsh는 할당이 실패하면 스크립트를 중단합니다.

인용하다POSIX 표준:

명령 이름은 없지만 명령 대체를 포함하는 명령은 쉘에 의해 실행된 마지막 명령 대체의 종료 상태를 갖습니다.

이것이 바로 쉘 구문과 관련된 부분입니다.

 foo=$(err 42)

simple_command(simple_command → cmd_prefix → ASSIGNMENT_WORD) 에서 옵니다 . 따라서 할당이 성공하면 명령 대체가 포함되지 않는 한 종료 상태는 0이 되며, 이 경우 종료 상태는 마지막 상태가 됩니다. 할당이 실패하면 종료 상태가 0이 아닌데 잡아내지 못할 수도 있습니다.

답변2

당신은 말한다,

...할당 자체가 명령으로 간주되는 것 같습니다...종료 값은 0이지만 할당의 오른쪽 앞에 적용됩니다(예: 명령 대체 호출...)

그것은 문제를 보는 끔찍한 방법이 아닙니다. 그러나 이것은 좀 너무 단순하다. 전반적인 반품 상태는 다음에서 비롯됩니다.

A=$(명령 1) B=$(명령 2) C=$(명령 3) D=$(명령 4) E=MC 2
종료 상태입니다. 할당 후에 발생하는 할당은 전체 종료 상태를 0으로 설정하지 않습니다.cmd4E=D=

게다가 만약에이카루스 지적, 변수를 읽기 전용으로 설정할 수 있습니다. Icarus 예에 대한 다음 변형을 고려하십시오.

$ err() { echo "stdout $*"; echo "stderr $*" >&2; return ${1:-1}; }
$ readonly A
$ Z=$(err 41 zebra) A=$(err 42 antelope) B=$(err 43 badger)
stderr 41 zebra
stderr 42 antelope
bash: A: readonly variable
$ echo $?
1
$ printf "%s = %s\n" Z "$Z" A "$A" B "$B"
Z = stdout 41 zebra
A =
B =
$

읽기 전용이더라도 bash는 수행됩니다. A오른쪽의 명령 대체A=그 다음에이 명령은 A읽기 전용이므로 중단하세요. 이는 할당의 종료 값이 할당의 오른쪽 앞에 적용된다는 설명과 더욱 모순됩니다.

관련 정보