为什么选择冒号作为路径分隔符


22

为什么:选择冒号()作为路径分隔符?

请注意,我的意思是“路径分隔符”,而不是“目录分隔符”。路径分隔符是放置在PATH环境变量中的条目之间的符号。

PATH="/usr/local/sbin:/usr/local/bin:/usr/bin:..."
                     ^ this symbol

计算机和软件中的所有内容曾经都是某个地方的某人故意做出的决定。例如,为什么tilde表示home dir(为什么在vi中使用hjkl作为方向键)。我想知道这项决定的背景。


一些随机事实:

将冒号用作路径分隔符意味着不能将名称中带有冒号的目录添加到路径中。

从POSIX:

由于<colon>在这种情况下是分隔符,因此可能在PATH中使用的目录名称不应包含<colon>字符。

http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html

似乎不可能逃脱结肠。来自Stack Overflow的@ Random832检查了处理PATH的源代码,未发现任何转义机制。

/programming/14661373/how-to-escape-colon-in-path-on-unix


这也是分隔符/etc/passwd(也包含home和shell列中的路径)。
斯特凡Chazelas


11
昨天我花了大约半小时研究这个问题。我读了1971年的Unix程序员手册,该手册指定了冒号的用法,但没有说明在(例如)管道符号上选择冒号的原因。我也尽可能多地了解Multics,但显然,它的PATH中只有一个目录(因此不需要分隔符)。我怀疑我们会在这里得到一个很好的答案,但是如果某些资深的Unix用户有机会回答这个问题,我希望他们有机会,所以我投票决定重新开放。
安东尼·G-莫妮卡(Monica)的正义

3
Unix版本7(在1979年)问世之前,可能没有shell / environment变量被调用 ,但是早在1977年就存在一个以- 分隔的搜索路径。PWB  / Unix(Programmer's Workbench)使用了Mashey shell,由约翰·马希John R. Mashey),按时间顺序排在汤普森(Thompson)弹和伯恩(Bourne)之间。…(续)PATH:
G-Man说'Reinstate Monica''Sep

3
(续)…  Mashey外壳程序支持26个外壳程序变量(猜测其名称)-变量p是搜索路径(称为“用于命令执行的Shell目录搜索顺序”),目录之间用冒号分隔。... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 有趣的事实:当Mashey壳处理的.profile文件,它也允许你指定一个初始$p文件名为值.path
G-Man说'Resstate Monica''Sep

Answers:


3

经过一番挖掘之后,我没有一个真正的答案,但至少有一些历史事实支持了新的信息来增加这次对话。

这是彼得·丘布(Peter Chubb)https://www.youtube.com/watch?v=Sye3mu-EoTI在他的有关外壳的演讲之一中,大约19:00左右,您可以听到他提到为什么e默认编辑器是别名在unix外壳中,这是因为较旧的终端设备不太舒适或不易使用,并在其上键入是令人不愉快的体验。

他提到的是一个精确的模型,在这种情况下为https://en.wikipedia.org/wiki/Teletype_Model_33

经过一番研究(http://www.pdp8.net/asr33/asr33.shtml),我发现这台机器只允许您选择64个字符的池,甚至没有完全的US ASCII支持,即2到6个字符的幂,是6位组合。

实际上,这台机器与ASCII完全无关,这意味着它甚至不只支持ASCII的前64个字符,它只是用于一组完全不相关的输入,并且可能不是标准的(对于我们的现代时代)字符集。

ASR 33电传打字机可以打印64个字符,只允许使用大写字母,数字和符号。

来自http://www.pdp8.net/asr33/asr33.shtml

考虑到要支持大写字母,您确实需要超过6位,并且大写字母超出了64个字符标记(或者如果要跟随表格,则为十进制值63),这证明了它绝对不是美国ASCII。

    0 NUL    16 DLE    32      48 0    64 @    80 P    96 `   112 p 
    1 SOH    17 DC1    33 !    49 1    65 A    81 Q    97 a   113 q 
    2 STX    18 DC2    34 "    50 2    66 B    82 R    98 b   114 r 
    3 ETX    19 DC3    35 #    51 3    67 C    83 S    99 c   115 s 
    4 EOT    20 DC4    36 $    52 4    68 D    84 T   100 d   116 t 
    5 ENQ    21 NAK    37 %    53 5    69 E    85 U   101 e   117 u 
    6 ACK    22 SYN    38 &    54 6    70 F    86 V   102 f   118 v 
    7 BEL    23 ETB    39 '    55 7    71 G    87 W   103 g   119 w 
    8 BS     24 CAN    40 (    56 8    72 H    88 X   104 h   120 x 
    9 HT     25 EM     41 )    57 9    73 I    89 Y   105 i   121 y 
   10 LF     26 SUB    42 *    58 :    74 J    90 Z   106 j   122 z 
   11 VT     27 ESC    43 +    59 ;    75 K    91 [   107 k   123 { 
   12 FF     28 FS     44 ,    60 <    76 L    92 \   108 l   124 | 
   13 CR     29 GS     45 -    61 =    77 M    93 ]   109 m   125 } 
   14 SO     30 RS     46 .    62 >    78 N    94 ^   110 n   126 ~ 
   15 SI     31 US     47 /    63 ?    79 O    95 _   111 o   127 DEL 

现在我们知道我们从这个东西中得到了64个字符,没有任何真正的标准来支持它们在编码表中,而且我们也没有小写字母,只有大写字母加上符号和数字。

感谢这个网站http://keyboards.jargon-file.org/#ASR33我可以向您展示这种键盘的输入布局

在此处输入图片说明

通过按SHIFT键,您还可以

在此处输入图片说明

还有一些有关如何生成字符的物理连接如何编码的更多信息http://jargon-file.org/jargon-html/html/B/bit-paired-keyboard.html(该页面还阐明了ASR33和ASCII字符在位级别上都不同)。

我认为有趣的是,没有{}只有一个()这意味着创建子shell可能没问题,但是创建新进程可能不是那么容易,或者终端不允许。

最后,我认为没有一个真正的科学答案,它可能是一个等待特殊含义的“自由”角色。一件事是必须的:外壳和终端要比ASCII古老,并且考虑ASCII或我们今天所知道的任何编码表都可能无法解决问题。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.