Linux 命令后面的 && \ 是什么意思

Linux 命令后面的 && \ 是什么意思?

我经常能看到这样的命令:

1
2
3
4
apt update && \
apt upgrade -y && \
apt autoremove -y && \
apt clean
1
2
3
git pull && \
make && \
make install

这个 && 我大概能猜出来是什么意思。

但后面的反斜杠 \ 又是什么?

为什么很多教程都喜欢这么写?

一、&& 是条件执行

先看一个例子:

1
echo hello && echo world
1
2
hello
world

图片

可能很多人会觉得 && 就是执行下一条命令。

但 && 真正的含义是前一条命令成功,才执行后一条命令

例如:

1
false && echo world
1
(什么都没有)

图片

因为 false 返回失败。

所以 echo world 根本不会执行。

因此:

1
cmd1 && cmd2

的意思是:

1
2
3
如果 cmd1 成功
那么执行 cmd2
否则停止

二、为什么不用分号?

Linux 还有另一种写法:

1
cmd1 ; cmd2

例如:

1
false ; echo world

输出:

1
world

即使前面的命令失败了,后面的命令依然会执行。

区别就在这里:

1
cmd1 ; cmd2

等于:

1
2
不管成功失败
都执行 cmd2

而:

1
cmd1 && cmd2

等于:

1
2
只有成功
才执行 cmd2

三、那反斜杠 \ 又是什么?

它只是一个续行符(Line Continuation)

意思是:这一行还没结束,下一行继续。

例如:

1
2
echo hello \
world

实际上等价于:

1
echo hello world

Shell 在解析时,会把反斜杠和换行一起忽略掉。

所以:

1
2
apt update && \
apt upgrade -y

实际上会变成:

1
apt update && apt upgrade -y

完全一样。

四、为什么教程喜欢写 && \

因为命令太长了。

例如:

1
apt update && apt upgrade -y && apt autoremove -y && apt clean

虽然能执行,但看起来很难读。

于是很多人会写成:

1
2
3
4
apt update && \
apt upgrade -y && \
apt autoremove -y && \
apt clean

这样每一步都独占一行:

1
2
3
4
5
6
7
update

upgrade

autoremove

clean

逻辑一目了然。

五、本质上发生了什么?

实际上 Shell 看到的是:

1
apt update && apt upgrade -y && apt autoremove -y && apt clean

执行顺序是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
apt update
成功?
├─ 否 → 停止
└─ 是

apt upgrade
成功?
├─ 否 → 停止
└─ 是

apt autoremove
成功?
├─ 否 → 停止
└─ 是

apt clean

这就像流水线一样。

前一步没做好,后一步根本不开始。

六、很多人误解了 \

最常见的误解是:

1
2
&& 是连接命令的
\ 也是连接命令的

但真正负责逻辑连接的是:&&``

而:\ 只是为了让代码换行更好看。

所以:

1
2
apt clean && \
rm file

和:

1
apt clean && rm file

完全等价。

没有任何执行上的区别。

只是前者更容易阅读。

七、一句话总结

&&:前一个命令成功,才执行下一个命令。

\:告诉 Shell 下一行属于同一条命令。

因此:

1
2
cmd1 && \
cmd2

本质上就是:

1
cmd1 && cmd2

只不过写成了两行而已。

真正决定命令执行逻辑的是 &&

而反斜杠 \,只是为了让人看得更舒服。

https://mp.weixin.qq.com/s/6BjAqI5Yyrur_aPeqfxB5A