如何解决Bash仅在特定目录中时才能访问子文件夹中的脚本
要详细说明,
项目结构
current-working-directory
-- scripts [d]
-- script1 [d]
-- script1 [f]
-- script2 [d]
-- script2 [f]
-- README [f]
-- executable [f]
主要思想:我希望能够运行位于 script1 中的 function1 我在 current-working-directory 或任何子文件夹中。
我在这方面有多次尝试:
IDEA#1 .bashrc
function cd {
builtin cd $@
local dir
if [ -d "bpm_modules" ]; then
for dir in $(ls bpm_modules);do
. "$PWD/bpm_modules/$dir/$dir"
done
fi
}
用cd命令包装
注意:由于我是文件的来源,一旦离开目录,我仍然可以访问。
IDEA#2 .bashrc
function require {
# You Have Gone Too Far
[ "$1" == "$HOME" ] && return 1
# Assign Parameters Accordingly
[ $# -eq 1 ] && local CWD="$PWD" && local QUERY="$1"
[ $# -eq 2 ] && local CWD="$1" && local QUERY="$2"
local FOUND_MODULE=1
# Error Handling
function trapper {
local BOO=$1
local QUERY=$2
NOT_FOUND="$(tput setaf 1)[DEPENDENCY]: $(tput sgr0)missing '$QUERY'"
[[ $BOO -eq 1 ]] && echo "$NOT_FOUND"
}
# If In BCS Initialized Project
if [ -d "$CWD/.bpm" ]; then
# Check For Module
for DIR in $( ls $CWD/bpm_modules); do
[ "$DIR" == "$QUERY" ] && FOUND_MODULE=0 && source $CWD/bpm_modules/$DIR/$DIR
done
trap "trapper $FOUND_MODULE $QUERY" $?
# Else Go Up A Directory Recursively
else
CWD_UP1=$(cd $CWD && cd .. && pwd)
require $CWD_UP1 $QUERY
fi
}
require将用在上面项目目录图中的executable
之内,然后是类似require script1
这样的脚本/文件夹名称,以获取文件并允许我在{ {1}}
PS:我有2个星期的bash体验,所以...,我很欣赏任何要求或苛刻的事实。
PS1:“ bash pun amirite ”,它用于当前正在工作的 bash-package-manager 。
解决方法
假设我正在运行一个名为my_script.sh
的脚本。如果我想实现您的require函数,那么如果该脚本位于目录$my_dir
中,它将获取参数中给出的脚本,否则崩溃,您可以执行以下操作:
#!/bin/sh
require() {
if realpath --relative-to="$my_dir" "$1" | fgrep ../; then
echo Script "$1" is not located in directory "$my_dir",exiting. >&2
exit 1
fi
source $1
}
请注意,如果realpath
返回的路径中的目录以..
结尾,则此操作将失败。我认为这是一个合理的限制,但请注意,要解决此问题,可以将fgrep ../
替换为grep '\(^\.\./\)\|/\.\./'
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。