为什么不能用“;”调用两个别名?

为什么不能用“;”调用两个别名?

当我尝试使用字符;(例如ls; cd)组合两个普通命令时,它工作正常。但是,我创建了两个别名(stopdevstartdev),如果我尝试将它们组合起来:

stopdev; startdev

或者即使我只是尝试在后面添加一个分号:

stopdev;

我收到语法错误:

bash:意外标记“;”附近出现语法错误

如果我使用,我也会遇到同样的问题&&

stopdev && startdev

bash:意外标记“&&”附近出现语法错误

我对此感到困惑,因为我认为别名就像任何其他命令一样......但显然它们不是。

那么,两个问题:

  1. 为什么使用;or &&with 别名调用无效?
  2. 有没有什么方法(除了创建stopstartdev别名之外)可以轻松地同时运行这两个命令?

这是 的定义stopdev

alias stopdev="cd $HOME/website; make website_stop; make backend_stop;"

答案1

只需用别名的定义替换别名即可扩展别名(作为标记列表,而不是字符串,这基本上相当于获取字符串并在末尾添加空格)。所以stopdev; true扩展为

cd $HOME/website; make website_stop; make backend_stop; ; true
                                                      ^^^

由于 shell 语法中不能有两个连续的分号,因此这是一个语法错误。

您可以删除;, 这会起作用stopdev; startev,但这不好,因为您传递给的任何参数stopdev都将传递给make backend_stop,这可能是不可取的。

你应该把它变成一个函数。另外,make如果命令失败,请勿运行命令cd

stopdev () {
  cd "$HOME/website" && {
    make website_stop
    make backend_stop
  }
}

一种改进是让函数即使make website_stop失败但make backend_stop成功也返回失败代码。

stopdev () {
  cd "$HOME/website" && {
    make website_stop
    ret=$?
    make backend_stop && return $ret
  }
}

请注意,这会将您留在~/website目录中。为了避免更改 shell 进程的目录,请在子 shell 中运行该函数。

stopdev () (
  cd "$HOME/website" && {
    make website_stop
    ret=$?
    make backend_stop && return $ret
  }
)

或者,通过 GNU make,您可以使用它的-C选项。

stopdev () {
  make -C "$HOME/website" website_stop
  ret=$?
  make -C "$HOME/website" backend_stop && return $ret
}

如果目标永远不会失败,那就两个都通过吧。

stopdev () (
  cd "$HOME/website" && make website_stop backend_stop
)

或者

stopdev () {
  make -C "$HOME/website" website_stop backend_stop
}

相关内容