如何找到文件和 运行 作为源脚本?

how to find file and run as source script?

我有一个文件夹,其中包含许多包含函数的不同文件。 我使用 declare 将这些函数发布给用户。 这是我使用的示例函数:

space () { 
 df -h
} 
declare -f space

在用户 .bashrc 下,我添加了以下内容:

for FILE in $HOME/functions/* ; do source $FILE ; done

但是我收到这条消息:

-bash: source: /home/user/functions/subdirectory: is a directory

谁能建议如何解决这个问题,或者有更好的方法将函数加载到 shell 变量而不是环境变量?

我会这样更正 xdhmoore 的回答:

while read -d $'[=10=]' file; do
    source "$file"
done < <(find $HOME/functions -type f -print0)

确实,使用管道将防止修改当前环境,这是 source 命令的主要目标之一。

管道问题示例:让我们像这样创建文件 ~/functions/fff(假设它是 ~/functions 中的唯一文件):

a=777

那么运行 find ~/functions -type f | while read f; do source "$f"; done; echo $a:你将没有输出。

然后运行 while read f; do source "$f"; done < <(find ~/functions -type f); echo $a:你会得到这样的输出:777.

该行为的原因是用 | 管道传输的命令在子 shell 中 运行ning,然后 子 shell 环境 将被修改,不是现在的。

只检查文件是否存在。另外,引用变量扩展。首选小写变量。

for file in "$HOME"/functions/* ; do
     if [[ -f "$file" && -r "$file" ]]; then
        source "$file"
     fi
done

这可移植到 posix shell(只需将 [[ 更改为 [ 并将 ]] 更改为 ])并且通常只是那样写的。我相信您会在 /etc/profile 中找到这样的循环。我在 bash-completion 脚本中发现了一些类似的东西。

感谢所有回答,这是对我有用的更新。

MYFUNC=$(find ~/functions -type f)
for f in $MYFUNC ; do
source $f > /dev/null 2>&1
done

感谢帮助