Использование блока кода {} в bash

Мне было интересно, почему блок кода использовался в следующем примере:

possibly_hanging_job & { sleep ${TIMEOUT}; eval 'kill -9 $!' &> /dev/null; }

Это могло бы быть написано так (без использования кода), а именно?

possibly_hanging_job & 
sleep ${TIMEOUT}
eval 'kill -9 $!' &> /dev/null

Ответы

Ответ 1

Вставка двух последних команд в фигурные скобки дает понять, что "это не только две дополнительные команды, которые мы запускаем после долгого процесса, который может зависать, они вместо этого являются неотъемлемой частью для правильного его закрытия прежде чем мы перейдем к остальной части оболочки script". Если бы автор написал:

command &
a
b
c

было бы не совсем ясно, что a и b являются лишь частью правильного завершения command. Написав это так:

command & {a; b}
c

автор поясняет, что a и b существуют для того, чтобы получить command полностью законченный и очищенный до фактического следующего шага c.

Ответ 2

На самом деле мне даже интересно, почему там eval. Насколько я вижу, это также должно работать без этого.

Относительно вашего фактического вопроса: Я думаю, что блок кода должен подчеркнуть, что sleep принадлежит kill. Но это не нужно. Он также должен работать следующим образом:

possibly_hanging_job & sleep ${TIMEOUT}; kill -9 $! &> /dev/null

Ответ 3

Да, я не вижу причин, чтобы фигурные скобки появлялись здесь.