쉘 스크립트
#!/bin/bash
set -euo pipefail
for i in {1..1000}; do
head -c 10000 /dev/urandom | tr -dc '0-1' | head -0 \
&& echo -n . \
|| { echo -e "\nNum $i, Unknown error!"; break; }
sleep 0.1
done
설명하다
- 유일한 핵심 명령은
head -c 10000 /dev/urandom | tr -dc '0-1' | head -0
- 이 스크립트는 몇 초 후에 충돌이 발생합니다.
....................................... Num 40, Unknown error!
질문
- 이 스크립트가 중단되는 이유는 무엇입니까?
답변1
먼저 프로세스의 종료 코드를 얻으려면 $?
오류 보고서를 다음으로 바꾸십시오.
echo -e "\nNum $i, error: $?"; break;
이는 스크립트가 종료될 때 프로그램이 코드 141과 함께 종료됨을 나타냅니다.
이 답변코드 141은 프로세스가 종료되었음을 나타냅니다 SIGPIPE
.
0줄을 읽어달라고 요청했기 때문에 head
이전 프로그램이 출력 스트림에 무엇이든 쓰기 전에 프로그램이 종료되어 오류가 발생할 수 있습니다.
이 문제를 해결하는 한 가지 방법은 최종 헤더를 약간 지연시키는 것입니다.
set -euo pipefail
for i in {1..1000}; do
if head -c 10000 /dev/urandom | tr -dc '0-1' | (sleep 0 && head -0) ; then
echo -n .
else
echo -e "\nNum $i, error: $?"; break;
fi
sleep 0.1
done