Контекст:
Скажем, у меня есть:
(
#outer subshell
{
#inner command group, pipe-connected to ensure simultaneous invocation
do_first_thing
#die, somehow
} | {
#inner command group, pipe-connected to ensure simultaneous invocation
sleep 10
do_second_thing
}
)
echo "out"
У меня есть внешняя подоболочка (не обязательно; это может быть группа команд или ее можно полностью удалить). Внутри у меня есть две соединенные конвейером группы команд, которые вызываются одновременно. Я хочу, чтобы обе группы начали выполняться, а затем, когда первая группа завершится (вторая все еще будет sleep
ing), я хочу, чтобы выполнение внешней подоболочки остановилось, где находится строка #die, somehow
.
Вопрос:
Что я должен сделать, чтобы при достижении строки #die, somehow
все на уровне #outer subshell
завершалось, но выполнение продолжалось после него (т.е. печаталось out
)?
Что я пробовал:
Одним из решений является использование kill 0
(убить все в текущей группе процессов), чтобы выйти из обеих внутренних групп команд, но тогда echo "out"
никогда не произойдет; вся группа будет уничтожена, а не только внешняя подоболочка.
Я также пытался временно переопределить, а затем unset
обработать функцию exit
, но это, похоже, просто переносит проблему в другое место. Возможно, я делаю это неправильно; Я ни в коем случае не гуру Bash.
Почему?
Не вдаваясь в подробности, странные группы команд, связанные с подоболочкой, необходимы, потому что использование &
для разветвления процессов не работает детерминировано в моей системе (встроенная * nix). В результате группы, соединенные конвейером, гарантируют, что если do_first_thing
будет работать слишком долго (10 секунд в приведенном выше примере), произойдет do_second_thing
. Реальный вариант использования значительно сложнее, но именно в этом корень проблемы.
Ваше здоровье!