Как показать и обновить эхо на одной линии
У меня есть следующее в 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
но я хочу сделать так, чтобы "эхо" показывало следующее эхо на следующей строке (не объединять с последним выходом Эха, а заменять его), чтобы сделать его похожим на обновление. Подобно тому, как индикатор выполнения с процентами будет отображаться на той же строке.
5 ответов:
Ну я не правильно прочитала
man echoстраница для этого.у echo было 2 варианта, которые могли бы сделать это, если бы я добавил 3-й escape-символ.
2 варианта
-nи-e.
-nне будет выводить пустую строку. Так что это спасает меня от перехода на новую строку каждый раз, когда я что-то повторяю.
-eпозволит мне интерпретировать символы обратного слэша escape.думаю, что символ, который я хочу использовать для это:
\r. Да, возврат каретки отправит меня обратно в начало, и это визуально будет выглядеть так, как будто я обновляю на той же строке.таким образом, линия Эха будет выглядеть так:
echo -ne "Movie $movies - $dir ADDED!"\rЯ должен был избежать символа побега, чтобы Баш не убил его. вот почему вы видите 2
\символы в там.как отметил Уильям,
printfможет также выполнять аналогичные (и даже более обширные) задачи, такие как это.
Если я хорошо понял, вы можете получить его, заменив свое эхо следующей строкой:
echo -ne "Movie $movies - $dir ADDED! 3[0K\r"вот небольшой пример, который вы можете запустить, чтобы понять его поведение:
#!/bin/bash for pc in $(seq 1 100); do echo -ne "$pc%3[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".но это уже другая история. :)
надеюсь, что это поможет!
мой любимый способ называют сон до 50. здесь
iпеременная должна использоваться внутри операторов echo.for i in $(seq 1 50); do echo -ne "$i%3[0K\r" sleep 50 done echo "ended"
Это может быть полезно, пожалуйста, попробуйте его и изменить по мере необходимости.
#! bin/bash for load in $(seq 1 100); do echo -ne "$load % downloded ...\r" sleep 1 done echo "100" echo "Loaded ..."
Comments