Выполняет ли сценарий Shell команды последовательно?

Есть команда texi2pdf (1) (часть texinfo-tex ] здесь, в Fedora), который выполняет действия из источников .texi (TeXinfo) для документации GNU info .

Сами файлы .texi обычно входят в пакеты с исходным кодом. Вы должны уметь создавать документацию в формате PDF с помощью стандартного ./ configure; заставить танцевать или, возможно, сделать doc .

Обратите внимание, что некоторые команды объединены, find в findutils и множество стандартных команд Unix в coreutils . Их документация является частью более крупного документа и, вероятно, не может быть создана отдельно.

5
29.09.2016, 12:49
2 ответа

В:

cmd1
cmd2

или

cmd1; cmd2

Они выполняются последовательно.

В

cmd1 && cmd2

или

cmd1 || cmd2

Они выполняются последовательно, но выполняется ли cmd2 вообще, зависит от того, успешно ли cmd1 выполняется (для && ) или не выполняется (для || ).

В

cmd1 | cmd2

,

cmd1 & cmd2
cmd1 |& cmd2 # ksh
coproc cmd1; cmd2 # bash/zsh

или

cmd1 <(cmd2) # ksh/zsh/bash (also yash though with a different meaning)

Они выполняются одновременно. В первом случае некоторые оболочки ждут только cmd2 , прежде чем продолжить выполнение остальной части скрипта, а некоторые ждут и того, и другого. Во втором случае оболочки ждут только cmd2 ( cmd1 считается запущенным асинхронно (или в фоновом режиме при запуске в интерактивной оболочке)), а в третьем - cmd1 ( cmd2 асинхронный).

In:

< "$(cmd1)" x=$(cmd2) y=$(cmd3) cmd4 "$(cmd5)" > "$(cmd6)"

Команды выполняются последовательно, но порядок зависит от оболочки. В любом случае cmd4 будет выполняться последним.

В:

cmd1 =(cmd2) # zsh

Они выполняются последовательно (сначала cmd2 ).

Обратите внимание, что во всех этих случаях любая из этих команд может запускать другие процессы. Оболочка ничего о них не знает, поэтому не может их дождаться.

18
27.01.2020, 20:34

Чтобы ответить на ваш заглавный вопрос: Да, команды в сценарии оболочки выполняются синхронно в последовательности, поэтому оболочка блокируется, пока выполняется ваш сценарий Python.

Конечно, было бы лучше исправить источник ошибки, но если это невозможно, то разумным подходом будет shell-сценарий, который будет пытаться выполнить сценарий python, пока не вернет нулевой код состояния (while true;do ./script.py; if [["$?" = 0]];break;done).

0
27.01.2020, 20:34

Теги

Похожие вопросы