Завершить цикл BASH For, который содержит длительный сон и прочее, используя любой конкретный ключ

Существуют такие службы, как rpmfind (для пакетов RPM), а Debian (с их политикой упаковки всего, что компилируется) является собственным индексом. Для других систем, таких как меньшие дистрибутивы Linux или BSD, вам нужно будет посмотреть на них специально (и пакеты в любом случае не переносимы между ними).

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

4
26.01.2019, 16:08
2 ответа

Давненько я не сталкивался с такого рода задачами, но помню, что-то подобное работало:

#!/bin/bash

trap break INT

for (( c=0; c<=$1; c++ ))
do  

# SOME STUFF HERE
#  data gathering into arrays and other commands here etc

    echo loop "$c" before sleep

    # sleep potentially for a long time
    sleep "$2"

    echo loop "$c" after sleep

done

#WRITE REPORT OUT TO SCREEN AND FILE HERE

echo outside

Идея состоит в том, чтобы использовать Ctrl-C , чтобы разорвать цикл. Этот сигнал (SIGINT )перехватывается ловушкой, которая разрывает цикл и позволяет остальной части сценария следовать за ним.

Пример:

$./s 3 1
loop 0 before sleep
loop 0 after sleep
loop 1 before sleep
^Coutside

Дайте мне знать, если у вас возникнут проблемы с этим.

6
27.01.2020, 20:46

В некоторых случаях лучше иметь решение, которое не прерывает "SOME STUFF HERE" и прерывает работу только во время ожидания сценария оболочки.

Затем вы можете использовать оболочку, созданную -в команде readс некоторыми параметрами вместо sleep.

Попробуйте этот скрипт,

#!/bin/bash

echo "Press 'q' to quit the loop and write the report"
echo "Press 'Enter' to hurry up (skip waiting this time)"

for (( c=0; c<=$1; c++ ))
do  

 echo "SOME STUFF HERE (pretending to work for 5 seconds)..."
 sleep 5
 echo "Done some stuff"

#  data gathering into arrays and other commands here etc

# sleep potentially for a long time

#sleep $2
 read -n1 -st$2 ans
 if [ "$ans" == "q" ]
 then
  break
 elif [ "$ans" != "" ]
 then
  read -n1 -st$2 ans
 fi
done

echo "WRITE REPORT OUT TO SCREEN AND FILE HERE"

Подробную информацию о readвы найдете с помощью команды help read,

      -n nchars return after reading NCHARS characters rather than waiting
            for a newline, but honor a delimiter if fewer than
            NCHARS characters are read before the delimiter
      -s    do not echo input coming from a terminal
      -t timeout    time out and return failure if a complete line of
            input is not read within TIMEOUT seconds.  The value of the
            TMOUT variable is the default timeout.  TIMEOUT may be a
            fractional number.  If TIMEOUT is 0, read returns
            immediately, without trying to read any data, returning
            success only if input is available on the specified
            file descriptor.  The exit status is greater than 128
            if the timeout is exceeded
2
27.01.2020, 20:46

Теги

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