究竟env在Bash中做了什么?

时间:2012-10-02 13:43:25

标签: bash

使用Bash(在Cygwin下)时会出现这种情况:

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

如果我在终端中使用UTF-8或ISO-8859-1编码无关紧要。

我的问题是: env 究竟是做什么的?为什么在这种特殊情况下我需要它?

1 个答案:

答案 0 :(得分:16)

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