Я хотел бы знать, каково поведение Ctrl+Z и fg в bash при желании добавить команды, которые будут выполнены после завершения выполняющейся команды. Например, в приведенной ниже последовательности команд я ожидал, что на консоли будет отображаться "1", затем "2", затем "3", затем "4", но я получу только последнюю команду, "echo 4", после сна 30 отделки:

avilella@magneto:~$ sleep 30 && echo 1 
^Z
[1]+  Stopped                 sleep 30
avilella@magneto:~$ fg && sleep 5 && echo 2
sleep 30
^Z
[1]+  Stopped                 sleep 30
avilella@magneto:~$ fg && sleep 5 && echo 3
sleep 30
^Z
[1]+  Stopped                 sleep 30
avilella@magneto:~$ fg && sleep 5 && echo 4
sleep 30
4

Есть идеи?

2 ответа2

1

Control-Z приостанавливает задание (не командную строку вашей оболочки), поэтому все остальные команды будут выполняться без ожидания. Похоже, что когда вы останавливаете задание, оболочка пытается запустить следующее, но, поскольку вы использовали && а предыдущая команда не была завершена ОК (не была завершена вообще, но была приостановлена), команда с && отбрасывается. С другой стороны, если вы используете ; вместо && для второй команды в командной строке, вы увидите, что вторая команда выполняется, когда первая приостановлена:

$ perl -e '$|=1;for (1..5){ sleep 1;print}print qq{END\n} ';echo test_z00000000000000
12^Z
[1]+  Stopped                 perl -e '$|=1;for (1..5){ sleep 1;print} '
test_z00000000000000
$ fg
perl -e '$|=1;for (1..5){ sleep 1;print} '
345END
$ 
1

Это не fg ты хочешь; это может быть wait . Например

$ cp large.file some/where
^Z
[1]+ 22224 suspended  cp
$ wait && beep  # beep when first command completes

Для получения дополнительной информации:

$ help wait

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .