Linux env 命令:深入了解 Linux 环境管理

2023-10-23

The envLinux中的命令用于显示或设置环境变量。它可用于在修改后的环境中运行程序或显示当前环境。

在本教程中,我们将深入研究其各种论点,并揭示其与脚本的集成。

 

 

参数概览

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux env 命令:深入了解 Linux 环境管理 的相关文章

  • 如何在 Linux 中检测通过 GUI 登录的用户

    我想在我的程序中捕获通过 GUI 登录的用户名 我的程序作为守护进程从 root 登录运行 如果非 root 用户通过 GUI 登录 我的程序应该会收到通知 我正在粘贴我当前的程序 该程序调用一个 perl 脚本 利用系统调用来检查当前登录
  • 为 bash 脚本创建应答文件

    我想为别人的 bash 脚本创建一个应答文件 当您运行 bash 脚本时 第一次安装该软件时 系统会询问您 5 个问题 我用的是yes script命令并且有效 它会自动应答yes对所有问题 不过我还是想回答一下no对于最后一个问题 有办法
  • 编译错误:linux/module.h:没有这样的文件或目录

    我写了一个简单的模块 define KERNEL define MODULE include
  • Java Linux 非阻塞套接字超时行为

    我有一个 Java 非阻塞服务器 它跟踪选择器中的所有套接字通道 然后我与服务器建立 500 个连接并定期发送数据 服务器接收到的每条数据都会回显给客户端 问题来了 测试工作了几个小时 然后突然逐渐地 服务器管理的所有套接字在尝试读取数据时
  • 如何让SSH命令执行超时

    我有一个这样的程序 ssh q email protected cdn cgi l email protection exit echo output value gt 在上面的代码中 我尝试通过 SSH 连接到远程服务器 并尝试检查是否可
  • 如何尽可能快地输出固定缓冲区?

    示例代码 include
  • 如果specfile中的某些条件不满足,如何中止rpm包的安装?

    还有一些事情Requires标签不满足 所以我写了一个脚本来验证这些东西 但是我把它们放在哪里呢 如果没有找到 那么我想退出安装 提示用户在尝试再次安装此 rpm 之前执行这些步骤 writing exit 1 in installtag
  • 使用 AWK 或 SED 以及以下标签以逗号分隔

    使用 AWK 或 SED 以及下面使用的标签以逗号分隔 BEGIN AccountID BEGIN CallerID BEGIN Billed Account Attributes 1111111 1111111 1111111 END B
  • SSL 和 Tkinter 不存在于 Python 3.5.2、Debian Linux 的源代码构建中

    我刚刚将 Python 3 5 2 下载到我的 Debian 机器上并使用以下命令构建它 configure make make test sudo make install 一切正常 但在make test输出中 它显示安装程序由于未安装
  • 将尾部输出重定向到程序中

    我想使用 tail 作为标准输入向程序发送文本文件中的最新行 首先 我向程序回显一些每次都相同的输入 然后从输入文件发送尾部输入 该输入文件应首先通过 sed 处理 以下是我期望工作的命令行 但是当程序运行时 它只接收回显输入 而不接收尾部
  • 为多线程 UDP 客户端执行“close ()”时套接字描述符未释放

    我在下面编写了 UDP 客户端 它基本上生成一个单独的线程来接收数据报 但是数据报仅在主线程中发送 现在 在 Linux 发行版上实例化 udpClient 1 UDP 客户端后按 ctrl D 实现退出循环 围绕 getline 调用 并
  • 更改子进程中的 iostream

    现在 我正在开发一个项目 其中我需要启动一个子进程来使用 C 在 Linux 中执行一个新程序 并且我需要重定向标准输入和输出 就像在 C 中一样 它们是cin and cout 到一个文件 这意味着在子进程中 标准输入和输出都是文件 子进
  • 是否可以允许jenkins访问只有root或某些特定程序可以访问的文件?

    我基本上想做的是允许 jenkins 访问我的 android sdk linux 文件夹和所有子目录 我的老板不想自己更改文件夹的权限 我应该在构建过程中这样做 我见过一些在构建过程中在执行 shell 中运行一些命令的示例 是否可以在该
  • 为什么 SDL 在 Mac 上比 Linux 上慢得多?

    我正在研究使用 SDL2 渲染的单线程图形程序 https github com TurkeyMcMac intergrid 请参阅末尾的较小示例 它既可以在旧的 Linux 机器上运行 也可以在不太旧的 Mac 上运行 Linux 计算机
  • 为什么我的 Java 代码执行 bash 命令不正确?

    我试图让我的 Java 程序与 Linux bash 交互 但出了问题 我有一个简单的可执行文件prog从中读取一个整数stdin并输出其平方 执行中 echo 5 prog 从 bash 本身打印正确答案25 in stdout但运行 i
  • 将 -1 作为文件描述符传递给 mmap

    我对 FC17 Linux 中的 ls 命令进行了 strace 以下是输出 execve usr bin ls ls 48 vars 0 brk 0 0x27c1000 mmap NULL 4096 PROT READ PROT WRIT
  • 在ubuntu 18.04上安装python 2.7

    有没有办法在 Ubuntu 18 04 上安装 Python 2 7 我尝试了这个命令 但它不起作用 sudo apt install python minimal 有没有办法手动安装 我尝试使用 python 2 7 作为不支持 pyth
  • 找出某个日期时间自unix纪元以来的时间?

    我想找出 2009 年 10 月 1 日 9 00 BST 的 UNIX 时间 即自 Unix 纪元以来的秒数 我如何在 Linux 命令行上执行此操作 我知道你可以使用date UNIXTIME someformat 但是unix时间是我
  • GCC 4.7 字符串文字的源字符编码和执行字符编码?

    Linux x86 64 上的 GCC 4 7 是否具有默认字符编码 用于验证和解码 C 源文件中字符串文字的内容 这是可配置的吗 此外 当将字符串数据从字符串文字链接到输出的数据部分时 它是否具有默认的执行字符编码 这是可配置的吗 在任何
  • 在 Linux 中使用仅限 CLI 的工具生成磁盘使用情况图/图表

    在这个问题中 https stackoverflow com questions 32230 tracking down where disk space has gone on linux有人询问如何在 Linux 中显示磁盘使用情况 我

