Как я могу напечатать строку, пока команда не завершится?

Они игнорируются, потому что их нет, но это не имеет значения - исходные (на английском) описания находятся в различных пакетах файлы ( например для jessie / main ).

1
08.03.2017, 10:17
3 ответа

Вы можете запустить процесс, который выполняет какой-то вывод в фоновом режиме, и убить его, как только будет выполнен scp :

(while sleep 60; do echo downloading; done) &
PID=$!
scp "$1" "$2"
kill $PID
2
27.01.2020, 23:25

Вот более общая функция для обработки загрузки и ожидания:

#! /bin/bash

# Wait for process end and show seconds count down
# Arg1: PID
# Arg2: Expected seconds
# Arg3: (optional): dump file
# Arg4: (optional): expected file size in bytes
function waitpid() {
[ -n "$3" ] && touch "$3"
local COUNT=$(( $2*10 ))
while [ -e /proc/$1 ]; do 
    if [ $(( COUNT%10 )) -eq 0 ]; then
        echo -en "\r$(( COUNT/10 )) sec"
        if [ -n "$3" ]; then
            bytes=$( stat --format=%s $3 )
            echo -n " $bytes bytes "
            if [ -n "$4" ]; then
                echo -n "$(( $bytes*100/$4 ))% "
            fi
        fi
    fi
    echo -en ".\e[K"
    sleep 0.1
    [ $COUNT -gt 0 ] && COUNT=$(( COUNT-1 ))
done
echo
}

echo "Example 1: Wait for process to be finished"
sleep 10 &
waitpid $! 10

echo "Example 2: Wait and show file size"
for N in {1..5} ; do echo "BAR $N" >> /tmp/foo ; sleep 2 ; done &
waitpid $! 10 /tmp/foo

Пример вывода:

Example 1: Wait for process to be finished
3 sec........
Example 2: Wait and show file size
7 sec 160 bytes .......

Изменить: если слишком сложный, используйте сокращенную версию:

sleep 10 &
while [ -e /proc/$! ]; do echo -n . ; sleep 1 ; done

Снимок экрана:

$ sleep 10 &
[1] 5432
$ while [ -e /proc/$! ]; do echo -n . ; sleep 1 ; done
..........[1]+  Done sleep 10
2
27.01.2020, 23:25

Хорошо, наконец-то я сделал это, я передаю аргументы $ 1 и $ 2 для scp , здесь я получаю идентификатор процесса команды scp , и пока она не завершится, я повторять загрузку ответа каждую минуту. Для этого я использую СЕКУНД в bash

t=$SECONDS
scp $1 $2 &
PROC_ID=$!
while kill -0 "$PROC_ID" >/dev/null 2>&1; do
    n=$(( SECONDS-t))
    if (( n > 60 )); then
        echo downloading
        t=$SECONDS
    fi
done
0
27.01.2020, 23:25

Теги

Похожие вопросы