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
(...)
(주로)그룹대신 명령은 서브쉘을 시작합니다. 따라서 exit
In은 (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; }
{ 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 함수를 작성하는 방법을 알아보세요(매우 간단합니다).