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