
近日阮一峰老师发了一篇《命令行通配符教程》的文章,作为话唠的我,随手留言吐槽类Unix系统文件名对特殊字符毫无节制。
有网友回复,引起我进一步思考:
- 类Unix系统中为什么能出现哪些特殊字符?
- 不能出现哪些特殊字符?
- 特殊字符做为文件名,会引发什么问题?
- 怎样规范文件名?
为什么文件名中能够允许特殊字符?
在类Unix系统中,文件名由字节组成,而不是字符。所以理论上任何字节值都可以作为文件名。
当然系统规定了有两个例外,即\000 (ASCII: NUL)空值 和\057 (ASCII: slash)斜杠。
测试
window 下:
linux 下:
mkdir test && cd test; touch \# && # 井号文件名 touch \; && # 分号文件名 touch \\ && # 反斜杠文件名 touch \" && # 双引号文件名 touch $'\n' && # 换行文件名 touch $'\t' && # 水平制表符文件名 touch $'\v' && # 垂直制表符文件名 touch $'\13'; # 回车符文件名
上图可见,这些特殊字符(特殊符号或一些格式控制符),大多数是都是无法在window下做为文件名的,在linux下都成功命名了。只是后面几个文本控制符号都以?号显示。
思考
- 首先,可以不能代表正确,你有hack的能力,不代表你hack别人就是对的。
- 我们在编写程序时,会有严格的文件命名规范。我们不会故意使用特殊字符从而搬石头砸自己的脚。
- 根据墨菲定律,会出错的事总会出错,所以类Unix系统应该对命名加以限制。
- 程序员不要有掌握奇淫巧技的傲慢,而更应该从解决现实问题出发。
参考资料:
- https://blog.josephscott.org/2007/02/12/things-that-shouldnt-be-in-file-names-for-1000-alex/
- https://en.wikipedia.org/wiki/Control_character
- https://www.techforgeek.info/how_to_rm_file_with_special_ch.html
- https://unix.stackexchange.com/questions/230291/what-characters-are-valid-to-use-in-filenames
- https://zh-google-styleguide.readthedocs.io/en/latest/google-cpp-styleguide/naming/#id3