公众号旧文
Linux 命令后面的 && \ 是什么意思?
我经常能看到这样的命令:
apt update && \
apt upgrade -y && \
apt autoremove -y && \
apt clean
git pull && \
make && \
make install
这个 && 我大概能猜出来是什么意思。
但后面的反斜杠 \\ 又是什么?
为什么很多教程都喜欢这么写?
一、&& 是条件执行
先看一个例子:
echo hello && echo world
hello
world

可能很多人会觉得 && 就是执行下一条命令。
但 && 真正的含义是前一条命令成功,才执行后一条命令。
例如:
false && echo world
(什么都没有)

因为 false 返回失败。
所以 echo world 根本不会执行。
因此:
cmd1 && cmd2
的意思是:
如果 cmd1 成功
那么执行 cmd2
否则停止
二、为什么不用分号?
Linux 还有另一种写法:
cmd1 ; cmd2
例如:
false ; echo world
输出:
world
即使前面的命令失败了,后面的命令依然会执行。
区别就在这里:
cmd1 ; cmd2
等于:
不管成功失败
都执行 cmd2
而:
cmd1 && cmd2
等于:
只有成功
才执行 cmd2
三、那反斜杠 \\ 又是什么?
它只是一个续行符(Line Continuation)
意思是:这一行还没结束,下一行继续。``
例如:
echo hello \
world
实际上等价于:
echo hello world
Shell 在解析时,会把反斜杠和换行一起忽略掉。
所以:
apt update && \
apt upgrade -y
实际上会变成:
apt update && apt upgrade -y
完全一样。
四、为什么教程喜欢写 && \\?
因为命令太长了。
例如:
apt update && apt upgrade -y && apt autoremove -y && apt clean
虽然能执行,但看起来很难读。
于是很多人会写成:
apt update && \
apt upgrade -y && \
apt autoremove -y && \
apt clean
这样每一步都独占一行:
update
↓
upgrade
↓
autoremove
↓
clean
逻辑一目了然。
五、本质上发生了什么?
实际上 Shell 看到的是:
apt update && apt upgrade -y && apt autoremove -y && apt clean
执行顺序是:
apt update
成功?
├─ 否 → 停止
└─ 是
↓
apt upgrade
成功?
├─ 否 → 停止
└─ 是
↓
apt autoremove
成功?
├─ 否 → 停止
└─ 是
↓
apt clean
这就像流水线一样。
前一步没做好,后一步根本不开始。
六、很多人误解了 \\
``
最常见的误解是:
&& 是连接命令的
\ 也是连接命令的
但真正负责逻辑连接的是:&&``
而:\ 只是为了让代码换行更好看。
所以:
apt clean && \
rm file
和:
apt clean && rm file
完全等价。
没有任何执行上的区别。
只是前者更容易阅读。
七、一句话总结
&&:前一个命令成功,才执行下一个命令。
\:告诉 Shell 下一行属于同一条命令。
因此:
cmd1 && \
cmd2
本质上就是:
cmd1 && cmd2
只不过写成了两行而已。
真正决定命令执行逻辑的是 &&。
而反斜杠 \\,只是为了让人看得更舒服。