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

mac*_*ost 6 shell bash alias

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

stopdev; startdev
Run Code Online (Sandbox Code Playgroud)

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

stopdev;
Run Code Online (Sandbox Code Playgroud)

我收到一个语法错误:

bash:意外标记附近的语法错误`;'

如果我使用,我也有同样的问题&&

stopdev && startdev
Run Code Online (Sandbox Code Playgroud)

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

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

所以,两个问题:

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

这是 的定义stopdev

alias stopdev="cd $HOME/website; make website_stop; make backend_stop;"
Run Code Online (Sandbox Code Playgroud)

Gil*_*il' 11

一个别名只是通过用它的定义替换别名来扩展(作为一个标记列表,而不是一个字符串,这基本上等同于获取字符串并在末尾添加一个空格)。所以stopdev; true扩展为

cd $HOME/website; make website_stop; make backend_stop; ; true
                                                      ^^^
Run Code Online (Sandbox Code Playgroud)

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

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

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

stopdev () {
  cd "$HOME/website" && {
    make website_stop
    make backend_stop
  }
}
Run Code Online (Sandbox Code Playgroud)

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

stopdev () {
  cd "$HOME/website" && {
    make website_stop
    ret=$?
    make backend_stop && return $ret
  }
}
Run Code Online (Sandbox Code Playgroud)

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

stopdev () (
  cd "$HOME/website" && {
    make website_stop
    ret=$?
    make backend_stop && return $ret
  }
)
Run Code Online (Sandbox Code Playgroud)

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

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

如果目标永远不会失败,只需通过它们。

stopdev () (
  cd "$HOME/website" && make website_stop backend_stop
)
Run Code Online (Sandbox Code Playgroud)

或者

stopdev () {
  make -C "$HOME/website" website_stop backend_stop
}
Run Code Online (Sandbox Code Playgroud)