PowerShell 与 Linux 命令串联符号为什么不一样


先说结论

多条命令想一次粘贴执行,Linux 的 bash 里用 && 串联,Windows 老版 PowerShell 里要用分号 ; 串联。把 bash 的 && 原样粘进老版 PowerShell,会直接报 ParserError,一条都执行不了。

当时的事

有一次我给了一串 Linux 命令,用 && 串成一整行——这是我平时给 FinalShell 的标准写法,粘过去就能整段执行。结果对方是在 Windows PowerShell 里粘的,当场报 ParserError。

错在我:给命令之前没先确认对方用的是哪个壳。同一串命令,换个壳就可能是另一套语法。

为什么不一样

&& 在 bash 里叫"条件串联":前一条命令成功了,才执行下一条;前一条失败,后面的就不执行了。写多条有依赖关系的命令时用它很顺手。

Windows PowerShell 5.1 里根本没有 && 这个运算符。PowerShell 里 & 是另一个意思:调用运算符(用来执行命令或脚本块)。解析器看到 && 就懵了,于是报 ParserError。

直到 PowerShell 7(2020 年发布),微软才把 && 和 || 补进来。所以"PowerShell 不支持 &&"这句话要加限定:5.1 不支持,7+ 支持。

对照表

写法

bash(Linux)

PowerShell 5.1

PowerShell 7+

前成功才执行后

cmd1 && cmd2

不支持

cmd1 && cmd2

前失败才执行后

`cmd1 \

\

cmd2`

不支持

`cmd1 \

\

cmd2`

顺序执行,不管成败

cmd1 ; cmd2

cmd1 ; cmd2

cmd1 ; cmd2

分行写

换行

换行

换行

分号 ; 是三方都认的"顺序执行",不确定对方版本时,用分号最保险。

先查自己是哪个版本

在 PowerShell 里跑这一行,就能看到版本:

$PSVersionTable.PSVersion

Major 是 5 就是老版,Major 是 7 就是新版。Windows 自带的一般都是 5.1,除非你自己装过 7。

给别人写命令的人,要守的规矩

这件事之后我立了一条规矩,写给别人命令时先问自己三个问题:

  1. 对方在哪个壳里执行?FinalShell 的 Linux 还是 Windows 的 PowerShell?
  2. 那个壳认不认这个符号?不认就换它认的写法。
  3. 命令能不能整段粘贴执行?对方说"多行只执行第一行",那就必须串成一整行。

符号本身没有对错,只有"这个壳认不认"。给错壳的命令,再正确的命令也跑不起来。

一句话总结

bash 用 &&,老版 PowerShell 用 ;,新版 PowerShell 两者都认。拿不准版本的时候,一律用分号。

评论

此博客中的热门博文

甲骨文免费额度怎么算:2 核 12G 为什么正好跑满一个月