Skip to content

可移植性矩阵:跨发行版、跨平台、行尾编码与运行体来源

本页结论:可移植性排序清晰——python 语言层完全跨平台(但脚本里调外部命令会把平台依赖请回来);PowerShell 7 是唯一真正跨平台的 shell,本仓库 9 个任务里 7 个的 Linux 版(demos/pwsh)与 Windows 版(demos/powershell7)脚本逐字节相同;bash/zsh/fish 属于 POSIX 世界,无法在 Windows 原生运行,且三者互不兼容(fish 语法与 POSIX 完全断裂,zsh 与 bash 有数组下标、分词默认值等实质差异);cmd 与 PowerShell 5 是 Windows 专属。行尾与编码各有坑:.bat 必须 CRLF(本仓库 cmd 脚本即 CRLF 入库),PowerShell 5 读无 BOM 的 UTF-8 会按 ANSI 解释,故 demos/powershell5 全部保持 ASCII,中文注释只出现在 PowerShell 7 脚本里。

五维对照

运行体跨发行版(Linux)跨平台(Windows)行尾 / 编码要求运行体获取方式版本锁定与证据
bashPOSIX 子集通行各发行版;本仓库脚本用 #!/usr/bin/env bash无法原生运行(需 WSL/Git Bash 等兼容层)LF;无编码坑发行版自带bash:5.2 镜像 tag+digest 双锁;快照 version=GNU bash, version 5.2.37(1)-release (x86_64-pc-linux-musl)
zsh与 bash 有实质差异:数组 1 基、默认不分词、(N) 限定符等,脚本不能照抄无法原生运行LF包管理器安装(本站 apk add zshalpine 基底 digest 锁定;快照 version=zsh 5.9 (x86_64-alpine-linux-musl)
fish与 POSIX 语法完全断裂(set/if ... end),bash 脚本无法迁移无法原生运行LF包管理器安装(本站 apk add fishalpine 基底 digest 锁定;快照 version=fish, version 4.0.2
pwsh(Linux)官方 Linux 发行(debian 基底镜像)同一套语法直通 Windows(见 powershell7 行)LF官方容器镜像mcr.microsoft.com/powershell:7.5-debian-12 tag+digest 双锁;快照 version=PowerShell 7.5.0
cmd不适用Windows 专属,随系统内置必须 CRLF;代码页相关字符需避开系统自带(windows-latest runner 内置)无镜像可锁;ver 输出实测 version=Microsoft Windows [Version 10.0.26100.33158]
powershell5不适用Windows 专属,随系统内置无 BOM 的 UTF-8 会被按 ANSI 读取——本站 powershell5 脚本全部保持 ASCII系统自带(runner 内置)版本随 runner 漂移,以 00_env 快照留痕:version=PowerShell 5.1.26100.33158
powershell7不适用(Linux 侧见 pwsh 行)windows-latest runner 预装同 pwsh;支持 UTF-8 脚本(本站 powershell7 脚本含中文注释)runner 预装 / MSI / Store版本随 runner 漂移,以 00_env 快照留痕:version=PowerShell 7.6.4
python语言层跨发行版语言层完全跨平台;但调用平台命令会重新引入依赖LF官方镜像 / 各平台安装包python:3.12-slim tag+digest 双锁;快照 version=Python 3.12.14

Windows 侧 00_env 快照已入库(demos/{cmd,powershell5,powershell7}/00_env.*.out.txt),上表版本为采集时 windows-latest runner 的实测值,随 runner 漂移。

逐维度证据

PowerShell 7:唯一真正跨平台的 shell,7/9 任务脚本零改动

demos/pwsh(Linux 容器运行)与 demos/powershell7(Windows runner 运行)逐任务 diff9 个任务里 7 个脚本逐字节相同(02–08 全同),仅 00_env 与 01_hello_io 有差异,且差异只是身份行字符串(shell=powershell7、问候语里的运行体名)。$IsWindows 分支让同一份逻辑自适应平台(摘自 demos/powershell7/01_hello_io.ps1):

powershell
if ($IsWindows) {
    cmd /c 'dir C:\nonexistent-hello-shell' 2>$null | Out-Null
} else {
    bash -c 'ls /nonexistent-hello-shell' 2>$null | Out-Null
}

「一份脚本、两个平台」在本仓库是已落地的事实,不是承诺:powershell7 任务 02–08 的快照契约行与 pwsh 的 Linux 快照逐字一致(如 globList=app.log,config.csv,readme.txtcaughtError=true 两侧相同),唯一随平台变化的是 00_env 的 shell= 行与 01 的问候语。

POSIX 三兄弟:无法原生跑 Windows,且互不兼容

bash/zsh/fish 都只存在于 Linux 侧目录,Windows 侧对应物是 cmd 与 PowerShell——两套完全不同的语法世界。三者内部也不互通:

zsh
# demos/zsh/03_args_parsing.zsh —— zsh 数组 1 基(bash 要用 [0]/[1])
echo "firstArg=${positional[1]}"
zsh
# demos/zsh/02_variables_quoting.zsh —— zsh 默认不分词,${=var} 显式开启
wordArray=( ${=words} )

fish 更是连 case/done 都没有(if ... endset -l,见 demos/fish/*.fish 全部脚本)。跨发行版方向上,bash 脚本取其 POSIX 子集最稳;本仓库 bash 脚本经 bash:5.2 alpine 基底容器验证(musl/busybox 环境),快照 platform=linux

python:语言跨平台,外部命令是后门

python 本身完全跨平台,但任务 01 的对照实现调用了 ls(摘自 demos/python/01_hello_io.py):

python
result = subprocess.run(["ls", "/nonexistent-dir-hello-shell"], ...)

ls 不是 Windows 命令——这一行就让脚本失去了跨平台资格。这也是本站把 python 采集限定在 Linux 侧的原因,同时是「Shell vs Python 边界」的经典注脚:语言可移植,不等于脚本可移植。详见 Shell vs Python 边界

行尾与编码:CRLF 与 BOM 两个坑

对仓库脚本实测 file

  • demos/cmd/*.batASCII text, with CRLF line terminators——批处理必须 CRLF 行尾,本站按此入库。
  • demos/powershell5/*.ps1ASCII text——刻意保持纯 ASCII。PowerShell 5 遇到无 BOM 的 UTF-8 会按系统 ANSI 代码页解释,非 ASCII 字符有乱码风险,故 powershell5 脚本不写中文注释。
  • demos/powershell7/*.ps1demos/pwsh/*.ps1UTF-8 text——PowerShell 7 默认 UTF-8,可安全携带中文注释。
  • demos/bash/*.sh:ASCII text executable,LF 行尾。

采集侧同样守编码纪律:scripts/collect-windows.ps1 写明输出「ASCII,无 BOM」,用 [System.Text.Encoding]::ASCII 落盘。

运行体获取与版本锁定

Linux 侧五个运行体全部镜像化、tag+digest 双锁(摘自 .env.versions):

text
BASH_IMAGE=bash:5.2@sha256:3bee76a96d86d5d2d5efc7c1c570e5a7c95db22348a26944e0e546fa174e3324
PYTHON_IMAGE=python:3.12-slim@sha256:2c941e860699f878900b0edc2403613c234d4b32eda3cc9fa7036991a2a63c4a
ALPINE_IMAGE=alpine:3.22@sha256:14358309a308569c32bdc37e2e0e9694be33a9d99e68afb0f5ff33cc1f695dce
POWERSHELL_IMAGE=mcr.microsoft.com/powershell:7.5-debian-12@sha256:7ab5bd5ca6f95a3351fa0c6a1205237d57048c94542355aab55519a0861a9b25

其中 zsh/fish 无官方独立镜像,以 digest 锁定的 alpine 为基底 apk adddemos/zsh/Dockerfiledemos/fish/Dockerfile 各一行 RUN apk add --no-cache zsh|fish)。采集时脚本与 fixtures 只读挂载进容器(scripts/run-docker-demos.js-v ... :ro),写入只发生在容器内 /tmp

Windows 侧没有镜像可锁:cmd / PowerShell 5 是 windows-latest runner 内置,PowerShell 7 是 runner 预装,版本随 GitHub 更新漂移,以各 00_env 快照留痕(首次采集已完成,实测值见上表版本证据列)。政策细节见版本政策

小结

结论证据
PS7 是唯一真正跨平台的 shelldemos/pwshdemos/powershell7 逐任务 diff:7/9 脚本逐字节相同,余下 2 个仅身份行不同
python 语言跨平台,但外部命令会重新引入平台依赖demos/python/01_hello_io.py 调用 ls
POSIX shells 无法原生跑 Windows;fish 与 POSIX 断裂、zsh 与 bash 有实质差异目录布局(Linux 侧三 shell vs Windows 侧 cmd/PS);zsh 1 基数组与 ${=var} 源码
.bat 必须 CRLF;PS5 惧怕无 BOM UTF-8,PS7 默认 UTF-8file 实测:cmd 脚本 CRLF、powershell5 脚本纯 ASCII、powershell7/pwsh 脚本 UTF-8
Linux 运行体 tag+digest 双锁;Windows 运行体随 runner 漂移、快照留痕.env.versionsdemos/{zsh,fish}/Dockerfilescripts/run-docker-demos.js

延伸阅读:版本政策证据政策快速上手实验说明

Released under the MIT License.