首页 > 解决方案 > bash 测试以查看脚本是否在具有别名的某个目录中运行并且不使用字符串匹配

问题描述

我有一个我正在为公共代码编写的 bash 脚本,我想确保用户没有直接在 git 存储库(或其子目录)中运行脚本。我有一个指向存储库位置的环境变量 CODELIB,我正在以下列方式测试字符串匹配,并使用通配符来捕获子目录:

if [[ `pwd` == *${CODELIB}* ]]; then
  echo "error: do not run in your git repository " $CODELIB
  exit 1
fi

这在大多数情况下都可以正常工作,但有时如果用户将他们的代码放在 $HOME 的子目录中,因为我的雇主使用 AFS,并且似乎使用了别名,因此对于某些用户来说,家庭是这样安装的

cd $HOME
pwd

给了这个

/afs/xyz.it/home/t/user/

而不是这个

/afs/xyz/home/t/user/

作为变量 CODELIB 指向

/afs/xyz/home/t/user/code_location

在这种情况下,我的测试失败了。因此,我想知道 bash 中是否有一个内置函数可以更健壮地测试一个目录是否是另一个目录的子目录,而无需求助于字符串匹配。

我在这里找到的解决方案:https ://unix.stackexchange.com/questions/6435/how-to-check-if-pwd-is-a-subdirectory-of-a-given-path都是基于字符串匹配

标签: bashdirectory

解决方案


您可以realpath在两个目录上使用。

if [[ "$(realpath "$(pwd)")"/ == "$(realpath "${CODELIB}")"/* ]]; then

如果realpath不可用但 perl 是:

realpath(){
    perl -MCwd -e 'print Cwd::realpath($ARGV[0])' "$1"
}

推荐阅读