「env(1)」-

在修改的环境中运行程序

命令语法格式

env [OPTION]… [-] [NAME=VALUE]… [COMMAND [ARG]…]

命令描述

形式如’NAME=VALUE’的操作数将环境变量NAME的值设置为VALUE。VALUE可能为空(’NAME=’),这会将变量设置为空值,但这与取消变量不同。这些操作数从左到右进行求值,所以如果两个VALUE赋值给同一个NAME,则先前的赋值将被忽略。

环境变量名称可以为空,并且可以包含除了’=’和ASCII NUL以外的任何字符。但是,最好使用下划线、数字、ASCII字母,并以非数字开头组成的NAME,因为像Shell这样的应用程序不适用于其他的变量名称。

不包含字符’=’的第一个操作数将被视为要执行的程序COMMAND;它会根据PATH环境变量进行搜索。命令行中任何剩余的部分都将作为参数传递给COMMAND。该程序不应该是一个Shell内置的指令(请参阅特殊的内置实用程序)。

PATH的修改会在搜索命令之前生效。减少PATH时要小心;当PATH未定义或省略了/bin等关键目录时,行为是不可移植的。

在程序名中包含’=’的罕见情况下,消除其是变量赋值的歧义的唯一方法是为COMMAND使用中间命令,并通过args传递有问题的程序名称。例如,如果./prog=是当前PATH中的一个可执行文件:

env prog= true # runs ‘true’, with prog= in environment

env ./prog= true # runs ‘true’, with ./prog= in environment

env — prog= true # runs ‘true’, with prog= in environment

env sh -c ‘\prog= true’ # runs ‘prog=’ with argument ‘true’

env sh -c ‘exec “$@”‘ sh prog= true # also runs ‘prog=’

如果在环境变量赋值后面没有指定COMMAND,则会打印环境变量。这就像指定printenv(1)一样。

命令支持的选项及含义

-0, –null
在每个条目的末尾输出零字符(ASCII NUL),而不是换行符(ASCII LF)。该选项使env出处其他程序(xargs)能够解析的输出,即使输出的条目中嵌入了换行符。

-u name, –unset=name
如果变量name在当前环境中,则从环境中删除它。

-, -i, –ignore-environment
以空环境开始,忽略从现有环境中继承的环境变量。

-C dir, –chdir=dir
在调用COMMAND之前,将工作目录更改为dir。这与Shell内置的cd不同,它作为一个子进程启动命令,而不是改变Shell自己的工作目录;这允许它与在不同上下文中运行命令的其他命令链接。例如:

# Run ‘true’ with /chroot as its root directory and /srv as its working

# directory.

chroot /chroot env –chdir=/srv true

# Run ‘true’ with /build as its working directory, FOO=bar in its

# environment, and a time limit of five seconds.

env –chdir=/build FOO=bar timeout 5 true

–help
显示帮助手册并退出。

–version
显示版本号并退出。

退出码

0 如果没有指定COMMAND并且输出当前环境变量。

125 env自身执行失败。

126 如果找到COMMAND,但是无法执行。

127 COMMAND无法找到。

以及COMMAND的退出状态。

使用示例

如果要在Emacs中使用fcitx输入法,可以使用如下命令:

# env LC_CTYPE=zh_CN.UTF-8 /usr/bin/emacs

下面示例中,假设传递给env的环境包含’LOGNAME=rms’,’EDITOR=emacs’和’PATH=.:/gnubin:/hacks’:

输出当前环境:

# env | LC_ALL=C sort

EDITOR=emacs

LOGNAME=rms

PATH=.:/gnubin:/hacks

在减少的环境下运行foo,仅保留原始PATH,以避免查找foo时出现问题:

# env – PATH=”$PATH” foo

在包含’LOGNAME=rms’,’EDITOR=emacs’和’PATH=.:/gnubin:/hacks’的环境变量中运行foo,并确保在文件系统中找到foo,而不是作为Shell的内建命令:

# env foo

在包含’LOGNAME=rms’,’EDITOR=emacs’和’PATH=.:/gnubin:/hacks’的环境变量中运行nemacs:

# env DISPLAY=gnu:0 LOGNAME=foo nemacs

尝试运行程序/energy/–(因为这是唯一可能的路径搜索结果); 如果该命令存在,环境将包含‘LOGNAME=rms’和‘PATH=/energy’,参数将为’e=mc2’,’bar’,’baz’。

# env -u EDITOR PATH=/energy — e=mc2 bar baz

相关手册

查看在线手册:http://www.gnu.org/software/coreutils/env

查看info手册:info ‘(coreutils) env invocation’

参考文献

  • man 1 env, version GNU coreutils 8.28

更新日志

  • 04/25/2017 创建文章,当时为了解决Emacs中无法使用Fcitx输入法。
  • 06/12/2018 调整文章内容,进行完善。