起因是在最近的一次Jimmy老师给大家的视频号直播中,我们尝试演示了一段代码的运行过程。意外发现,当代码从微信中复制粘贴到终端时,竟然出现了无法运行的情况。(详见下面的视频演示,大约是在第8分钟左右。。。)
这个小插曲不仅引起了我的好奇心,也激发了我探索和解析背后原因的欲望。在这篇文章中,我将与大家分享我对这个问题的研究过程、发现的原因,以及如何j解决。这个经历提醒我们,在日常工作中,一些看似简单的操作也可能隐藏着意想不到的bug,值得我们深入探讨和理解。 情景再现起因是需要用到kingfisher下载一个数据集,代码直接从微信检索了相关代码 直接复制粘贴,运行报错信息如下,仔细有看了下代码,没有问题,这就很诡异。 既然报错是显示命令没有,而软件和代码看起来是没有问题的,那大概率就是shell字符识别的问题。因为微信复制粘贴可能会有诡异字符。思路有了,下面就是验证猜想。 验证猜想在shell查看在shell环境下检查看看我们复制粘贴了什么鬼东西 可以看到是有一些诡异字符的。这些字符出现在从微信或其他应用程序复制的文本中,是因为原始文本含有特定的控制字符或特殊的空格字符(如非断空格U+00A0 ,在shell环境显示为M-BM- ,通常不可见),这些在复制过程中没有被正确处理或转换。 在文本编辑器查看也可以看到是有一些隐藏字符的,而且和在shell环境显示的还不一样。 问题原因:\xa0 是非断空格(non-breaking space)的ASCII表示,它通常用于Web页面和文本处理中以防止自动换行。在十六进制中,它的表示是0xA0 ,属于扩展ASCII码的一部分。当从微信这样的应用中复制文本时,可能会无意中复制了这种空白字符,因为它们在微信中可能用于格式化文本但在代码编辑器或命令行环境中通常是不可见的。所以就会出现命令看起来正确,但是却运行不了的情况。 解决办法解决方法有很多,在shell替换一下特殊字符或者在文本编辑器中使用查找和替换功能,将所有\xa0 实例替换为常规空格(ASCII码为0x20 ),或者直接删除它们。不同的编辑器和IDE具有不同的方法来显示和处理这些非打印字符。 shell替换一下echo "kingfisher get -p PRJNA289185 -m ena-ascp ena-ftp prefetch aws-http" |sed 's/M-BM-//g'
文本编辑器替换- 打开查找面板: 在Sublime Text中,按下
Ctrl + F (在Mac上是 Cmd + F )打开查找面板。 - 开启正则表达式搜索: 点击查找面板左下角的
.* 按钮,这样你就可以使用正则表达式来查找字符。 - 输入要查找的正则表达式: 在查找输入框中输入
\xa0 这代表非断空格。
碎碎念:其实最简单的方法,就是尽量不从微信复制粘贴代码。从根源上避免出现这个bug
|