bash 从文件中执行多行命令

bash exec multi lines commands from files

我想exec 文件中的多行命令。 两个文件,一个是start.sh,一个是project_start.sh

文件start.sh

#!/bin/bash

set -x

# ...

# run project_start.sh and want to replace the current process.
exec $(cat project_start.sh) &

# ...

文件project_start.sh

gunicorn --worker-class=tornado main:app -b 0.0.0.0:19991 --pid=/var/run/tool_mqtt/tool_mqtt.pid --access-logfile=/var/log/tool_mqtt/tool_mqtt.log --error-logfile=/var/log/tool_mqtt/tool_mqtt.log &
python main.py &

当我运行sh start.sh时,总是显示

+ exec gunicorn --worker-class=tornado main:app -b 0.0.0.0:19991 --pid=/var/run/tool_mqtt/tool_mqtt.pid --access-logfile=/var/log/tool_mqtt/tool_mqtt.log --error-logfile=/var/log/tool_mqtt/tool_mqtt.log & python main.py &
usage: gunicorn [OPTIONS] [APP_MODULE]
gunicorn: error: unrecognized arguments: & python main.py &

说明第二行命令是第一行命令的参数。我在第一行之后使用 \ 但它不起作用。

如何避免?

一个问题是start.sh中终止gunicorn命令的换行符在不带引号的参数扩展执行分词时消失。另一个问题是 exec 需要一个命令及其参数,而不是任意的 shell.

只需使用 exec project_start.sh &bash project_start.sh &

您看到的问题是 $( ) 将执行该命令,但结果连接在一起在一行中。为了向自己证明这一点,简单地试试这个:

echo $( cat project_start.sh ) 

因此您可以看到该文件中的第二个命令只是作为参数传递给第一个命令。

但是,如果您想分别执行该文件中的每一行,请考虑编写如下循环:

while 
  read command
do
  exec $command &
done < project_start.sh
#eventually - you will probably want a wait somewhere
wait