The env
Linux中的命令用于显示或设置环境变量。它可用于在修改后的环境中运行程序或显示当前环境。
在本教程中,我们将深入研究其各种论点,并揭示其与脚本的集成。
参数概览
The env
命令支持扩展其功能的各种参数:
- 无参数:显示所有环境变量。
-
-u
or --unset
:删除环境变量。
-
-i
or --ignore-environment
:在干净的环境中启动命令。
-
-0
or --null
:使用空字符而不是换行符作为分隔符。
-
-v
or --debug
:提供详细输出以帮助调试。
-
-P
or --path
:使用自定义 PATH 来执行命令。
每个论点都有一个独特的目的,我们将在以下各节中进一步深入探讨。
执行不带参数的 env 命令
当。。。的时候env
命令在没有任何参数的情况下执行,它显示会话中可用的所有环境变量。
$ env
Output:
USER=username
HOME=/home/username
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
...
这些变量包括用户特定的设置(USER
, HOME
)、系统配置(PATH
, SHELL
),以及许多其他内容,具体取决于系统和安装的应用程序。
使用 env 设置新的环境变量
通过在后面指定一个键值对env
命令,您可以设置新的环境变量。
$ env NEW_VARIABLE=value
Output:
... (other environment variables) ...
NEW_VARIABLE=value
... (other environment variables) ...
在上面的示例中,一个名为的新环境变量NEW_VARIABLE
设置为值value
.
此更改是临时的,并且仅在会话期间有效,除非在配置文件中导出或设置。
修改现有环境变量
您可以使用修改现有的环境变量env
像这样的命令:
$ env PATH=$PATH:/opt/my_new_path
Output:
... (other environment variables) ...
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/my_new_path
... (other environment variables) ...
这里,现有的PATH
变量通过附加来扩展:/opt/my_new_path
到其当前值。
取消设置环境变量
您可以使用 -u 参数env
取消设置环境变量的命令:
$ env -u NEW_VARIABLE
运行上述命令后,如果查看环境变量列表,NEW_VARIABLE
将不再存在。
请记住,此更改是临时的,仅影响当前会话。
在一行中设置变量并执行命令
您可以在命令执行之前设置环境变量,该环境变量仅在命令执行期间有效。
$ env TEMP_DIR=/tmp/temporary ls $TEMP_DIR
Output:
file1.txt file2.txt ...
在这种情况下,TEMP_DIR
变量设置为/tmp/temporary
,紧接着,ls
执行命令列出指定目录的内容。
环境变量TEMP_DIR
是临时的,仅在执行命令期间有效。
抑制环境继承
The -i
or --ignore-environment
选项允许您在删除所有现有变量的环境中运行命令。
$ env -i ls
Output:
... (standard output of ls, but no environment variables present) ...
在上面的例子中,ls
命令被执行,但没有来自父进程的环境变量传递给它。
这可确保该命令在完全干净的环境中运行,不受任何先前设置或配置的影响。
使用环境-0
The -0
or --null
选项修改env
命令的输出使用空字符(\0
) 而不是换行符作为不同环境变量之间的分隔符。
$ env -0
Output:
USER=username\0HOME=/home/username\0SHELL=/bin/bash\0...
当使用需要空终止字符串的工具或脚本时,这尤其有用,例如xargs -0
命令。
假设您担心包含术语“密码”、“秘密”、“令牌”或“密钥”的变量。
您可以使用env -0
结合grep -zi
以不区分大小写的方式搜索并处理以 null 结尾的数据:
$ env -0 | grep -ziE 'password|secret|token|key' | xargs -0 -n1
The grep 命令以不区分大小写的方式搜索任何术语 (-i
)和用途扩展正则表达式 (-E
) 来匹配任何术语。
The -z
选项确保它在空终止行上运行。
使用 -v 或 –debug 进行调试
The -v
or --debug
选项提供有关的详细信息env
命令的内部操作。
$ env -v
Output:
initializing ...
importing: PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
importing: USER=username
... (more detailed output) ...
这对于调试目的很有用,特别是当您想了解如何进行调试时env
正在执行期间处理或修改环境变量。
使用自定义 PATH 执行命令
通过使用-P
or --path
选项,您可以提供自定义PATH
用于执行后续命令。
$ env -P /custom/path/bin: ls
Output:
... (output of ls executed using binaries from the specified PATH) ...
如果您想使用特定目录中的二进制文件运行命令或临时覆盖默认系统实用程序,这尤其有用。
编写使用 env 的脚本
考虑以下名为sample_script.sh
:
#!/usr/bin/env bash
echo "Current USER: $USER"
echo "Shell: $SHELL"
执行时:
Output:
Current USER: username
Shell: /bin/bash
在此脚本中,shebang 行 (#!/usr/bin/env bash
)确保脚本运行bash
由系统环境定位的解释器PATH
.
这样,它就可以在不同的系统之间变得更加可移植。bash
二进制文件可能位于不同的位置。
shebang 的解释 (#!/usr/bin/env)
舍邦 (#!
) 是脚本中指定其执行解释器的初始两字节序列。
当与/usr/bin/env
,它确保脚本使用系统环境指定的解释器PATH
.
例如:
#!/usr/bin/env python3
这个 shebang 确保使用以下命令执行脚本python3
由系统确定的解释器PATH
.
这是使脚本更具可移植性的常见方法,因为解释器的确切路径可能因系统而异。
Using /usr/bin/env
提供一定程度的间接性,允许系统定位所需的解释器,而无需在脚本中指定其绝对路径。
资源
https://man7.org/linux/man-pages/man1/env.1.html