我在使用 Bash(在 Cygwin 下)时遇到了这种行为:
$ printf '\u00d5'
\u00d5
$ env printf '\u00d5' # This results in the behavior I want
Õ
在终端中使用UTF-8或ISO-8859-1编码并不重要。
我的问题是: env具体是做什么的?为什么我在这种特定情况下需要它?
我在使用 Bash(在 Cygwin 下)时遇到了这种行为:
$ printf '\u00d5'
\u00d5
$ env printf '\u00d5' # This results in the behavior I want
Õ
在终端中使用UTF-8或ISO-8859-1编码并不重要。
我的问题是: env具体是做什么的?为什么我在这种特定情况下需要它?
env
不是 bash
的一部分,而是一个独立的可执行文件,用于在运行程序之前设置或清除环境变量。在您的特定情况下,它正在运行二进制文件 printf
而不是 shell 内置函数。您可以通过使用绝对路径来实现相同的结果:
/usr/bin/printf '\u00d5'
最不侵入性的方法可能是重新定义printf
函数,让Bash处理剩下的部分。引用一个包含以下内容的文件:function printf()
{
$(which printf) "$@"
}
或者作为一行代码function printf() { $(which printf) "$@"; }
。当然,您可以将$(which printf)
替换为/usr/bin/printf
...function
,但我发现它可以提高可读性。function
是bash
扩展;printf () { ...; }
是POSIX语法。如果您使用function
关键字,则函数名后面的括号是可选的。]env
。原因是env
几乎总是位于/usr/bin/env
,而bash
并不总是位于/bin/bash
,正如许多哈希-棒行所暗示的那样。例如:#!/usr/bin/env bash
同样适用于其他程序/解释器:
#!/usr/bin/env python
\u
。根据帮助页面(help printf
),它应该像二进制文件一样工作,而二进制文件的手册页(man printf
)上写着"\uHHHH 4位16进制数表示的Unicode(ISO/IEC 10646)字符"。 - Aaron Digullacommand
是builtin
的相反,两者都可以用于“前缀”后续命令,并导致执行命令的外部或bash内部版本。 - 0xC0000022L"printf" '\u00d5'
也不行。 - Michael Krelin - hackercommand
只抑制了 shell 函数的查找,但它仍然优先选择内置命令而不是外部程序。 - chepner
?
(未知Unicode字符),但是对于第二个情况,我得到了相同的结果。 - Aaron Digulla