哪个PATH环境“exec env - ”使用?

时间:2018-01-23 14:33:43

标签: linux shell

请看两个命令:

$ export PATH="/bin"

$ exec env - /bin/bash -c 'echo $PATH'

结果是:

/usr/local/bin:/usr/bin

为什么?如何修改“exec env - ”

中使用的PATH变量

3 个答案:

答案 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变量 - 而不是环境变量

我们可以使用printenvexport来证明这一点(我通过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