为什么获取文件会改变导出的环境变量中的路径?

为什么获取文件会改变导出的环境变量中的路径?

.foo.sh我有一个仅包含导出的文件,即

export foo="../../../../"
export bar="a/b/c/d/"
export baz="a/b/c/d/e/f"

在脚本中,该文件的来源如下(我已验证脚本中没有其他内容影响它,测试脚本仅执行此操作):

!#/bin/bash
cd u/v/x/y/z/
source .foo.sh

但是环境变量设置不正确。如果我echo "foo $foo bar $bar baz $baz"在采购之前和之后添加,我会得到以下输出:

foo  bar  baz 
foo . bar .. baz ../e/f

如果我添加cat .foo.sh使脚本看起来像这样:

!#/bin/bash
cd u/v/x/y/z/
cat .foo.sh
echo "foo $foo bar $bar baz $baz"
source .foo.sh
echo "foo $foo bar $bar baz $baz"

我得到这个输出:

export foo="../../../../"
export bar="a/b/c/d/"
export baz="a/b/c/d/e/f"
foo  bar  baz 
foo . bar .. baz ../e/f

如果我用内容替换源行.foo.sh,如下所示:

!#/bin/bash
cd u/v/x/y/z/
echo "foo $foo bar $bar baz $baz"
export foo="../../../../"
export bar="a/b/c/d/"
export baz="a/b/c/d/e/f"
echo "foo $foo bar $bar baz $baz"

我得到这个输出:

foo  bar  baz 
foo ../../../../ bar a/b/c/d/ baz a/b/c/d/e/f

与仅内联导出时相比,为什么在源文件中导出时路径会更改为相对于另一个目录,即使源文件位于 CWD 中并且导出的路径是硬编码字符串?

答案1

.foo.shmy 中列出的目录中有一个名为的文件PATH,它导出相同的变量,但具有其他值。事实证明,就像运行普通命令一样,在获取文件时,shell 首先在 中查找PATH具有匹配名称的文件。考虑到which .foo.sh不会像可执行文件一样返回任何内容,这会更加令人困惑。但是像这样将脚本更改为源source ./.foo.sh解决了问题。

相关内容