Ctrl + Z и fg для добавления команд

0

Я хотел бы знать, каково поведение 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

Есть идеи?

719016
источник
В чем реальная проблема? Вас интересует, как работает ^ Z & fg, или вы пытаетесь написать решение конкретной проблемы?
PriceChild
почему бы вам не запустить jobsпосле каждого Ctrl-Z и посмотреть, что у вас работает
Rich Homolka

Ответы:

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
K3 --- СРН
источник
Каким образом waitудовлетворяет требованиям ОП лучше, чем fg? Когда я запускаю ./do-work, нажимаю ctrl-z и печатаю fg && ./do-other-work, выходные данные первой работы снова передаются на консоль, а вторая работа начинается после завершения первой. Разве это не то, чего хотел ОП? Если я буду использовать wait, вторая работа начнется, не заботясь о судьбе первой работы.
JHH