Как показать и обновить эхо на одной линии



У меня есть следующее в 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


но я хочу сделать так, чтобы "эхо" показывало следующее эхо на следующей строке (не объединять с последним выходом Эха, а заменять его), чтобы сделать его похожим на обновление. Подобно тому, как индикатор выполнения с процентами будет отображаться на той же строке.

502   5  

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

    Ничего не найдено.