env <command>在做什么?


37

命令env ls -al在做什么?

我进行了Linux测试,并提出了一个问题:“如何直接运行命令,而不是别名?”
我知道有解决方案,例如在命令前加上一些特殊符号,但我忘记了。现在我知道了\。(从这篇文章中阅读)。

但我也记得在某处我读到要摆脱别名,可以在命令前加上env。我做到了,而且似乎可行,但我的回答被认为是错误的。我读infomanenv,但并没有理解太多。

正在env做什么,并且完全env <command>没有任何争议env


作为一个说明,这样做,我能想到的是3种方式env <command>command <command>\<command>。我认为,如果某个测试说env <command>的无效,那么该测试将被破坏。
Patrick

@帕特里克:它没有被破坏,因为正如克里斯所说,可能会有一个别名,command否则env它将使“ \”成为唯一可接受的答案。
皮埃尔·阿洛德

1
posix中没有定义@ArlaudPierre和`\`(作为别名转义),因此它不可移植。因此,它比其他任何人都无法接受。
Patrick

@帕特里克:是的,是的。现在,我们必须知道测试的确切范围才能这么说。但是无论如何,发现“ env”答案是不可接受的,这不是很诚实,我必须就这一点与您达成一致。
皮埃尔·阿洛

伙计们,测试也被人验证了(LPI认证的前sysadmin,现在正在教其他Linux):)我向验证者投诉,去了man却不明白env到底在做什么。在这篇文章之后-很明显,我的回答已被审核(接受)。谢谢大家!
ALZ

Answers:


38

这个命令

env name=value name2=value2 program and args

运行命令program and args与由延伸与所指定的环境变量和值当前环境形成的环境name=valuename2=value2。如果您不包含任何类似的参数name=value,那么当前环境将保持不变。

关于别名发生的关键事情是env是一个外部命令,因此它没有别名的“知识”:别名是不属于常规流程模型的shell构造,对直接程序没有影响由非Shell程序(例如env)运行。env只是将传递program and argumentsexec调用(例如execvp,它将在PATH中搜索program)。

基本上,像这样使用env是一种(主要)与外壳程序无关的方式,可以避免使用别名,外壳程序功能,外壳程序内置命令以及其他可能替换或覆盖命令位置参数(即程序名称)的外壳程序功能,除非,当然env是别名,还是shell函数!如果您担心env要成为别名,则可以拼出完整路径(例如/usr/bin/env,尽管可能有所不同)。


24

env(除了规避命令别名查找之外)的另一个重要用途是它在中搜索PATH命令。这在需要绝对路径的地方很重要,但是每个系统的路径都不相同。

例如,尽管在每个合理的系统中都包含了Bash脚本,但使用Bash脚本开始#!/bin/bash是可以的,而#!bash不能这样。/binPATH

我在Python程序中经常遇到此问题,该程序通常首先 #!/usr/bin/env python避免指定python可执行文件的完整,与系统相关的路径(但是请注意,它仍然需要env驻留在中/usr/bin,但这比python的位置更常见。二进制)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.