【问题标题】:Spawn a background process in a bash function在 bash 函数中生成后台进程
【发布时间】:2011-06-09 20:08:11
【问题描述】:

我正在编写一个 Bash 函数来启动需要从某个文件夹启动的服务器,但我不希望启动该服务器影响我当前的工作。我写了以下内容:

function startsrv {
        pushd .
        cd ${TRUNK}
        ${SERVERCOMMAND} & 
        popd
}

我的变量都设置好了,但是当它执行时,我收到一个关于输出中意外分号的错误,似乎 Bash 在后台以 ${SERVERCOMMAND} 开头的 & 符号后插入了一个分号。

我可以做些什么来在后台启动${SERVERCOMMAND},同时仍然使用 pushd 和 popd 来确保我最终回到当前目录?

编辑:echo ${SERVERCOMMAND} 的输出,因为它是被请求的:

yeti --server --port 8727

错误信息:

-bash: syntax error near unexpected token `;'

【问题讨论】:

    标签: bash shell unix bash-function


    【解决方案1】:

    $SERVERCOMMAND 的值是多少?里面必须有分号。

    您可以将 pushd/cd 简化为一个 pushd:

    pushd $TRUNK
    $SERVERCOMMAND &
    popd
    

    或者创建一个子shell,这样 cd 只影响一个命令:

    (cd $TRUNK; $SERVERCOMMAND &)
    

    【讨论】:

    • 推送提示很好,但是 ${SERVERCOMMAND} 没有分号,它等于yeti --server --port ${YETIPORT} YETIPORT 是数字。使用您的 subshel​​l 版本时,我遇到了同样的错误。
    • 你能给出你得到的确切错误信息吗?也可以echo "$SERVERCOMMAND" 告诉我们它的确切值吗? (${YETIPORT} 的变量替换应该已经执行,所以您应该看到一个实际的端口号,而不是变量名。)
    【解决方案2】:

    你也可以使用cd -

    cd $TRUNK
    $SERVERCOMMAND &
    cd -
    

    【讨论】:

      【解决方案3】:

      ${SERVERCOMMAND} 中的分号不应触发语法错误,除非bash 本身存在错误。分号问题一定在别处,在我们看不到的部分代码中。

      除了分号问题,您的代码中还有一些小错误:

      • ${TRUNK} 变量扩展未被引用。如果目录名称包含空格,bash 将在调用cd 之前将其拆分为多个字段。
      • 不检查cd ${TRUNK} 的返回值。如果目录不存在,bash 将调用当前目录中的服务器。
      • 该函数不会测试${SERVERCOMMAND} 是否可能无法执行(例如,找不到命令)。
      • function 关键字以及pushdpopd 命令是bash 专用的,因此此代码不会在 POSIX shell 中运行。

      这是一个更安全、与 POSIX 兼容的重写:

      log() { printf '%s\n' "$*"; }
      error() { log "ERROR: $*" >&2; }
      fatal() { error "$*"; exit 1; }
      
      startsrv() {
          (
              cd "${TRUNK}" || fatal "failed to cd to '${TRUNK}'"
              set -- ${SERVERCOMMAND}
              command -v "$1" >/dev/null || fatal "command '$1' not found"
              command "$@" &
          ) || exit 1
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-08
        • 2013-07-28
        • 2015-06-22
        • 2011-01-31
        • 1970-01-01
        • 2011-04-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多