【问题标题】:Exactly what does env do in Bash?env 在 Bash 中究竟做了什么?
【发布时间】:2012-10-02 13:43:24
【问题描述】:

我在使用 Bash(在 Cygwin 下)时出现这种行为:

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

我在终端中使用 UTF-8 还是 ISO-8859-1 编码都没关系。

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

【问题讨论】:

  • 有趣的发现。 Linux 上也会发生类似的事情。第一种情况我只得到?(=未知的Unicode字符),但第二种情况我得到相同的结果。

标签: bash


【解决方案1】:

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

【讨论】:

  • +1 我正要发布同样的东西,已经在 Linux 机器上确认了。
  • 感谢您的确认,我只是想试试 ;-)
  • 我想知道为什么内置的 bash 不能正确处理 \u :-/ 根据帮助页面 (help printf),它的行为应该类似于二进制文件和手册页二进制 (man printf) 表示“\uHHHH Unicode (ISO/IEC 10646) 字符,十六进制值 HHHH(4 位)”
  • 嗯。内置在linux上输出问号......我不确定它想说什么。我的语言环境是 utf8…
  • command 仅抑制 shell 函数查找。它仍然更喜欢内置命令而不是外部程序。
猜你喜欢
  • 1970-01-01
  • 2011-06-18
  • 2012-07-23
  • 2016-09-10
  • 2023-03-15
  • 2012-10-17
  • 2021-06-04
  • 1970-01-01
  • 2018-07-30
相关资源
最近更新 更多