源代码在 while 循环内不起作用

源代码在 while 循环内不起作用

这可能是非常愚蠢的事情,但我在任何地方都找不到任何答案。我尝试设置一个.bashrc.d目录,其中包含要在其中获取源代码的脚本.bashrc,以使该过程更有条理。我不是手动获取 中的每个脚本.bashrc.d,而是以这种方式获取它们:

if [ -d "$HOME/.bashrc.d" ]; then
    find "$HOME/.bashrc.d/" -type f -name "*.sh" | sort | \
        while read -r f; do
            source "$f"
        done
fi

但是,source "$f"似乎是在子 shell 内运行,因为该命令实际上并不获取任何文件。正如我从 的输出中看到的那样,它执行它们set -x,但例如没有变量导出携带到原始迭代 shell。我还知道这是在 while 循环内进行采购的问题,而不是从 进行采购的问题.bashrc,因为手动采购这些文件实际上是有效的(尽管它不能解决这个问题)。到底发生了什么以及如何解决这个问题?

答案1

你是对的,你source在子外壳中运行。要修复它,您可以简单地循环遍历文件,而无需管道查找 find 的输出:

for script in "$HOME"/.bashrc.d/*.sh
do
    if [ -r "$script" ]
    then
        . "$script"
    fi
done

答案2

是管道而不是while使命令在子 shell 中运行。设置该lastpipe选项对于具有作业控制的交互式 shell 没有帮助。尝试“进程替换”(如果您的bash版本提供):

while read -r f; do source "$f"; done < <( find "$HOME/.bashrc.d/" -type f -name "*.sh" | sort ) 

相关内容