约 6298 字

约 31 分钟

#Bash 的 env 命令

env [OPTION]... [-] [NAME=VALUE]... [COMMAND [ARG]...]

功能

创建新的环境运行程序。

类型

可执行文件(/usr/bin/env),属于 coreutils。

参数

  • OPTION 选项:
    • -i, --ignore-environment - 忽略原本的环境变量,从空的环境开始
    • -0, --null - 以空字符(\0)作为行的结尾,而不是换行符(\n)
    • -u, --unset=NAME - 删除环境变量 NAME
    • -C, --chdir=DIR - 切换工作目录
    • -S, --split-string=S - 将 S 按空格拆分为独立的参数
    • --block-signal[=SIG] - 阻止向执行的命令发送 SIG 信号
    • --default-signal[=SIG] - 将 SIG 信号的处理方式重置为默认
    • --ignore-signal[=SIG] - 将 SIG 信号的处理方式设为忽略
    • --list-signal-handling - 将处理方式不为默认的所有信号在标准错误中列出
    • -v, --debug - 打印每个处理步骤的详细信息
    • --help - 显示帮助
    • --version - 显示版本
  • - - 在所有选项之后,忽略原本的环境变量;同 -i 选项
  • NAME=VALUE - 要设置的环境变量
  • COMMAND - 要执行的命令,如果为空则打印所有环境变量
  • ARG - 命令 COMMAND 的参数,在 shebang 行中需要使用 -S 选项

返回值

  • 125 - env 命令自身失败
  • 126 - COMMAND 无法被调用
  • 127 - COMMAND 无法被找到
  • 其它 - COMMAND 的返回值

#示例

设置环境变量

设置环境变量:

$ env NAME=Primers bash -c 'echo $NAME use $LANG'
Primers use en_US.UTF-8
$ NAME=Primers bash -c 'echo $NAME use $LANG'       # 可以不使用 env
Primers use en_US.UTF-8
  • 注意,这里不能直接写作 env NAME=Primers echo Hello $NAME,因为这样会在执行命令之前就将 $NAME 展开为空
  • 单纯设置环境变量可以不使用 env,直接在命令前设置即可

清空并设置环境变量:

$ env -i NAME=Primers bash -c 'echo $NAME use $LANG'
Primers use
  • 原有的环境变量被清空,因此 $LANG 为空
  • 可用于测试排除环境变量干扰

查看环境

$ env | grep PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
$ env | grep -i proxy
ALL_PROXY=http://localhost:7890

#!/usr/bin/env -S

#!/usr/bin/env -S bash -c
echo Hello World

如果不使用 -S 选项,bash -c 会被视为一个整体命令而失败:

/usr/bin/env: ‘bash -c’: No such file or directory
/usr/bin/env: use -[v]S to pass options in shebang lines

#推荐阅读

#手册

更新: 2026/3/22

作者: PlanC

创建: 2025/10/27