我正在编写一个脚本,我想检查相对于脚本工作目录的文件夹是否在shell的路径中。
例如,如果项目结构是:
top/
bin/
tests/
test1/
foo.sh
test2/
foo.sh
我想检查来自top/bin
PATH
的{{1}}是否在foo.sh
。我知道以下内容可行:
cd ../../bin
if echo $PATH|grep `pwd`; then
echo "Success"
else
echo "Failure"
fi
但是我必须跟踪我开始的目录,以便我可以cd
回到那里。我可以在pwd
之后删除最后两个目录,然后将bin
附加到其中吗?有没有其他智能方法来处理这个?
作为奖励,我想使这个脚本对tests
内的其他目录级别具有强大的功能,但如果它使事情复杂化则不是必需的。
答案 0 :(得分:2)
# Exits with code 0 if the first argument is on the user's path.
is_on_path() {
CANONICAL_NAME=$(readlink -f "$1")
while read -r -d: COMPONENT; do
if [[ "$CANONICAL_NAME" = "$COMPONENT" ]]; then
return 0
fi
done <<< "$PATH"
return 1
}
readlink -f
会根据需要评估../..
等路径组件。read -r -d: COMPONENT
将从输入中读取以冒号分隔的参数列表,并将其读入COMPONENT
变量。<<< "$PATH"
会将系统路径传递到while
的标准输入。现在你可以这样打电话:
if is_on_path "../../bin"; then
echo "Success!"
else
echo "Failure!"
fi
加分:从这里可以很容易地将其递归应用于所有父目录:
find_matching_ancestor() {
current_dir=$(pwd)
while [[ "$current_dir" != "/" ]]; do
if is_on_path "$current_dir/bin"; then
echo "$current_dir"
return 0
fi
current_dir=$(dirname "$current_dir")
done
return 1
}
答案 1 :(得分:0)
这似乎有效
echo $PATH | xargs -d: -n1 | grep ^$(readlink -f ../../bin)$ | wc -l
答案 2 :(得分:0)
也许最可靠的方法是将一个可执行位设置的文件放到该目录中并使用&#34;&#34;。
例如,我的PATH上是/ bin吗?
which ls
/bin/ls