我在ServerFault上注意到了这个问题:
^V
我很久以前就知道这部分了。在那篇文章中让我感兴趣的是,OP 可以在 Tab 完成中将^C
字符视为^C
(插入符号后跟 a C
),但在ls
. 所以我稍微查了一下手册页,我可以找到ls -b
哪些输出\003
,ls -N
哪些对 没有任何特殊作用^C
,ls --show-control-chars
哪些在屏幕上显示 Unicode 字符。
我的第一个问题是,是否有一种简单的方法ls
可以生成与 Tab 完成相同类型的输出,即^C
(插入符号后跟 a C
)?(cat -v
行为)。
我的第二个问题是,环境变量如何$LANG
影响$LC_*
Tab 完成生成的输出(我认为它记录complete
在 Bash 手册的第 8 节中,但似乎没有发现任何相关内容)?
我使用的是bash
4.3,但也欢迎其他 shell 的解决方案。
这种行为在所有 shell 中都不相同。
Bourne Again shell 的行为与您描述的一样,以与这些字符输入到 shell 的方式不匹配的符号显示文件名。TENEX C shell 也是如此。在这两种情况下,两个字符的序列都不
^C
匹配一个字符的文件名。Almquist 和 Korn shell 只编写控制字符,这在许多终端上什么都不做,并且在显示完成列表时在其列宽计算中包含宽度 1,因此这是错误的。这会关闭列对齐。
Z shell 是唯一执行与命令输入使用相关的操作的 shell。其基于菜单的选项卡完成将文件名显示为
$'\003'
. 这正是使用(比如说)rm
命令所写的内容,也正是ZLE 的制表符补全将为rm
command填写的内容,以使用 Z shell 删除文件:一个可以匹配 Korn 和 Almquist 贝壳。
这是微不足道的。
该
-w
选项只是使控制字符按原样输出,这在许多终端上也没有任何作用。但至少ls
有意识地意识到它的宽度为 0,并且不会弄错列对齐计算。是的,这是 FreeBSD/TrueOS
ls
。并且没有配置
ls
来匹配其他人的行为。两者
-B
并-b
导致打印一个朴素的八进制转义序列,这个字符没有特殊的 C 转义序列。但是没有一个 shell在完成列表中提供一个朴素的八进制转义序列。Z shell 最接近,但$'…'
在其补全中使用八进制转义序列的引号。没有什么与 Bourne Again 和 TENEX C shell 显示文件名的方式相匹配。
语言环境
语言环境在这里基本上是无关紧要的。这个字符是一个非打印控制字符,几乎与语言环境无关。C0 范围(节奏 EBCDIC 粉丝)几乎被普遍认为是控制字符。