3

我正在编写一个 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 `;'
4

3 回答 3

11

的价值是$SERVERCOMMAND多少?你必须有一个分号。

对于它的价值,您可以将 pushd/cd 简化为一个 pushd:

pushd $TRUNK
$SERVERCOMMAND &
popd

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

(cd $TRUNK; $SERVERCOMMAND &)
于 2011-06-09T20:11:53.673 回答
3

你也可以使用cd -

cd $TRUNK
$SERVERCOMMAND &
cd -
于 2011-06-09T20:14:38.820 回答
3

除非本身存在错误,否则分号${SERVERCOMMAND}不应触发语法错误bash。分号问题必须位于其他地方,在我们看不到的部分代码中。

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

  • ${TRUNK}没有引用变量扩展。如果目录名称包含空格,bash在调用之前将其拆分为多个字段cd
  • cd ${TRUNK}不检查的返回值。如果目录不存在,bash将调用当前目录中的服务器。
  • 该函数不测试是否${SERVERCOMMAND}可能无法执行(例如,找不到命令)。
  • function关键字和pushdandpopd命令是特定的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
}
于 2011-06-10T19:57:00.830 回答