백틱 연산자가 실패할 경우 bash를 인쇄하고 종료하는 방법

백틱 연산자가 실패할 경우 bash를 인쇄하고 종료하는 방법

getinfo.sh정보를 인쇄하거나 코드 1이 존재합니다 .

이 스크립트의 결과를 bash 변수에 저장하고 싶습니다. 그렇지 않으면 오류 메시지를 인쇄하고 종료합니다.

내가 이것을 실행하면

#!/bin/bash
X=`getinfo.sh` || echo "failed" && exit 1

그러면 스크립트는 성공하더라도 종료됩니다 getinfo.sh(이 경우 아무것도 인쇄하지 않습니다.

반면에

X=`getinfo.sh` || (echo "failed" && exit 1)

나에게는 C와 같은 언어에서 왔기 때문에 이것이 의미가 있지만아니요대괄호는 새로운 내부 쉘을 생성하고 종료되는 내부 쉘이며 쉘은 계속 실행되므로 스크립트를 종료하십시오.

getinfo.sh인쇄된 출력을 어떻게 저장하고 실패하면 종료할 수 있습니까?

답변1

(...)(주로)그룹대신 명령은 서브쉘을 시작합니다. 따라서 exitIn은 (echo failed && exit 1)서브쉘만 종료합니다.

서브셸에서 실행하지 않고 명령을 그룹화하려면 다음을 사용할 수 있습니다 { ...; }.

X=`getinfo.sh` || {
  echo >&2 "failed"
  exit 1
}

여기서는 다음을 사용하고 싶습니다.

if ! x=$(getinfo.sh); then
  echo >&2 failed
  exit 1
fi

또한 예를 들어 stdout이 전체 파일 시스템의 파일이거나 깨진 파이프가 SIGPIPE를 무시하거나 stdout이 닫히거나 SIGXFSZ의 파일 크기 제한에 도달한 경우와 같이 echo failed && exit 1자체적으로 실패하면 종료가 불가능할 수 있습니다. echo이런 일이 발생하면 무시하십시오. ...

답변2

중괄호를 사용하면 하위 셸을 만들지 않고도 명령을 그룹화할 수 있습니다.

X=$(getinfo.sh) || { echo "failed" && exit 1; }

~에서그룹화 명령Bash 매뉴얼의 섹션

{ list; }

중괄호 사이에 명령 목록을 배치하면 해당 목록이 현재 셸의 컨텍스트에서 실행됩니다. 하위 쉘이 생성되지 않습니다. 후행 세미콜론(또는 개행 문자)목록필요합니다.

참고: 백틱은 실제로 명령 대체에 더 이상 사용되지 않으므로 보다 현대적인 구문을 사용하고 있습니다 $().

답변3

변수의 값을 설정하는 것이므로 변수의 값을 확인하고 부적절하다면 종료해 보는 것은 어떨까요?

X=`getinfo.sh`

[ -z "$X" ] && echo "failed" && exit 1

이는 getinfo.sh실패 시 null이 반환되거나 길이가 0인 경우 종료된다고 가정하지만 X실패 시 반환되는 내용에 따라 검사를 수정할 수 있습니다. 또는 더 적절하게 는 찾고 있는 데이터 유형이 포함되어 있는지 getinfo확인하십시오 .X

답변4

가장 쉬운 방법은 shebang에 -e를 추가하는 것입니다.

#!/bin/bash -e

이는 스크립트가 첫 번째 오류에서 중지됨을 의미합니다. 백틱을 사용하고 있으므로 오류 메시지가 있으면 표준 출력에서 ​​볼 수 있습니다.

echo-and-exit 메서드를 정말로 사용하고 싶다면 항상 오류 메시지를 인쇄하고 즉시 종료하는 별도의 호출 함수를 작성하겠습니다. Bash 함수를 작성하는 방법을 알아보세요(매우 간단합니다).

관련 정보