如何找到文件和 运行 作为源脚本?
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
感谢帮助
我有一个文件夹,其中包含许多包含函数的不同文件。 我使用 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
感谢帮助