パブリックコード用に作成しているbashスクリプトがあり、ユーザーがgitリポジトリ(またはそのサブディレクトリ)でスクリプトを直接実行していないことを確認したいと思います。リポジトリの場所を指す環境変数CODELIBがあり、サブディレクトリをキャッチするワイルドカードを使用して、次の方法で文字列照合をテストしていました。
if [[ `pwd` == *${CODELIB}* ]]; then
echo "error: do not run in your git repository " $CODELIB
exit 1
fi
これはほとんどの状況で正常に機能しますが、AFSを使用している私の雇用主のように、ユーザーが$ HOMEのサブディレクトリにコードを持っている場合、時々見つけられます。一部のユーザーにとっては、ホームが次のようにマウントされるようなエイリアスが使用されているようです。
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"
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加