自从频繁地跨平台工作和开发以来,一直对 Windows 系统使用 \ 来作为路径分隔符,使用 / 来作为参数分隔符(dir /W c:\temp,请比较例如 ls -l /tmp)感到不可理解。今天看到了 HN 的讨论 Why is the DOS path character "\"?[1],才恍然大悟。
简而言之,历史进程是这样的:
* DOS 2.0 之前,编写命令行工具的程序员来自 IBM 背景,使用 DEC 系统,那里用 / 作为参数分隔符。而当时的 DOS 连多层目录都不支持(真的不支持……),因此不觉得与 *nix 的 \ 有什么冲突。
* DOS 2.0 及之后,需要支持多层目录了,那么既然 / 已经用做参数分隔符了,于是多方比较之下,最凑手又合情合理的方案就是使用 \ 来分割路径了。就是这样。
想吐槽的是,这种历史惯性(其他领域也有大量实例)真是让后人为难,并硬生生地制造了无穷无尽的后续问题。写跨平台脚本的童鞋一定都有同感,按下不表了。
[1] 文中和跟贴中还有一些有趣的事情:
* 话说 \ 这个字符在英语中原本是没有的,因此它是被生造出来的,这是咋回事?原来,Bob Bemer 当年发明这个符号,是为了能够与 / 合用,在 ALGOL 语言中打出逻辑和以及逻辑或符号 /\ 和 \/ 。哈哈。
* DOS 暗地里也支持在不致混淆的情形中使用 / 作为路径分隔符,并且 config.sys 中竟然还有一个选项 SWITCHAR= 可以指定自定义的参数分隔符,如果令 SWITCHAR=- ,那么 DOS 就和 *nix 兼容了。(不仅回忆起当年设置 config.sys 来获取扩展内存的时光……)
[1]: ...
简而言之,历史进程是这样的:
* DOS 2.0 之前,编写命令行工具的程序员来自 IBM 背景,使用 DEC 系统,那里用 / 作为参数分隔符。而当时的 DOS 连多层目录都不支持(真的不支持……),因此不觉得与 *nix 的 \ 有什么冲突。
* DOS 2.0 及之后,需要支持多层目录了,那么既然 / 已经用做参数分隔符了,于是多方比较之下,最凑手又合情合理的方案就是使用 \ 来分割路径了。就是这样。
想吐槽的是,这种历史惯性(其他领域也有大量实例)真是让后人为难,并硬生生地制造了无穷无尽的后续问题。写跨平台脚本的童鞋一定都有同感,按下不表了。
[1] 文中和跟贴中还有一些有趣的事情:
* 话说 \ 这个字符在英语中原本是没有的,因此它是被生造出来的,这是咋回事?原来,Bob Bemer 当年发明这个符号,是为了能够与 / 合用,在 ALGOL 语言中打出逻辑和以及逻辑或符号 /\ 和 \/ 。哈哈。
* DOS 暗地里也支持在不致混淆的情形中使用 / 作为路径分隔符,并且 config.sys 中竟然还有一个选项 SWITCHAR= 可以指定自定义的参数分隔符,如果令 SWITCHAR=- ,那么 DOS 就和 *nix 兼容了。(不仅回忆起当年设置 config.sys 来获取扩展内存的时光……)
[1]: ...