当我尝试使用;
字符(例如ls; cd
)组合两个普通命令时,它工作正常。但是,我创建了两个别名 (stopdev
和startdev
),如果我尝试将它们组合起来:
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:意外标记“&&”附近的语法错误
我对此感到困惑,因为我认为别名就像任何其他命令一样......但显然它们不是。
所以,两个问题:
;
或&&
使用别名调用无效?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)