在修改的环境中运行程序
命令语法格式
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 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自己的工作目录;这允许它与在不同上下文中运行命令的其他命令链接。例如:
# 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的环境包含’LOGNAME=rms’,’EDITOR=emacs’和’PATH=.:/gnubin:/hacks’:
输出当前环境:
EDITOR=emacs
LOGNAME=rms
PATH=.:/gnubin:/hacks
在减少的环境下运行foo,仅保留原始PATH,以避免查找foo时出现问题:
在包含’LOGNAME=rms’,’EDITOR=emacs’和’PATH=.:/gnubin:/hacks’的环境变量中运行foo,并确保在文件系统中找到foo,而不是作为Shell的内建命令:
在包含’LOGNAME=rms’,’EDITOR=emacs’和’PATH=.:/gnubin:/hacks’的环境变量中运行nemacs:
尝试运行程序/energy/–(因为这是唯一可能的路径搜索结果); 如果该命令存在,环境将包含‘LOGNAME=rms’和‘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 调整文章内容,进行完善。