Bash에서 명령으로 출력되는 줄 수를 제한하는 방법은 무엇입니까?

Bash에서 명령으로 출력되는 줄 수를 제한하는 방법은 무엇입니까?

다음을 사용하여 백그라운드에서 대용량 파일을 다운로드하기 시작했습니다.

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

이것은 또한 나에게 nohup.outinclude 를 제공합니다 wget.

이제 나중에 다운로드 과정을 보고 싶다면할 수 있다사용 $ tail -f nohup.out하지만 원하는 것보다 더 빨리 터미널 창이 채워집니다. 내가 보고 싶은 것은 마지막 행이 지속적으로 업데이트되는 것입니다( wget단독으로 사용될 때처럼).

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

일반적으로 말해서 이 문제는 명령 출력에 사용 가능/표시되는 줄 수를 제한(이 경우 1)할 수 있으면 해결될 수 있습니다. 출력을 넣는 것과 비슷합니다.순환 버퍼- 일반적인 진행률 표시줄이 $ wget example.tld/big.iso인쇄될 것이라고 생각하세요.

이에 대한 해결책이 있습니까?

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

답변1

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

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;

답변2

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

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

편집하다: -e(별칭 --exec) 옵션이 여기에 적합한 것 같습니다. 특히 매우 작은 간격으로 실행하는 것이 목표인 경우 watch각 주기 내에서 실행함으로써 발생하는 오버헤드가 줄어듭니다.sh -cwatch

답변3

특정이있다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.

답변4

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

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

관련 정보