Перейдите в несколько каталогов и выполните команды - PullRequest
0 голосов
/ 18 октября 2019

Попытка автоматизировать что-либо с помощью сценария оболочки ..

ОС : Mac

Хотите добиться чего-то подобного:

script.sh

cd foo
yarn start
cd ..
cd bar
yarn start
cd ..
cd foobar
./start.sh
cd ..
cd boofar
docker-compose up
cd ..
echo "Go to your localhost and see your webapp working!!"

, но эти команды не останавливаются, пока я не нажму ^C.

Возможно ли что-то подобное? Я пытался использовать &&, ; и т. Д., Но не могу найти правильную комбинацию. Кроме того, заглянул в screen, чтобы открыть несколько окон, но я тоже не могу понять, что это правильно.

1 Ответ

1 голос
/ 18 октября 2019

Я думаю, вы намереваетесь поместить каждую из подкоманд в фоновый режим. Для этого вы добавляете амперсанд в конец каждой команды. Если эти дочерние процессы пишут в stdout / stderr, вы должны поставить перед ними префикс nohup и перенаправить вывод в файл журнала некоторой формы:

#!/bin/bash

cd foo
nohup yarn start > {/log/file1} &
cd ..
cd bar
nohup yarn start > {/log/file2} &
cd ..
cd foobar
nohup ./start.sh > {/log/file3} &
cd ..
cd boofar
nohup docker-compose up > {/log/file4} &
cd ..
echo "Go to your localhost and see your webapp working!!"

Вы также можете поместить общую функцию в функцию всделать весь сценарий более читабельным:

#!/bin/bash

function start_child() {
  cd "${1}"
  logfile="${2}"
  shift 2
  nohup "${@}" > ${logfile} &
  cd ..
}

start_child foo /log/file1 yarn start
start_child bar /log/file2 yarn start
start_child foobar /log/file3 ./start.sh
start_child boofar /log/file3 docker-compose up
echo "Go to your localhost and see your webapp working!!"

Примечание. Если какой-либо из дочерних процессов попытается прочитать ввод с терминала, он зависнет.

...