究竟env在Bash中做了什么?

Del*_*ted 13 bash

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

$ printf '\u00d5'
\u00d5
$ env printf '\u00d5' # This results in the behavior I want
Õ
Run Code Online (Sandbox Code Playgroud)

如果我在终端中使用UTF-8或ISO-8859-1编码并不重要.

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

Mic*_*ker 16

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

/usr/bin/printf '\u00d5'
Run Code Online (Sandbox Code Playgroud)

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

function printf()
{
  $(which printf) "$@"
}
Run Code Online (Sandbox Code Playgroud)

或作为一个班轮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
Run Code Online (Sandbox Code Playgroud)

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

#!/usr/bin/env python
Run Code Online (Sandbox Code Playgroud)

  • 我想知道为什么bash内置不能正确处理`\ u`: - /根据帮助页面(`help printf`),它应该像二进制文件和二进制文件的手册页(`man printf` )说"\ uHHHH Unicode(ISO/IEC 10646)字符,带十六进制值HHHH(4位)" (3认同)