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