-bash: cmd: 找不到命令



我在/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

并且无法找出原因。

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

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

如果您确实希望cmd可用,则必须unicorn source脚本:

source /etc/init.d/unicorn

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

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

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.

最新更新