새 줄을 추가하는 대신 줄을 업데이트하는 경우 명령 출력 앞에 어떻게 추가합니까?

새 줄을 추가하는 대신 줄을 업데이트하는 경우 명령 출력 앞에 어떻게 추가합니까?

출력(진행) 앞에 rclone사용자 정의 텍스트를 추가하고 싶습니다. 인터넷 검색 끝에 나는 다음과 같은 해결책을 생각해 냈습니다.

rclone sync "$SOURCE" "$DESTINATION" | while read line; do echo "   $line"; done

그러나 실제로 rclone(--progress 사용)은 처음에 일부 행을 가져온 다음 실행 중에 업데이트합니다. 그러나 이것을 사용하면 while이전 행을 업데이트하는 대신 지속적으로 새 행을 추가하게 됩니다. 이 문제를 해결하는 방법을 아는 사람이 있나요?

기본적으로 rclone --progress output매초마다 업데이트됩니다.

Transferred:             0 / 0 Bytes, -, 0 Bytes/s, ETA -
Checks:                97 / 97, 100%
Elapsed time:         0.0s

원하는 출력:

[My text] Transferred:             0 / 0 Bytes, -, 0 Bytes/s, ETA -
[My text] Checks:                97 / 97, 100%
[My text] Elapsed time:         0.0s

실제 결과 while는 업데이트되지 않지만 다음을 추가합니다.

[My text] Transferred:             0 / 0 Bytes, -, 0 Bytes/s, ETA -
[My text] Checks:                97 / 97, 100%
[My text] Elapsed time:         0.0s
[My text] Transferred:             0 / 0 Bytes, -, 0 Bytes/s, ETA -
[My text] Checks:                97 / 97, 100%
[My text] Elapsed time:         0.0s
[My text] Transferred:             0 / 0 Bytes, -, 0 Bytes/s, ETA -
[My text] Checks:                97 / 97, 100%
[My text] Elapsed time:         0.0s
[My text] Transferred:             0 / 0 Bytes, -, 0 Bytes/s, ETA -
[My text] Checks:                97 / 97, 100%
[My text] Elapsed time:         0.0s

답변1

귀하의 질문을 이해했는지 잘 모르겠습니다. 동일한 행을 지속적으로 업데이트하려는 경우 다음과 같이 사용할 수 있습니다.

rclone sync "$SOURCE" "$DESTINATION" | while read line; do echo -en "   \r$line"; done

-n 후행 줄 바꿈을 인쇄하기 위해 에코를 중지합니다.

-e는 백슬래시 시퀀스를 평가하도록 echo에 지시합니다.

답변2

이러한 유형의 업데이트를 제어하는 ​​것은 어렵습니다. 왜냐하면 모든 프로그램이 완전한 업데이트 데이터를 항상 동일한 위치로 보내는 것은 아니기 때문입니다. 이 특별한 경우에는 rclone3개의 완전한 데이터 행이 매초 전송되는 것처럼 보이므로 이를 수정하고 동일한 위치에 다시 그려야 하며 새 데이터 행이 이전 데이터보다 짧으면 삭제해야 합니다. 화면 상단에 믹스가 표시됩니다. 나에게 가장 쉬운 방법은 명령을 사용 clear하고 다시 그릴 때마다 데이터의 왼쪽 상단 행만 표시하는 것이었습니다.

rclone sync "$SOURCE" "$DESTINATION" | while read line; do if echo "$line" | grep -q  "Transferred"; then clear; fi ; echo "   $line"; done

더 많은 제어를 원할 경우 ANSI 이스케이프 커서 위치 코드를 사용하여 각 특정 출력 줄을 미리 정의된 화면 위치에 정확하게 배치할 수 있습니다. 이는 grep현재 인쇄되고 있는 줄을 결정하는 데 사용됩니다. 또는 read A B C... <<<$line각 행에서 개별 데이터 필드를 추출하고 필요에 따라 출력을 완전히 재구성할 수 있습니다. 물론 이를 수행하는 더 효율적인 방법이 있습니다 awk. 경고: rclone출력 버퍼링을 해제 하더라도 while적시에 다시 그리기를 보장하기 위해 명령의 stdin/stdout에 이 작업을 수행해야 할 수도 있습니다. 이에 대한 테스트는 수행하지 않았습니다.

rclone.format.sh호출 및 디버깅을 단순화하기 위해 스크립트에서 명령을 그룹화하는 것이 좋습니다 .rclone sync "src" "dst" | ./rclone.format

#!/bin/bash
# formatting rclone progress output
# use: rclone [options] | rclone.format.sh
#--------------------
TXTPFIX="my customized progress text"

while read LINE ; do
  if echo "$LINE" | grep -iq transferred ; then
    #-- erase screen on first line detected
    clear
  fi
  #-- send modified line
  echo "$TXTPFIX $LINE"
done
#-- end --#

chmod u+x rclone.format.sh간단한 스크립트 실행을 허용하는 것을 잊지 마세요 .

관련 정보