我在 Xigmanas (NAS freebsd)。我将尽可能简单地解释一下情况:
:; set | egrep 'LC_A|LANG'
GDM_LANG=fr_FR.UTF-8
LANG=fr_FR.UTF-8
LC_ALL=fr_FR.UTF-8
SLIM_LANG=fr_FR.UTF-8
:; ls -i 1989* ; ls -i | grep 1989 ; ls -ib 1989* ; ls -ib | grep 1989
9920 1989 Amn??sia.mp4
9920 1989 Amnésia.mp4
9920 1989 Amn\303\251sia.mp4
9920 1989 Amn\303\251sia.mp4
我们看到ls
只有重音被转换成??而后接管道的情况并非如此grep
。
我没有看到解释,因为管道不应该修改字节流,尤其是不应该通过纠正流来修改!
ls
后面的grep
显示正确,ls
单独的显示不正确。
这是怎么回事?
答案1
这有效:
ls --show-control-chars A*
Amnésia
和这个一样,
ls A* | cat
Amnésia
ls
我在 Debian ( ) 上的版本的文档ls (GNU coreutils) 8.32
写道,
--show-control-chars
按原样显示非图形字符(默认值,除非 [...] 输出是终端)
é
可以说这是一个错误,因为UTF-8 语言环境中表示的两个字节( \303\251
) 应被视为打印字符,而不是非图形字符。
现在我无法重现它。你有export
你的语言环境变量吗?我应该得到该命令的一组结果:
env | egrep 'LC_A|LANG'
如果没有,请尝试将export
区域设置变量添加到环境中:
eval $(LC_ALL=fr_FR.UTF-8 locale | sed 's/^/export /' )
然后重试:
ls A*
Amnésia