Una solución a su problema es la siguiente:
В общем, нет лучшего решения, чем то, что дано в Базовое управление заданиями :остановить задание, добавить задание в стек и `fg `, но, как вы указываете, это не удается при использовании с &&
(, потому что команда, размещенная в фоновом режиме, «выходит» с не -нулевым кодом состояния ), и в любом случае не всегда будет иметь желаемый эффект с составными командами (текущий -работающая команда помещается в фоновый режим, а следующие команды выполняются немедленно ).
Для этого конкретного случая использования -есть решение — вы можете использоватьlockf.py
Диомидиса Спинеллиса для создания очереди команд, ожидающих завершения текущей apt
команды:
lockf /var/lib/apt/lock apt install tree
Это можно обобщить на любую команду, завершение которой можно предсказуемым образом наблюдать извне.
Очередь неупорядочена и может вызвать проблемы — если вы запустите
sudo apt update && sudo apt upgrade
и поставить установку в очередь во время работы apt update
, вы можете закончить тем, что apt install
запускается после apt update
, а apt upgrade
завершается ошибкой, потому что не может получить блокировку.
Использование утилиты flock(1)
из Linux (или скрипта lockf.py
из другого ответа , аналогичного в этом отношении ), не гарантирует, что «поставленные в очередь» команды будут выполняться в том порядке, в котором они были отправлены.
$ sh -c 'for i in 1 2 3 4 5 6 7 8 9; do sleep.1; flock / sh -c "echo $i; sleep.3" & done; wait'
1
2
3
5
4
...
Глупое «решение» для создания очереди заданий может быть чем-то вроде:
$ (echo > jobq; tail -f jobq | sh) &
[2] 6641
$ echo echo 1 >> jobq
1
$ echo echo 2 >> jobq
$ 2
etc
Если у вас вошло в привычку всегда выполнять обновление/апгрейд в фигурных скобках,
( sudo apt update && sudo apt upgrade )
, затем управление заданиями правильно приостанавливает подпроцесс -, позволяя вам ввести
fg ; echo "Example new command"