bash - 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都是基于字符串匹配
解决方案
您可以realpath
在两个目录上使用。
if [[ "$(realpath "$(pwd)")"/ == "$(realpath "${CODELIB}")"/* ]]; then
如果realpath
不可用但 perl 是:
realpath(){
perl -MCwd -e 'print Cwd::realpath($ARGV[0])' "$1"
}
推荐阅读
- python - 如何在 FTP 服务器上检查目录中的更改?
- apache - Apache 服务器不允许 HTTP 请求中的授权标头
- excel - 在 OpenOffice Calc 中突出显示列中的重复值
- php - SQLSTATE [22007]:无效的日期时间格式:1366 不正确的整数值:第 1 行的列 'infraction_id' 的整数值:'["1","3","66","68"]'
- forms - 将在此 Flash 应用程序中工作的最大整数(从头开始)
- java - PlayWS - 达到请求超时时如何抛出异常?
- sqlite - 如何在sqlite中选择今天中午12点到第二天早上5点的销售
- c++ - 用 C 向量替换 C++ 向量
- cakephp - 从 cakphp 表单操作中删除 id
- python - 在 Keras 的自定义损失函数中重塑张量