-bash:cmd:找不到命令

时间:2014-02-26 00:40:37

标签: bash unicorn init.d

我在/etc/init.d/unicorn

中有这个
#!/bin/bash
# /etc/init.d/unicorn

# ### BEGIN INIT INFO
# chkconfig: 2345 95 016
# processname: unicorn
# dscription: Stop/start unicorn
### END INIT INFO

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

cmd() {
    cd /vagrant
    unicorn -p 3000 -D
}

# Start the service
start() {
    su - vagrant -c cmd
}

### main logic ###
case "$1" in
    start)
        start
        ;;
    *)
        echo $"Usage: $0 {start}"
        exit 1
esac

exit 0

我正在尝试在我的本地rails文件夹中启动独角兽。我觉得这个命令应该有效:

su - vagrant -c cmd

并无法弄清楚原因。

2 个答案:

答案 0 :(得分:1)

我猜您的印象是,该脚本中定义的shell函数cmd应该在早先启动该脚本的shell中可用。

这是错误的,除非你source那个脚本(/etc/init.d/中的脚本不常见)。当您启动脚本(而不是source)时,您将启动执行脚本的第二个进程。 shell函数的所有定义(如cmd)仅在该shell脚本中有效,并随着该过程而死亡。

如果您真的希望cmd可用,则必须source脚本unicorn

source /etc/init.d/unicorn

然而,su命令仍然无法调用该shell函数,因为它只能调用可以使用exec()开始的可执行文件,因此它们需要是一个文件。 shell函数不是。

答案 1 :(得分:0)

要解决此问题,请在su调用的shell中内联函数:

start() {
    su - vagrant -c 'cd /vagrant && unicorn -p 3000 -D'
}

至于首先找出原因,工具很有帮助:

$ shellcheck unicorn

In unicorn line 19:
    su - vagrant -c cmd
                    ^-- SC2033: Shell functions can't be passed to external commands.