bash에서 명령 출력이 사용할 수있는 줄 수를 제한하는 방법은 무엇입니까?


11

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

$ 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의 출력 을 제한 하거나 다른 작업을 수행 하는 것이 더 쉬울 까요?)

답변:


10

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

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;

6

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

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

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


2
이것은 tail매 초마다 새로운 프로세스를 생성하며 , 관심이 있거나 없을 수도 있습니다. 또한 watch -n 0.1"상시 업데이트"부분을 시뮬레이션하기 위해 1 초 미만의 간격 (예 :)을 지정해야합니다 . (이것은 분명히 프로세스 수와 파일 열기 호출도 증가시킵니다.) 마지막으로 OS X를 watch사용하는 경우 기본적으로 사용할 수 없으므로 MacPorts에서 얻을 수 있습니다 .
janmoesen

이것은 약간의 해결 방법이지만 훌륭합니다. 전체 화면이 아닌 답변을 기대하여 이전 출력을 볼 수 있었지만 실제로watch 새 터미널 창에서 사용할 수있었습니다 . 또한 사용하는 tail -n 2것이 적어도 1 초 간격으로 -n 1with 보다 유용하다는 것을 알았습니다. 그렇지 않으면 최신 백분율이 표시되지 않을 수 있습니다. 이것은 귀하의 답변에 결함이 아니지만 다른 누군가가 wgets를 nohup 출력으로 보는 것을 결정하면 언급했습니다. wgetwatch
Jari Keinänen

@janmoesen이 특정 시나리오에서 새로운 tail프로세스를 갖는 것은 그리 과도하지 않을 것입니다. 그러나 일반적인 대답으로 고려하는 것이 좋습니다. 또한 watch -n 0.1작동하지 않았지만 작동 watch -n 0,1했습니다. 로켈이 적용되었을 수 있지만 로켈이 터미널 명령 옵션에 적용되는 것을 보지 못했습니다. 참고로 : brew install watch잘 작동했습니다 :-)
Jari Keinänen

참고 : 로케일 설정에 따라 watch작동 하는지 0,1또는 0.1로케일 설정에 따라 달라집니다 (로케일에 정의 된 10 진수 기호 사용). 확인하십시오 LC_ALL=C watch -n 0.1 "date +%S.%N".
rozcietrzewiacz

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.

<비 이동성에 대한 일반적인 메모를 여기에 삽입>
janmoesen

이것은 또 다른 훌륭한 대안이지만 tail -f여전히 버퍼를 채우고 나중에 터미널을 재설정해야하기 때문에 전용 창에서 가장 잘 사용됩니다 . 이것은 내가 기대 한대로 인라인 이 아니지만 그렇지 않으면 내가 찾은 것일 수 있습니다.
Jari Keinänen

0

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

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

1
반면 터미널 출력을 스크롤 할 수에 알 수 있는 출력 생산 명령이 실행되고, 당신은 당신의 터미널 에뮬레이터 설정 및 해제 편집해야 할 scrollTtyOutput(또는 유사) 옵션을 선택합니다.
rozcietrzewiacz
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.