같은 줄에 에코를 표시하고 업데이트하는 방법
Bash에 다음이 있습니다 (Linux).
for dir in Movies/*
do
(cd "$dir" && pwd|cut -d \/ -f5|tr -s '\n' ', ' >> ../../movielist &&
exiftool * -t -s3 -ImageSize -FileType|tr -s '\t' ',' >> ../../movielist )
echo "Movie $movies - $dir ADDED!"
let movies=movies+1
done
하지만 "echo"가 다음 줄에 다음 에코를 표시하도록 만들고 싶습니다 (마지막 에코를 출력하고 연결하지 않고 교체). 업데이트중인 것처럼 보이게합니다. 백분율이있는 진행률 표시 줄이 같은 줄에 표시되는 것과 관련됩니다.
글쎄, 나는 man echo
이것에 대한 페이지를 보고 읽지 .
echo에는 세 번째 이스케이프 문자를 추가하면 수행 할 수있는 두 가지 옵션이 있습니다.
두 가지 옵션은 -n
및 -e
입니다.
-n
후행 개행을 출력하지 않습니다. 그래서 내가 작업을 에코 할 때마다 새 줄로 이동하지 않아도됩니다.
-e
백 슬래시 이스케이프 기호를 해석 할 수 있습니다.
이스케이프 기호를 사용하고 싶은지 맞춰보세요 : \r
. 예, 캐리지 리턴은 저를 처음으로 돌려 보냈던 것과 같은 것입니다.
따라서 에코 라인은 다음과 가변합니다.
echo -ne "Movie $movies - $dir ADDED!"\\r
나는 Bash가 그것을 죽이지 않도록 탈출 기호를 탈출해야했다. 그래서 \
거기에 2 개의 기호가 있습니다.
William이 이와 printf
같은 유사한 작업을 수행 할 수 있습니다.
내가 잘 이해 에코를 다음 줄로 바꿀 수 있습니다.
echo -ne "Movie $movies - $dir ADDED! \033[0K\r"
다음은 그 동작을 이해하기 위해 수있는 작은 예입니다.
#!/bin/bash
for pc in $(seq 1 100); do
echo -ne "$pc%\033[0K\r"
sleep 1
done
echo
나머지 대답은 꽤 좋지만 누군가가 여기에 여러 줄 에코를 교체 / 업데이트하는 솔루션을 찾는 경우에 대비하여 추가 정보를 추가하고 싶었습니다.
그래서 저는 여러분 모두에게 예를 공유하고 싶습니다. 다음 펼쳐지는 CentOS 시스템에서 사용 가능한 시스템의 자세한 시간 정보를 인쇄하는 "timedatectl"명령을 사용합니다.
출력에 여러 줄이 포함되어 있고 아래 예제에서 완벽하게 작동 해당 명령을 사용하기로 결정했습니다.
#!/bin/bash
while true; do
COMMAND=$(timedatectl) #Save command result in a var.
echo "$COMMAND" #Print command result, including new lines.
sleep 3 #Keep above's output on screen during 3 seconds before clearing it
#Following code clears previously printed lines
LINES=$(echo "$COMMAND" | wc -l) #Calculate number of lines for the output previously printed
for (( i=1; i <= $(($LINES)); i++ ));do #For each line printed as a result of "timedatectl"
tput cuu1 #Move cursor up by one line
tput el #Clear the line
done
done
위는 " timedatectl
" 의 결과를 영원히 인쇄 하고 이전 에코를 업데이트 한 결과로 대체합니다.
이 코드는 예일 뿐이지 만 필요에 따라 최상의 솔루션이 아닐 수도 있습니다. 거의 동일하게 (적어도 무대에서) 수행하는 행동은 watch -n 3 timedatectl
"입니다.
그러나 그것은 다른 이야기입니다. :)
도움이 되셨기를 바랍니다.
이것은 유용하게 다양합니다. 시도하고 필요에 따라 변경하십시오.
#! bin/bash
for load in $(seq 1 100); do
echo -ne "$load % downloded ...\r"
sleep 1
done
echo "100"
echo "Loaded ..."
이거 해봐도 돼 .. 나만의 버전 ..
funcc() {
while true ; do
for i in \| \/ \- \\ \| \/ \- \\; do
echo -n -e "\r$1 $i "
sleep 0.5
done
#echo -e "\r "
[ -f /tmp/print-stat ] && break 2
done
}
funcc "Checking Kubectl" & &>/dev/null
sleep 5
touch /tmp/print-stat
echo -e "\rPrint Success "
내가 가장 좋아하는 방법은 do the sleep to 50입니다. 여기서 i
변수는 echo 문 안에서 사용해야합니다.
for i in $(seq 1 50); do
echo -ne "$i%\033[0K\r"
sleep 50
done
echo "ended"
참고 URL : https://stackoverflow.com/questions/12628327/how-to-show-and-update-echo-on-same-line
'IT' 카테고리의 다른 글
UnicodeDecodeError : 'ascii'코덱은 위치 2에서 0xd1 바이트를 사용할 수 없습니다. 서 수가 범위에 없습니다 (128). (0) | 2020.08.27 |
---|---|
명령 줄에서 XLS를 CSV로 변환 (0) | 2020.08.27 |
Python에서 순환 가져 오기 오기를 피하는 방법은 무엇입니까? (0) | 2020.08.27 |
첫 번째 마이너스와 마지막 마이너스의 CSS 선택기 (0) | 2020.08.27 |
TimeStamp를 Java에서 날짜로 변환하는 방법은 무엇입니까? (0) | 2020.08.27 |