当我尝试使用字符;
(例如ls; cd
)组合两个普通命令时,它工作正常。但是,我创建了两个别名(stopdev
和startdev
),如果我尝试将它们组合起来:
stopdev; startdev
或者即使我只是尝试在后面添加一个分号:
stopdev;
我收到语法错误:
bash:意外标记“;”附近出现语法错误
如果我使用,我也会遇到同样的问题&&
:
stopdev && startdev
bash:意外标记“&&”附近出现语法错误
我对此感到困惑,因为我认为别名就像任何其他命令一样......但显然它们不是。
那么,两个问题:
- 为什么使用
;
or&&
with 别名调用无效? - 有没有什么方法(除了创建
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
}