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` |
顺序执行,不管成败 |
|
|
|
分行写 | 换行 | 换行 | 换行 |
分号 ; 是三方都认的"顺序执行",不确定对方版本时,用分号最保险。
先查自己是哪个版本
在 PowerShell 里跑这一行,就能看到版本:
$PSVersionTable.PSVersionMajor 是 5 就是老版,Major 是 7 就是新版。Windows 自带的一般都是 5.1,除非你自己装过 7。
给别人写命令的人,要守的规矩
这件事之后我立了一条规矩,写给别人命令时先问自己三个问题:
- 对方在哪个壳里执行?FinalShell 的 Linux 还是 Windows 的 PowerShell?
- 那个壳认不认这个符号?不认就换它认的写法。
- 命令能不能整段粘贴执行?对方说"多行只执行第一行",那就必须串成一整行。
符号本身没有对错,只有"这个壳认不认"。给错壳的命令,再正确的命令也跑不起来。
一句话总结
bash 用 &&,老版 PowerShell 用 ;,新版 PowerShell 两者都认。拿不准版本的时候,一律用分号。
评论
发表评论