bash에서 명령 출력이 사용할 수있는 줄 수를 제한하는 방법은 무엇입니까? 웁니다. 내가보고 싶은 것은 지속적으로

백그라운드에서 큰 파일을 다운로드하기 시작했습니다.

$ nohup wget http://example.tld/big.iso &

또한 nohup.out의 출력을 포함 하는 파일을 제공합니다 wget.

나중에 다운로드 프로세스를보고 싶다면 사용할 $ tail -f nohup.out있지만 원하는 것보다 빨리 터미널 창을 채 웁니다. 내가보고 싶은 것은 지속적으로 업데이트되는 마지막 줄입니다 ( wget단독으로 사용할 때와 마찬가지로 ).

나는 시도 $ tail -n 1 -f nohup.out했지만 초기 꼬리에만 영향을 미치는 것 같습니다.

일반적으로 말해서, 명령 출력이 사용 가능한 / 표시 가능한 행 수를 제한 할 수 있으면 (이 경우 1로)이 문제를 해결할 수 있습니다. 원형 버퍼에 출력하는 것 – 보통 진행률 표시 줄 $ wget example.tld/big.iso이 인쇄 될 것이라고 생각 하면됩니다.

그런 해결책이 있습니까?

아니면 나무를 잘못 오르고 있습니까? (즉, nohup의 출력 을 제한 하거나 다른 작업을 수행 하는 것이 더 쉬울 까요?)



답변

스크롤 영역을 제한하지 않으려면 (다른 대답 참조) 다음 줄을 인쇄하기 전에 캐리지 리턴을 사용하여 줄의 처음으로 돌아갈 수도 있습니다. 현재 줄이 이전 줄보다 짧을 때 필요한 나머지 줄을 지우는 이스케이프 시퀀스가 ​​있습니다.

nohup wget http://cdimage.debian.org/debian-cd/6.0.3/amd64/iso-dvd/debian-6.0.3-amd64-DVD-1.iso &
el="$(tput el)"; # Clear to the end of the line
tail -n 1 -f nohup.out | while read -r line; do echo -n $'\r'"$el$line"; done;

답변

watch여기에서 사용할 수 있습니다 :

watch -n 0.5 -e "tail -n 1 nohup.out"

편집 : -e(별칭 --exec) 옵션이 여기에 적합합니다. 특히 watch매우 작은 간격으로 달리기를 목표로하는 경우 각주기마다 sh -c내부적으로 달리기 때문에 발생하는 오버 헤드가 줄어 듭니다 watch.


답변

스크롤되는 터미널의 라인을 제한하는 데 사용할 수 있는 특정 Xterm 제어 시퀀스가 있습니다. “스크롤 영역 설정”을 찾으십시오. 그래도 약간의 혼란입니다. 다음에 터미널을 재설정하십시오 :

nohup wget http://cdimage.debian.org/debian-cd/6.0.3/amd64/iso-dvd/debian-6.0.3-amd64-DVD-1.iso &
clear; echo -n $'\e[1;2r'; tail -f nohup.out | grep --line-buffered .
# The "grep" line is to ensure a single line; you can also use "awk 1" or "sed" etc.

답변

출력이 전체 현재 터미널 창을 차지하지 않게하려면 간단한 while루프를 사용할 수 있습니다 .

while true; do
  XXX=$( tail -n1 my.log )
  echo -en " \r$XXX\r"
  sleep 0.5
done; echo