‘echo’ 在启动时不打印 unicode

‘echo’ 在启动时不打印 unicode

我正在运行一个全新安装的 Arch,启动设置如下(简化):

  1. .zprofile-> exec startx# 仅startx在此处调用

  2. .xinit-> exec bspwm# xinit 是默认的,末尾添加了/etc/X11/xinit/xinitrc一行exec

  3. .bspwmrc->echo -e '\uf073' > ~/log.txt

启动后,如果我检查内容,~/log.txt我会看到\uF073注意:大写 F)。如果我在启动后在 、 中运行相同的 echo 命令shbashzsh会打印正确的unicode字符。

重建字体缓存没有帮助。

我认为字体还没有那么早就准备好,并且我之前添加了睡眠,但没有什么区别。

编辑 (1):从另一个没有 X 的 tty 运行相同的 echo 会产生相同的\uF073结果,即从我的 tty 运行 echo.bspwmrc太早了。但是有什么好方法可以解决这个问题呢?文档说bspwmxinitrc

如果这有关系的话,该进程正在我的用户下运行。

我现在有点困惑,希望得到一些帮助。

谢谢

答案1

Arch 特定的(?) 解决方案

在启动过程中,您的LANG可能是C,但之后(例如在 中zsh)情况会有所不同(例如en_US.UTF-8)。 的行为echo取决于它。检查Arch 文档,很可能您没有设置系统区域设置/etc/locale.conf,也没有在 中设置用户区域设置~/.config/locale.conf;但某些程序会在启动后添加它。请明确将所需的区域设置添加到 中~/.config/locale.conf。这应该会使一切正常。

以下是针对一般情况的解释和一些想法。


通用解决方案

这是因为在问题echo运行的那一刻,您的语言环境设置不支持 Unicode。

在可以工作的 shell 中echo -e '\uf073',比较以下两个:

echo -e '\uf073'           # should work
LANG=C echo -e '\uf073'    # expect \uF073

最不激进的修复方法是使用任何支持 Unicode 的语言环境运行。像这样echo.bspwmrc

LANG=C.UTF-8 echo -e '\uf073' > ~/log.txt

更激进的方法是,在脚本中更早地声明(和导出)LANG(可能还有变量),以影响之后的所有内容。我没有使用任何与 相关的软件,因此我无法告诉您总体影响是什么。一个好主意可能是仅为子 shell 设置变量:LC_*.bspwmrc

some_command    # this will not be affected
( export LANG=C.UTF-8
  echo …
  echo …
  whatever      # all this will be affected
)
other_command   # this will not be affected
# And the shell sourcing .bspwmrc (if this is what happens) will not be affected.

笔记:

  • 使用 检查您当前的区域设置locale.bspwmrc您可能希望使用您通常使用的那个。
  • 要列出系统中安装的所有语言环境,请调用locale -a
  • 通常,shell 有自己的echo内置命令,也有独立的echo可执行文件(例如/bin/echo)。每个echoshell 可能支持也可能不支持。根据大写的\u事实,我得出结论,读取您的调用的解释器理解语言环境是唯一的问题。如果不是这种情况,以下是一些可能的解决方法:f.bspwmrcecho\u

    • echo明确调用内建支持的 shell \u

      bash -c 'LANG=C.UTF-8 echo -e "\uf073"'
      
    • 使用:printf\u

      LANG=C.UTF-8 printf '\uf073\n'
      

      注意printf可能是也可能不是内置的。就像echo它可能或不得支持\u

    • printf不使用\u

      printf '\xef\x81\xb3\n'
      

      此字节序列取自echo -e '\uf073' | xxd我的 Kubuntu 中显示的内容。仍然printf可能或不得支持\x。请注意,此方法不依赖于语言环境。

    如果你仅限于使用 POSIX shell 和 POSIX 工具(我的意思是只有 POSIX,没有扩展),则打印 Unicode 字符可能并不容易

相关内容