cd进入多个目录并运行命令

时间:2019-10-18 00:10:43

标签: bash shell docker yarn cd

尝试使用Shell脚本自动执行某些操作。

操作系统: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 个答案:

答案 0 :(得分:1)

我认为您打算将每个子命令置于后台。为此,您在每个命令的末尾添加一个&符。如果这些子进程正在写入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!!"

注意:如果任何子进程尝试从终端读取输入,则它们将挂起。