Прерывание цикла for-loop в bash, но только после завершения итерации?

Есть ли способ прервать / остановить for -loop в bash , но только после завершения текущей итерации – т.е. "между" сделано и делать ?

Я запускаю for -loop в нескольких каталогах с командой, которая может быть разрушительной, если только это не разрешено завершить, поэтому я хотел бы остановить ее, когда команда завершена с одним каталогом, но прежде чем она начнется с следующей.

(Да, я знаю, что я мог бы добавить sleep или команду read прежде чем сделать – но я этого не сделал , и цикл уже запущен …)

  • Выберите последний обновленный файл из каталога и отправьте его по электронной почте.
  • У меня есть несколько копий .bash_profile, какой из них действительно используется? (если есть)
  • Как перезапустить мой сервер автоматически, используя crontab, если они спустились?
  • Найти все файлы и использовать результат в шаблоне поиска grep
  • Что такое echo ' \ nlocalhost \ n'> / etc?
  • Выдать команду в каждом каталоге
  • Сортировка jpg в соответствии с датой создания и конвертирование в одиночный pdf
  • Может ли любая оболочка использовать интерактивный поиск на уровне аргументов?
  • 2 Solutions collect form web for “Прерывание цикла for-loop в bash, но только после завершения итерации?”

    Для уже запущенного : предполагается, что команда является программой и, таким образом, выполняется как дочерний процесс под оболочкой, на которой запущен скрипт (или его часть), и скрипт не дал ему heredoc или herestring для ввода или прочитал или, по крайней мере, буферизованный этот вход, вы можете остановить после завершения процесса :

    • kill -STOP shell (так что после текущей команды он ничего не сделает)
    • подождать, пока процесс ребенка закончится и появится зомби
    • kill -KILL оболочка

    (Все как один и тот же пользователь или root , из другой оболочки, конечно.) Если тело do ... done делает две или более вещи на каждой итерации, это только улавливает ее после программы, которая занимает достаточно много времени в реальном времени. может получить -STOP , что может быть или не быть последней программой на итерации.

    В некоторых (много?) Случаях он будет работать, чтобы просто kill -KILL оболочку спереди, что предотвращает очистку оболочки своих детей, как обычно, и позволяет ребенку запускаться и, наконец, получать init (или эквивалент в вашей системе) , Однако это может привести к тому, что ребенок увидит некоторые ошибки ввода / вывода или различия в среде или ошибки или варианты с любыми внуками, которые он имеет, и это может все еще вызвать «деструктивные» результаты, которые вы пытаетесь избежать.

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

     do_first_thing && \ do_second_thing && \ do_third_thing 

    Предполагая, что вы можете do_first_thing / переместить do_first_thing во всем мире, то есть, когда ни один другой скрипт не нуждается в этом в настоящий момент, вы:

    • отмените его или переименуйте, чтобы сценарий не запустил его
    • смотреть в ps прогресс итерации
    • когда цикл начинает простаивать, вы можете его убить.

    Вы также можете связать первую команду в скрипте с другим скриптом, содержащим sleep или read что даст вам время и возможность безотлагательно отключить цикл.

    Linux и Unix - лучшая ОС в мире.