Сценарий Bash с меньшими сценариями внутренне

У меня есть последовательность маленьких скриптов удара, которые я должен запустить в особом порядке.

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

Однако, когда я пытаюсь выполнить сценарий, он пытается запустить каждый из внутренних скриптов сразу и возвращает много из no such file or directory ошибки.

У меня есть свой сценарий, форматирующий как это.

#!/bin/bash
bash script1.sh
bash script2.sh
bash script3.sh 

И я не хочу выполнять script2.sh, пока script1.sh не закончил выполняться. Существует ли простой способ сделать это?

Править: Я забыл упоминать, что у меня есть несколько сценариев Python в списке также. Не уверенный, если это изменяет что-нибудь.

4
задан 21 August 2017 в 12:30

4 ответа

Правильное решение для Вас зависит от того, что Вы хотите:

  • Объединение сценариев с && только выполнит второе, если первое выходы успешно
  • Объединение сценариев с || только выполнит второе, если первое не выйдет успешно

, Если Вы хотите, чтобы вторая команда была выполнена после первого , неважно , выходит ли это успешно или нет, можно использовать или ; или & wait :

bash script1.sh ;
bash script2.sh & wait
bash script3.sh
7
ответ дан 23 November 2019 в 11:42

Вы могли попытаться получить сценарии

#!/bin/bash
. script1.sh
. script2.sh
. script3.sh

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

#!/bin/bash
(
    . script1.sh
)
(
    . script2.sh
)
(
    . script3.sh
)

, Другой possiblility должен назвать сценарии непосредственно:

#!/bin/bash
./script1.sh
./script2.sh
./script3.sh

, Если Вы хотите, чтобы все фоновые процессы, порожденные сценариями, закончились, добавьте wait для ожидания их

, например,

./script1.sh
wait
./script2.sh
<час>

текущее решение работает одновременно, поскольку bash открывает новую оболочку и выполняет это

3
ответ дан 23 November 2019 в 11:42

Сделайте это как этот путь.

bash script1.sh && bash script2.sh && bash script3.sh

Или этот путь:

bash script1.sh &&
bash script2.sh &&
bash script3.sh

Это удостоверится, если предыдущий сценарий вышел успешно, то следующий сценарий выполнится.

Или использование ; вместо этого, необходимо ли выполнить следующий сценарий независимо предыдущего сценария, успех, из которого выходят, или отказавший.

bash script1.sh ; bash script2.sh ; bash script3.sh
1
ответ дан 23 November 2019 в 11:42

Добавьте set -e к началу всех сценариев. Когда эта опция будет идти, любой сбой команды заставит целый сценарий перестать работать, как то, что произошло бы, если бы команды были разделены с '& &';. спецификация

"большинство сценариев берет вход от выходных файлов предыдущего", походит на то, для чего make. Рассмотрите использование его.

0
ответ дан 23 November 2019 в 11:42

Другие вопросы по тегам:

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