13

使用 Bash(在 Cygwin 下)时,我得到了这种行为:

$ printf '\u00d5'
\u00d5
$ env printf '\u00d5' # This results in the behavior I want
Õ

我在终端中使用 UTF-8 还是 ISO-8859-1 编码并不重要。

我的问题是: env到底是做什么的?为什么在这种特定情况下我需要它?

4

1 回答 1

17

env不在bash,它是一个独立的可执行文件,它用于在运行程序之前设置或清除环境变量。在您的特定情况下,它运行的是二进制文件printf而不是内置的 shell。您可以通过使用绝对路径来获得相同的结果:

/usr/bin/printf '\u00d5'

侵入性最小的方法可能如下:重新定义printf函数并让 Bash 处理其余部分。获取包含以下内容的文件:

function printf()
{
  $(which printf) "$@"
}

或作为单线function printf() { $(which printf) "$@"; }。当然你可以换$(which printf)一个/usr/bin/printf...

然后像你习惯的那样简单地使用 printf 。您的脚本保持不变,您甚至可以引入一个条件来仅在某些 Bash 版本上定义该函数。

AFAIK 你也可以省略function,但我发现它增加了可读性。

[编辑:function关键字是bash扩展;printf () { ...; }是 POSIX 语法。如果你确实使用了function关键字,函数名后面的 () 是可选的。]


通常,env也用于力求可移植的脚本的 hash-bang 行。原因是它env几乎总是在/usr/bin/env,而bash并不总是/bin/bash像哈希线所暗示的那样。例子:

#!/usr/bin/env bash

也适用于其他程序/口译员:

#!/usr/bin/env python
于 2012-10-02T13:48:39.103 回答