![源代码在 while 循环内不起作用](https://linux22.com/image/200482/%E6%BA%90%E4%BB%A3%E7%A0%81%E5%9C%A8%20while%20%E5%BE%AA%E7%8E%AF%E5%86%85%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8.png)
这可能是非常愚蠢的事情,但我在任何地方都找不到任何答案。我尝试设置一个.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 )