请看两个命令:
$ export PATH="/bin"
$ exec env - /bin/bash -c 'echo $PATH'
结果是:
/usr/local/bin:/usr/bin
为什么?如何修改“exec env - ”
中使用的PATH变量答案 0 :(得分:3)
-
的{{1}}选项会清除环境(因此导出的env
会被丢弃)。当PATH
启动时,它将执行正常的启动文件处理(由于bash
选项指定了非交互式shell,因此可能不是很多。)
因此-c
在其环境中启动时没有bash
,并且可能无法通过启动文件获取一个,因此它将使用默认值。我想这就是你所看到的。
如果您无法修改PATH
命令(正如您在某些评论中提到的那样),那么要获得您想要的env -
,您需要说服PATH
执行一个启动文件,用于将bash
设置为您要查找的内容。
以下表明您可能运气不好,因为PATH
没有看到任何启动文件被打开:
bash
答案 1 :(得分:1)
env
在可选修改的环境中运行程序。默认情况下,不进行任何修改。要修改环境,您可以传递-
(如命令所做)或-i
删除所有现有环境变量并在命令行上启动新的和/或传递key = value对以设置新的值。后者是你想要的情况:
$ env - PATH="/bin" /bin/bash -c 'echo $PATH'
/bin
根据手册页:
命名强>
env - 在修改后的环境中运行程序<强>概要强>
env [OPTION]... [-] [NAME=VALUE]... [COMMAND [ARG]...]
<强>描述强>
在环境中将每个NAME设置为VALUE并运行COMMAND。
由于您无法修改该命令,并且该命令使用-
来清除环境,并且命令为bash -c
您运气不好。原因如下:
-c
表示将给定的字符串作为单个命令执行。在该模式下,不执行正常的启动文件。在该模式下执行启动文件的唯一方法是set the BASH_ENV
variable。但是,在这种情况下,由于env -
会清除所有环境
答案 2 :(得分:1)
您看到的PATH
是 Bash变量 - 而不是环境变量。
我们可以使用printenv
或export
来证明这一点(我通过cut
通过管道显示名称而非价值):
$ env - bash -c printenv | cut -d= -f1
PWD
SHLVL
_
还有更多(未导出的)Bash变量:
$ env - bash -c set | cut -d= -f1
BASH
BASHOPTS
BASH_ALIASES
BASH_ARGC
BASH_ARGV
BASH_CMDS
BASH_EXECUTION_STRING
BASH_LINENO
BASH_SOURCE
BASH_VERSINFO
BASH_VERSION
DIRSTACK
EUID
GROUPS
HOSTNAME
HOSTTYPE
IFS
MACHTYPE
OPTERR
OPTIND
OSTYPE
PATH
PPID
PS4
PWD
SHELL
SHELLOPTS
SHLVL
TERM
UID
_
(请注意,如果没有$HOME
,我们的用户启动脚本就不会运行;您也可以添加--norc
来排除/etc/bash.bashrc
等。
如果您使用不同的shell,您将获得一组不同的默认变量:
$ env - dash -c set | cut -d= -f1
IFS
OPTIND
PATH
PPID
PS1
PS2
PS4
PWD
$ env - dash -c printenv | cut -d= -f1
PWD