중첩된 명령에서 저장된 반환 코드를 사용하여 종료하면 Dash와 Bash에서 다른 반환 코드가 발생하는 이유는 무엇입니까?

중첩된 명령에서 저장된 반환 코드를 사용하여 종료하면 Dash와 Bash에서 다른 반환 코드가 발생하는 이유는 무엇입니까?

달리기

bash -c 'bash -c "echo test1; exit 1;" &> /tmp/x; buildresult=$?; tail -n 100 /tmp/x; exit $buildresult;'

결과는 test1콘솔에 인쇄되고 echo $?, 명령이 내부적으로 반환된 내용을 1반환해야 하기 때문에 나에게는 올바른 것 같습니다.[b/d]ash -c

dash -c 'dash -c "echo test1; exit 1;" &> /tmp/x; buildresult=$?; tail -n 100 /tmp/x; exit $buildresult;'

동일한 출력을 생성하지만 0그에 따라 반환됩니다 echo $?.

쉘과 이식 가능한 쉘 프로그래밍에 대한 이해를 넓히기 위해 이 차이점을 이해하고 싶습니다.

저는 Ubuntu 17.10(Artful Aardvark)에서 bash4.4.12 및 0.5.8-2.3ubuntu1을 사용하고 있습니다.dash

답변1

&>POSIX에는 리디렉션이 없습니다.의 영향을 받지 않습니다 dash. 구문 분석 & >되므로 명령이 대신 백그라운드에서 실행됩니다.백그라운드 명령의 종료 상태가 0입니다.부모의 관점에서 보면, 당신이 읽어도 그만 두지 않았기 때문입니다 $?.

이것이 (적어도 나에게는) test1프롬프트에 " " 출력이 나타나는 이유이기도 합니다.뒤쪽에명령이 완료되었습니다.

배쉬에 &> foo상응하는> foo 2>&1, 이식 가능한 스크립트는 후자를 사용해야 합니다.

관련 정보