`env <command>` 在做什么?

ALZ*_*ALZ 45 command-line shell env command

命令env ls -al在做什么?

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

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

envenv <command>没有任何论据的情况下,究竟在做什么env

Chr*_*sen 45

这个命令

env name=value name2=value2 program and args
Run Code Online (Sandbox Code Playgroud)

运行命令program and args与由延伸与所指定的环境变量和值当前环境形成的环境name=valuename2=value2。如果您不包含任何参数,例如name=value,则当前环境将不加修改地传递。

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

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

  • @piertoni 当你运行命令时,你的 shell 会解释 `$MYVAR`,它不会推迟到 `env` 运行 `echo`。尝试例如。`env MYVAR=3 sh -c 'echo $MYVAR'` (2认同)

小智 27

的另一个重要用途env(除了绕过命令别名查找)是它搜索PATH命令。这在需要绝对路径的情况下很重要,但因系统而异。

例如,开始一个 Bash 脚本#!/bin/bash是可以的,而#!bash不是,尽管/bin被包含在PATH每个合理的系统中。

我经常在 Python 程序中遇到这种情况,通常一开始 #!/usr/bin/env python就避免指定python可执行文件的完整的、与系统相关的路径(但是请注意,它仍然需要env驻留在/usr/bin.二进制)。