隐藏字符问题发生情景
事情是这样的,为了方便主机和虚拟机之间数据的传输,我打算建一个共享文件夹。由于我选择的是手动挂载,在VirtualBox 中创建好共享文件夹后,我着手打开Ubuntu,想将这个共享文件夹挂载到我的家目录下,执行sudo mount -t vboxsf 共享文件夹名称 目标挂载位置这个命令的时候,我发现了一个非常难受的事情:
我执行的命令是:sudo mount -t vboxsf share_file /home/cyz/share_file
看起来这个命令好像没有任何问题,但是执行后发生了如下的报错:
隐藏字符问题的发现
我便开始去问chatgpt这是什么意思,它的回答是:
可以看到,它一共给出了我5点建议:
首先我对照了我执行的命令和它给出我的第一点建议:第一点说我命令执行格式错误,我一开始以为这只是它提醒我应该注意的点,然后我仔细对照了一下两条命令,发现没有任何差别,于是便开始考虑下面它给出的几点建议,我反复检查了多遍,虚拟机甚至重启了6次,但是使用我原来的命令始终都有这个报错,我还查阅了大量文章,依然不断报错。
最后实在无能为力,抱着试一试的心态重新执行了命令,但是这一次我没有使用历史输入命令,而是将chatgpt给我的第一点建议中的命令复制了过去,然后就成了!!!
惊喜的同时更多的是不可思议,两条命令明明看起来一模一样啊?
仔细核对了许久仍然没有找到错误的原因,后面问chatgpt的时候它说我的命令中隐藏着一些不可见字符,并且告诉了我一种显示不可见字符的方式:
结果是这样的:
可以发现还真是有不可见的特殊字符!!!
特殊字符通常是在复制粘贴,不小心使用了快捷键,以及使用某些编辑器时不经意间引入的,通过使用 cat -v
等工具可以检查并移除它们,避免命令解析错误。
如何避免这些特殊字符?
-
避免从不可靠来源复制命令: 尽量手动输入命令,而不是复制粘贴,以避免引入不可见字符。
-
使用代码编辑器: 使用专门的代码编辑器(如 VS Code、Sublime Text、Vim)来编辑命令,因为这些编辑器通常会显示所有不可见字符,帮助你避免错误。
-
使用终端中的
echo
和cat -v
命令检查命令: 如前面所示,使用cat -v
命令查看不可见字符,可以帮助你及时发现并删除这些字符。
事件的感想
学计算机一坤年以来,第一次发现这么隐晦且离谱的bug,真的很让人绷不住呐。
不过从中也学习到了很多,每一次 debug 都是人生的成长,每一行代码背后都有不为人知的辛酸。比如:
- 输入命令的时候有的时候尽量手动输入,跨系统复制粘贴的时候很可能出现更多的问题。
- 当指令执行出错的时候又有了新的bug寻找方向,可以通过
echo
和cat -v
来检查是否指令蕴含隐藏字符 - chatgpt简直YYDS!!!,回过头来看chatgpt给我的回答,它在第一点就向我提出了检查命令格式是否正确!并且很精准地发现了错误命令中隐藏字符地位置,简直无敌!!!拥抱AI是必然的,这样可以大大提高我们找寻bug的能力!!!
转眼间马上也就是快到2025年春节,我载这里也衷心祝福各位程序员:
Python Java C++ Line Line So Easy;
Years Months Weeks Day Day No Bug;