/dev/urandom 루프 읽기가 실패하는 이유는 무엇입니까?

/dev/urandom 루프 읽기가 실패하는 이유는 무엇입니까?

쉘 스크립트

#!/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

관련 정보