我有这个脚本:
cd foo && git pull && node server.js & && pid=$! && echo "$pid"
但 bash 似乎不喜欢这部分:& &&
...所以我把它改成这样:
set -e
cd foo
git pull
node server.js &
pid=$!
echo "$pid"
但有没有办法用双&符号&&
来代替呢?
也许问题的目的是这两者是否等价:
cd foo && git pull && node server.js & && pid=$! && echo "$pid"
cd foo && git pull && ( node server.js & ) && pid=$! && echo "$pid"
我的猜测是他们不是相等的..
答案1
cmd1 && cmd2
意思是“执行cmd1
,如果成功,则执行cmd2
”。一个命令运行完成后才知道它是否成功,因此将一个命令放在后台并使下一个命令的执行取决于第一个命令是否成功是没有意义的。
听起来您真正想做的是“cmd1
在后台开始,然后执行cmd2
”。这只是cmd1 & cmd2
。
因此,这是您想要的命令:cd foo && git pull && node server.js & pid=$! && echo "$pid"
答案2
空白是免费的。 IMO,对于像这样的长命令列表,换行符有助于可读性。即使您想用于&&
逻辑含义:例如
cd foo &&
git pull && {
node server.js &
pid=$!
echo "$pid"
}
node
只有当 和 都cd
成功时才会进入区块git
。
在这种情况下,我认为这set -e
不太有用,因为您自己处理返回代码。