Есть ли способ обеспечить последовательные задачи на терминале во время выполнения задачи (без использования файла)?

14

Предположим, есть 2 задачи t1,t2 которые можно выполнить последовательно, как показано ниже:

t1 ; t2
# OR
t1 && t2

Теперь предположим, что я забыл бежать t2и t1уже работает; можно добавить t2в конвейер, чтобы он выполнялся после t1финиша?

Абхиманью Гупта
источник

Ответы:

19

Да, ты можешь:

  1. Приостановите текущее задание с помощью символа приостановки , нажав Ctrl+Z .
  2. Тип fgили% , добавьте, что вы хотите в список и выполните его, например:
    fg ; systemctl suspend # or
    % ; systemctl suspend
    Так как fgвозвращает возвращаемое значение задания, которое оно возобновило, список операторов вроде &&и ||работает как ожидается:
    fg && echo "Finished successfully!" # or
    % && echo "Finished successfully!"

man bash/ JOB CONTROL говорит о приостановленном персонаже:

Ввод символа приостановки (как правило ^Z, Control- Z) во время выполнения процесса вызывает остановку этого процесса и возвращает управление bash. (…) Пользователь может затем манипулировать состоянием этого задания, используя bgкоманду, чтобы продолжить его в фоновом режиме, fg команду, чтобы продолжить его на переднем плане, или killкоманду, чтобы убить его. A ^Zвступает в силу немедленно и имеет дополнительный побочный эффект, приводящий к тому, что ожидаемые выходные данные и вводимые данные сбрасываются.

fgобъясняется в man bash/ SHELL BUILTIN COMMANDS :

fg [ jobspec ]
Возобновить задание на переднем плане и сделать его текущим заданием. Если jobspec отсутствует, используется оболочка для текущего задания. Возвращаемое значение - это значение команды, помещенной на передний план, или сбой, если он запускается, когда управление заданиями отключено, или, если он запускается с включенным управлением заданиями, если задание не указывает допустимое задание или задание задания указывает задание, которое было запущено без управления заданием. ,

Дальнейшее чтение (помимо man bash) по контролю за работой:

Десерт
источник
+1 но обидно это не работает когда забываешь t3в t1; t2; t3или t1 && t2 && t3.
JoL
@JoL Да, ^Z^Zи %-;%+;t3в некоторых случаях это достаточно хорошо, но это далеко не реальное решение проблемы.
десерт
2

Я видел этот метод здесь: /superuser/334272/how-to-run-a-command-after-an-already-running-existing-one-finishes

где вы сначала делаете Ctrl+, zчтобы остановить (приостановить) работающую, затем запускаете пропущенную команду следующим образом: fg && ./missed_cmd.shи она запустится, как только завершится fg.

fg( Команда переднего плана) переведет приостановленное задание в оперативный режим &&и обеспечит выполнение пропущенной команды только в случае успешного выполнения первой команды.

Джордж Удосен
источник