'ls 名称' 和 'ls | grep name' 重音不同

'ls 名称' 和 'ls | grep name' 重音不同

我在 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

相关内容