从bash导出函数并通过命令行运行

时间:2019-05-25 21:18:11

标签: bash shell

我在server.sh文件中有一个bash脚本

#!/usr/bin/env bash

function start {
    docker-compose up -d --build && docker exec php bash -c "composer install; vendor/bin/phinx migrate" && \
    docker exec web bash -c "cd web; npm install; pm2 start node_modules/react-scripts/scripts/start.js --name web"
}

function stop {
    docker-compose down
}

export -f start stop

我想从

等命令行调用这些函数
$./server.sh start
$./server.sh stop

这可能吗?现在它什么也没做

2 个答案:

答案 0 :(得分:2)

您的脚本会忽略其命令行参数,因此将其传递给startstop是毫无意义的。

它唯一要做的就是定义(并出于某种原因导出)两个函数,因此在单独的shell中运行它什么也没做。

您可以做的是在当前shell中获取脚本:

. ./server.sh

然后,您将有两个可用的功能可以运行:

start

stop

(均在当前shell中)。

如果您希望它以不同的方式工作,则必须重新设计Shell脚本。

答案 1 :(得分:1)

您不能像这样使用export -f start stop

这里是一个很好的线程,解释了如何使用它:

https://unix.stackexchange.com/questions/22796/can-i-export-functions-in-bash

如果您希望从命令行调用start / stop方法,则必须像这样公开它:

#!/usr/bin/env bash

function start {
    docker-compose up -d --build && docker exec php bash -c "composer install; vendor/bin/phinx migrate" && \
    docker exec web bash -c "cd web; npm install; pm2 start node_modules/react-scripts/scripts/start.js --name web"
}

function stop {
    docker-compose down
}

if [[ "$1" == "start" ]]; then
  start
fi    

# [... same idea for the stop one ...]

然后将其命名为$ ./server.sh start

这是一个示例,因为有更有效的方法来管理参数。

希望这会给您一些见识。