随机推荐

  • Java 技巧:将字符串转换为日期

    在 Java 编程领域 日期和时间操作是一项基本技能 但是 日期通常作为字符串传递 这需要将这些字符串转换为 Date 对象以进行有效操作 在本综合指南中 我们将详细介绍在 Java 中将字符串转换为日期的过程 了解基础知识 表示日期的字符
  • UFW:通用防火墙规则和命令

    防火墙是一种安全系统 它根据预定义的安全规则监视和控制传入和传出的网络流量 它是任何安全网络的重要组成部分 无论是个人计算机还是大型企业网络 Uncomplicated Firewall UFW 是一个用户友好的命令行界面 用于管理 ipt
  • 编辑 crontab 文件的要点

    在系统管理领域 有一种强大的工具可以让您高效地安排任务 crontab 使用 crontab 您可以在指定的日期和时间执行脚本和命令 这使其成为基于 Unix 的系统中非常有用的实用程序 但是 要充分利用其潜力 您需要了解编辑 cronta
  • 如何在 Linux 中创建交换文件

    交换文件是 Linux 操作系统的重要组件 它通过提供额外的虚拟内存来帮助提高性能 它是在系统物理内存 RAM 填满时保留用作虚拟内存的磁盘空间 在 Linux 中创建交换文件有助于防止系统崩溃和不稳定 在本文中 我们将逐步讨论如何在 Li
  • 如何在 phpMyAdmin 中添加多个主机

    phpMyAdmin 默认配置仅允许连接到本地 MySQL 服务器 但是如果我们运行多个数据库服务器 那么如果我们可以从单个 phpMyAdmin 安装中选择需要连接的服务器 那就太好了 本操作指南将帮助您在 phpMyAdmin 中添加多
  • Bash 选择(制作菜单)

    在本教程中 我们将介绍以下基础知识select在 Bash 中构建 The select构造允许您生成菜单 Bash select构造 The select构造从项目列表生成菜单 它的语法几乎与for loop select ITEM in
  • 如何在 CentOS 7 上安装和配置 Redmine

    Redmine 是最流行的开源项目管理和问题跟踪软件工具之一 它是跨平台和跨数据库的 构建在 Ruby on Rails 框架之上 Redmine包括对多个项目 wiki 问题跟踪系统 论坛 日历 电子邮件通知等的支持 在本教程中 我们将介
  • 如何在 Ubuntu 18.04 上部署 Rocket.Chat

    Rocket Chat 是一个开源团队交流平台 是自托管的 Slack 替代品 它使用 Meteor 框架开发 提供各种功能 包括帮助台聊天 文件共享 视频会议 语音消息 API 等 对于想要托管自己的聊天系统的公司和社区来说 Rocket
  • .bashrc 与 .bash_profile

    如果您在命令行上花费大量时间 您很可能想要自定义您的 shell 环境 这可能意味着创建别名 将新目录添加到 PATH 或更改 shell 提示符的外观 您可能遇到过一些教程 其中他们说将您的配置放在 bashrc bash profile
  • 如何在 CentOS 7 上安装和使用 PHP Composer

    Composer是 PHP 的依赖管理器 类似于Node js 的 npm or Python 的点子 Composer 将提取您的项目所依赖的所有必需的 PHP 包并为您管理它们 它用于所有现代 PHP 框架和平台 例如 Laravel
  • 如何在 CentOS 8 上安装 Apache

    Apache HTTP 服务器是世界上使用最广泛的 Web 服务器 它是一个免费 开源 跨平台的HTTP服务器 具有强大的功能 并且可以通过多种模块进行扩展 在本文中 我们将解释如何在 CentOS 8 上安装和管理 Apache Web
  • 如何在 Debian 9 上安装 CouchDB

    CouchDB 是一个开源的容错且无模式的 NoSQL 数据库 由 Apache 软件基金会维护 CouchDB 服务器将其数据存储在命名数据库中 其中包含以下文档JSON结构 每个文档由许多字段和附件组成 字段可以包括文本 数字 列表 布
  • 如何在 CentOS 7 上安装 Visual Studio Code

    视觉工作室代码是微软开发的开源跨平台代码编辑器 它有一个内置的调试支持 嵌入式Git控制 语法突出显示 代码完成 集成终端 代码重构和片段 在 CentOS 计算机上安装 Visual Studio Code 最简单且推荐的方法是启用 VS
  • 如何在 Ubuntu 18.04 上安装 Mono

    Mono 是一个用于开发和运行基于 ECMA ISO 标准的跨平台应用程序的平台 它是 Microsoft NET 框架的免费开源实现 本教程介绍如何在 Ubuntu 18 04 上安装 Mono 先决条件 这些说明假定您以 root 身份
  • Linux中的su命令(切换用户)

    The su 替代或切换用户的缩写 实用程序允许您使用其他用户 默认为 root 用户 的权限运行命令 Using su是在当前登录会话中切换到管理帐户的最简单方法 当不允许 root 用户通过以下方式登录系统时 这尤其方便ssh或使用 G
  • Linux 中的Whereis命令

    whereis是一个命令行实用程序 允许您查找给定命令的二进制文件 源文件和手册页文件的位置 在这篇文章中 我们将向您展示如何使用Linuxwhereis命令 如何使用whereis命令 语法为whereis命令如下 whereis OPT
  • 在 CentOS 8 上使用 Let's Encrypt 保护 Nginx

    Let s Encrypt 是由互联网安全研究小组 ISRG 开发的免费 自动化 开放的证书颁发机构 提供免费的 SSL 证书 Let s Encrypt 颁发的证书受到所有主要浏览器的信任 并且自颁发之日起 90 天内有效 在本教程中 我
  • Expect 命令以及如何像魔术一样自动化 shell 脚本

    在上一篇文章中 我们讨论了写作实用的shell脚本 我们看到了编写 shell 脚本是多么容易 今天我们要讨论一个对 shell 脚本有神奇作用的工具 该工具是期待命令 or 期待脚本语言 Expect 命令或 Expect 脚本语言是一种
  • SSH 连接被拒绝(原因和解决方案)

    本教程将介绍您在使用 SSH 时可能遇到的最常见错误 连接被拒绝 请继续阅读 详细了解这个问题及其各种解决方案 Secure Shell SSH 是系统管理员最常用的工具之一 它对于管理所有服务器和执行日常任务至关重要 目录 hide 1
  • Linux env 命令:深入了解 Linux 环境管理

    The envLinux中的命令用于显示或设置环境变量 它可用于在修改后的环境中运行程序或显示当前环境 在本教程中 我们将深入研究其各种论点 并揭示其与脚本的集成 目录 hide 1 参数概览 2 执行不带参数的 env 命令 3 使用 e