bash-тестирование, чтобы увидеть, запускается ли скрипт в определенном каталоге с псевдонимами и не использует сопоставление строк - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть скрипт 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 быливсе на основе соответствия строк

1 Ответ

0 голосов
/ 25 февраля 2019

Вы можете использовать realpath в обоих каталогах.

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

Если realpath недоступен, но perl:

realpath(){
    perl -MCwd -e 'print Cwd::realpath($ARGV[0])' "$1"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...