ALZ*_*ALZ 45 command-line shell env command
命令env ls -al在做什么?
我有一个 Linux 测试,有一个问题:“如何直接运行命令,而不是它的别名?”
我知道存在一些解决方案,例如在命令前加上一些特殊符号,但我忘记了。现在我知道了\。(从这篇文章中阅读)。
但我也记得我在某处读到过,为了摆脱别名,我们可以在命令前加上env. 我做到了,它似乎有效,但我的回答被认为是错误的。我读info和man上env,但并没有理解太多。
env在env <command>没有任何论据的情况下,究竟在做什么env?
Chr*_*sen 45
这个命令
env name=value name2=value2 program and args
Run Code Online (Sandbox Code Playgroud)
运行命令program and args与由延伸与所指定的环境变量和值当前环境形成的环境name=value和name2=value2。如果您不包含任何参数,例如name=value,则当前环境将不加修改地传递。
与别名相关的关键是env是一个外部命令,因此它没有别名的“知识”:别名是一个 shell 构造,它不是正常进程模型的一部分,对直接调用的程序没有影响。由非 shell 程序运行(如env)。env只是将 传递program and arguments给exec调用(如execvp,它将在 PATH 中搜索program)。
基本上,像这样使用env是一种(主要)独立于 shell 的方式,可以避免别名、shell 函数、shell 内置命令以及可能替换或覆盖命令位置参数(即程序名称)的任何其他 shell 功能位——除非,当然env是别名,还是shell函数!如果您担心env成为别名,您可以拼出完整路径(例如/usr/bin/env,尽管可能会有所不同)。
小智 27
的另一个重要用途env(除了绕过命令别名查找)是它搜索PATH命令。这在需要绝对路径的情况下很重要,但因系统而异。
例如,开始一个 Bash 脚本#!/bin/bash是可以的,而#!bash不是,尽管/bin被包含在PATH每个合理的系统中。
我经常在 Python 程序中遇到这种情况,通常一开始
#!/usr/bin/env python就避免指定python可执行文件的完整的、与系统相关的路径(但是请注意,它仍然需要env驻留在/usr/bin.二进制)。