다수의 태양광 발전 주문

다수의 태양광 발전 주문

멋진 pv가 출력 행의 하위 집합을 계산하는 두 번째 pv로 파이프되는 Linux 상자에 스크립트가 있습니다.

스크립트는 다음과 같습니다.

max=1000
for (( i=0; i<max; i++ )); do
  [[ $(shuf -i 1-100 -n 1) -lt 20 ]] && echo REMOVE || echo LEAVE
done | pv -F "%N %b / $(numfmt --to=si $max) %t %p %e" -c -N 'Lookups' -l -s $max \
  | grep --line-buffered '^REMOVE' \
  | pv -F "%N %b / $(numfmt --to=si $max)" -c -N 'Deletes' -l -s $max \
  >/dev/null
stty sane

내가 기대하는 것은 첫 번째 PV가 항상 먼저 표시되고 두 번째 PV가 항상 두 번째로 표시된다는 것입니다.

이 예제의 출력과 같습니다.

$ ./fancy_pv.sh
  Lookups: 1.00k / 1.0K 0:00:03 [===============================================================================================================================================================================================================================================================================================================================================================>] 100%            
  Deletes:  189  / 1.0K

하지만 그렇지 않습니다. 때때로 그들은 장소를 바꾸는데 다음과 같은 것을 봅니다.

$ ./fancy_pv.sh
  Deletes:  199  / 1.0K
  Lookups: 1.00k / 1.0K 0:00:03 [===============================================================================================================================================================================================================================================================================================================================================================>] 100%            

가끔 다음과 같은 내용도 볼 수 있습니다.

$ ./fancy_pv.sh
  Lookups:  321  / 1.0K 0:00:01 [===============================================================================================================>                                                                                                                                                                                                                                                 ] 32% ETA 0:00:02
  Deletes:  198  / 1.0K
  Lookups: 1.00k / 1.0K 0:00:03 [===============================================================================================================================================================================================================================================================================================================================================================>] 100%            

나는 이것이 pv가 행을 삭제하고 다시 그리는 방식 때문이라는 것을 알고 있지만 순서를 엉망으로 만드는 것을 방지하기 위해 내가 할 수 있는 일이 있습니까?

stty sane때때로 pv로 인해 터미널을 사용할 수 없게 되므로 프롬프트를 정리할 수 있습니까?

감사해요

답변1

pv파이프라인의 두 프로세스는 어떤 순서로든 시작될 수 있습니다. 최신 출력은 pv맨 아래 줄에 표시됩니다.

pv원하는 최종 결과를 연기하십시오 . 하위 쉘을 사용하는 대신 pv …(모든 인수가 표시됨):

( </dev/null sleep 1; exec pv … )

이론적으로 다른 하나는 pv지연된 것 이후에 계속 시작될 수 있지만 완전히 과부하되지 않은 시스템에서는 지연된 것이 거의 확실하게 pv마지막에 시작됩니다.

sleep</dev/null어쨌든 이상한 경우를 대비해 표준 입력에서 읽어서는 안 됩니다 sleep.

일부 경쟁 조건으로 인해 추가(부실) 행이 나타나는지 확실하지 않습니다. 그렇다면 pv(거의 확실히) 지연하는 것이 도움이 될 것입니다. 내 테스트에서 터미널에 "추가" 업데이트가 필요한 경우 출력이 손상되었습니다. 그래서:

  • pv실행 중에는 터미널 크기를 조정하지 마십시오.
  • 스크롤을 피하세요:
    • 스크립트를 실행하기 전에 호출 clear(또는 Ctrl+ 누르기 L)하세요. 이렇게 하면 화면이 지워지고 팁이 맨 위에 배치되고 나중에 스크롤할 필요 없이 아래에 공간이 제공됩니다.
    • pvs가 실행되는 동안에는 입력하지 마십시오. 특히 여러 Enters를 사용하지 마십시오(텍스트 스크롤이 발생할 수 있음).
    • 일반적으로 s가 완료될 때까지 pvs 이외의 다른 내용이 터미널에 인쇄되지 않도록 하세요 pv. 이는 파이프라인의 다른 부분(예: 를 통해 /dev/tty), 스크립트 내의 비동기 프로세스(예: stdout을 통해서만), 스크립트 외부 프로세스(예: /dev/tty*또는 를 통해 /dev/pts/*)에서 작동합니다.

관련 정보