この回答では$1、サブディレクトリを含めることが許可されていると想定しています。が$1単純なディレクトリ名である必要があるより単純なケースに興味がある場合は、他の回答の1つを参照してください。
ワイルドカードは、二重引用符で囲まれている場合は展開されません。以来$1、二重引用符で囲まれている、ワイルドカードは問題ではありません。
../とシンボリックリンクの両方が、ファイルの実際の場所を覆い隠す可能性があります。以下に示すのは、ファイルが目的のパスの下にあるかどうかを判断するためのテストです。
新しいシステム:使用 realpath
ファイルが本当に下にある/home/charlesingalls/かどうかを確認するに は、次を使用できますrealpath:
realpath --relative-base=/home/charlesingalls/ "/home/charlesingalls/$1" | grep -q '^/' && exit 1
でexit 1指定されたファイル$1がディレクトリ以外の場所にある場合、上記が実行されます/home/charlesingalls/。 realpathパス全体を正規化し、シンボリックリンクとの両方を削除し../ます。
realpath GNU coreutilsの一部であり、どのLinuxシステムでも使用できるはずです。
realpath必要とGNUは8.15(2012年1月)以上をcoreutilsの。
例
../ファイルの実際の場所を決定するためにrealpathがどのように続くかを示すには(たとえば、-qgrepの実際の出力が見えるようにgrepへのオプションは省略されます):
$ touch /tmp/test
$ realpath --relative-base=$HOME "$HOME/../../tmp/test" | grep '^/' && echo FAIL
/tmp/test
FAIL
シンボリックリンクをたどる方法を示すには:
$ ln -s /tmp/test ~/test
$ realpath --relative-base=$HOME "$HOME/test" | grep '^/' && echo FAIL
/tmp/test
FAIL
古いシステム:使用 readlink -e
readlinkは、シンボリックリンクとの両方をたどってパスをコニカライズすることもできます../。
readlink -e "$HOME/test" | grep -q "^$HOME" || exit 1
同じサンプルファイルを使用する:
$ readlink -e "$HOME/../../tmp/test" | grep "$HOME" || echo FAIL
FAIL
$ readlink -e "$HOME/test" | grep "^$HOME" || echo FAIL
FAIL
古いGNUシステムで利用できるほか、のバージョンもreadlinkBSDで利用できます。
/。ワイルドカードは引用符内では解釈されません。