bash I/O 리디렉션 - stderr에 추가하는 방법

bash I/O 리디렉션 - stderr에 추가하는 방법

일부 대규모 데이터 세트를 반복하고 일부 긴 작업을 수행하는 스크립트가 있습니다. 그런 다음 sort | uniq -c출력이 필요합니다 . 그래서 그것이 살아 있음을 알리기 위해 N 항목마다 stderr에 점을 인쇄합니다(매우 원시적인 의사 진행률 표시줄). 따라서 다음과 같이 보입니다.

for i in {1..100}; do 
    [[ $(( (i+=1) % 10)) -eq 0 ]] && echo -n "." >&2
    shuf -i 1-10 -n1
    sleep 0.1
done | sort | uniq -c 

그리고 출력:

..........      9 1
     10 10
      8 2
     14 3
     13 4
      9 5
     11 6
      8 7
      8 8
     10 9

"진행률 표시줄"로 인해 출력이 약간 혼란스러워집니다. 그래서 궁금합니다.

  • 플러시하기 전에 해당 stderr에 nweline을 추가하는 쉬운 방법이 있습니까? (어쩌면 echo >&2그게 나에게 필요한 것일지도 모르지)
  • 아니면 삭제해?

물론 실제로는 WOW에 많은 항목이 있다는 사실을 모릅니다(적어도 기본적으로 제공되지는 않음). 그래서 이것이 스트림 리디렉션을 통해 달성될 수 있는지 궁금합니다.

답변1

루프를 중괄호(또는 괄호)로 묶고 그 안에 추가 에코를 넣습니다.

{ for i in {1..100}; do 
    [[ $(( (i+=1) % 10)) -eq 0 ]] && echo -n "." >&2
    shuf -i 1-10 -n1
    sleep 0.1
done; echo >&2; } | sort | uniq -c 

전체 중괄호 그룹이 로 리디렉션되면 sort계속 진행하려면 파일의 끝을 확인하기 전에 내부의 모든 항목이 종료될 때까지 기다려야 합니다. 이렇게 하면 sort및 의 출력 전에 개행 문자가 인쇄됩니다 uniq.

관련 정보