Linux Bash中的双斜杠?
为什么bash控制台接受“/bin//bash”而不是“/bin/bash”?路径“/bin//bash”不存在,但当我输入双斜杠时,将打开一个新的bash会话。这是open syscall完成的文件解析的结果。。open调用分配一个文件描述符,然后使用与文件系统相关的调用解析路径组件--Linux Bash中的双斜杠?,linux,bash,Linux,Bash,为什么bash控制台接受“/bin//bash”而不是“/bin/bash”?路径“/bin//bash”不存在,但当我输入双斜杠时,将打开一个新的bash会话。这是open syscall完成的文件解析的结果。。open调用分配一个文件描述符,然后使用与文件系统相关的调用解析路径组件--/bin///bash也将执行您显示的操作。这是因为POSIX规则定义了一个或多个连续的/字符来分隔有效的路径名。编写bash的人都知道这一点,因此fnmatch的行为方式与标准所说的相同: 见: 多个连续的字
/bin///bash
也将执行您显示的操作。这是因为POSIX规则定义了一个或多个连续的/
字符来分隔有效的路径名。编写bash的人都知道这一点,因此fnmatch
的行为方式与标准所说的相同:
见:
多个连续的
字符被认为是同一个字符
,只有两个前导字符除外
那么,问题是什么?不管你用了多少斜杠,我投票将这个问题作为主题外的问题来结束,因为它与以前在不同的StackExchange站点上提出和回答的问题是重复的:而且,这不是特定于bash的行为——它适用于所有UNIX应用程序,使标记有点偏离基础。(也就是说,POSIX允许在路径以
//
开头的情况下执行定义的行为;因此,//bin/bash
可以执行与/bin/bash
不同的操作;但是,很少有系统实现这样的扩展)。您可以将一个包含多个/
的路径作为分隔符传递给open()
系统调用,因此即使fnmatch()未被使用,此行为仍将存在,这使得调用它成为使用fnmatch()的“结果”有点可疑。我相信bash使用fnmatch。glob对其他shell和bash也做类似的工作那么open使用什么来将路径名解析为文件inode号呢?这是您真正的问题/重点。我不知道。我认为它依赖于文件系统(因此是驱动程序)。ftw、nftw、scandir和其他函数也读取目录。它们调用什么?是的——open()系统调用由文件系统实现;文件系统的行为是由POSIX指定的。实际上——如果fnmatch()
在返回结果之前从文件名中去掉额外的斜杠,它将破坏像AFS这样的文件系统,因为双斜杠有特殊的意义(POSIX允许这样做)。FWIW:@charlesduffy我没有提到去掉字符。我只是说它的行为符合POSIX标准。对不起,有什么困惑。