Che*_*tar 10 diff shell-script arguments hex
简短版本(TL;DR)
\n我有 2 个小的单行文件,看起来相同:
\n$ cat f1 f2\n./cconv.sh 100 EUR\xc2\xa0USD\n./cconv.sh 100 EUR USD\nRun Code Online (Sandbox Code Playgroud)\n但它们不是,大小有 1 个字节的差异:
\n$ ls -l f1 f2\n(...) 24 oct. 30 16:19 f1\n(...) 23 oct. 30 16:19 f2\n\n$ diff f1 f2\n1c1\n< ./cconv.sh 100 EUR\xc2\xa0USD\n---\n> ./cconv.sh 100 EUR USD\nRun Code Online (Sandbox Code Playgroud)\n我曾经dhex计算过十六进制的差异。看起来 :
f1结束于c2 a0 55 53 44 0af2结束于 20 55 53 44 0a有人知道这里发生了什么事吗?有什么区别,更重要的是,它来自哪里?以下是包含这两个文件的 zip 文件的链接以及结果的屏幕截图dhex。
长版(附加说明)
\n这两个文件是我的~/.bash_history file.
我注意到我的贝壳有一种非常奇怪的行为。采用以下非常基本的脚本:
\n#!/bin/sh\necho $#\necho "$1"\necho "$2"\necho "$3"\nexit 0\nRun Code Online (Sandbox Code Playgroud)\n在某些情况下(但哪些???),它不将空格作为参数分隔符:
\n$ ./cconv.sh 100 EUR\xc2\xa0USD\n2\n100\nEUR\xc2\xa0USD\nRun Code Online (Sandbox Code Playgroud)\n但有时它会像预期的那样工作:
\n$ ./cconv.sh 100 EUR\xc2\xa0USD\n3\n100\nEUR\nUSD\nRun Code Online (Sandbox Code Playgroud)\n这让我发疯!我花了几个小时试图弄清楚发生了什么事。以下是我尝试缩小范围的一些测试:
\n/etc/bashrc, /etc/profile,/etc/inputrc和/etc/rc.local~/.bashrc,~/.profile并且~/.inputrc我真的很困惑,不知道发生了什么。我终于注意到 中的 2 个命令之间存在细微差别~/.bash_history:一个来自我的 Gnome 会话,另一个来自我的 tty 会话。显然是有区别的,但具体是什么,原因可能是什么?
ilk*_*chu 21
c2 a0是不间断空格字符的 UTF-8 编码。它通常看起来像一个常规空格,但 shell 不会将其识别为空白。
在一些键盘映射中,类似AltGr+Space或Option+ 的东西Space会产生不间断的空格。AltGr如果您的键盘映射在或后面还有管道字符Option,这会很有趣,这样可以更轻松地键入|<nbsp>而不是|<sp>,从而给出如下错误:
$ echo foo |\xc2\xa0grep .\nbash: \xc2\xa0grep: command not found\nRun Code Online (Sandbox Code Playgroud)\n(我认为 SE 将 nbsp 折叠到常规空间,因此如果从此处复制粘贴,您可能不会收到错误。)
\n如果您从其他工具复制并粘贴参数,您可能会从那里得到奇怪的格式,但这取决于程序。
\n有关不生成字符的一些解决方案,请参阅在 shell 中处理 nbsp 字符。
\n