web-dev-qa-db-ja.com

シンボリックリンクのターゲットが特定のパスを指していることを確認する方法

Bashスクリプト内で、ファイルが次の構文のシンボリックリンクであるかどうかを確認できることを知っています

if [ -L $path ]

そのパスが特定のパスにリンクされているかどうかをテストする方法を知っている人はいますか?例えば。 $pathのターゲットが/some/whereかどうかを確認したい。

16
BillMan

$pathがターゲットが/some/whereのシンボリックリンクであるかどうかを確認する場合は、readlinkユーティリティを使用できます。 POSIXではありませんが、多くのシステム(GNU/Linux、BusyBox、* BSDなど)で使用できます。

if [ "$(readlink -- "$path")" = /some/where ]; then …

これは正確なテキスト比較であることに注意してください。リンクのターゲットが/some//whereの場合、またはwhere$pathの値が/some/linkの場合、テキストは一致しません。

readlinkの多くのバージョンは、オプション-fをサポートしています。このオプションは、すべてのシンボリックリンクを展開してパスを正規化します。

ダッシュ、ksh、bash、zshなどの多くのシェルは、2つのファイルが同じかどうかをテストするために、組み込みのtest-ef演算子をサポートしています(シンボリックリンクをたどった後、同じファイルへのハードリンク)。 。この機能も広くサポートされていますが、POSIXではサポートされていません。

if [ "$path" -ef "/some/where" ]; then …

相対パスと絶対パス、およびパスまたはリンクの末尾にある「/」の問題を回避するには:

if [ "$(realpath $(readlink -- "$path"))" = $(realpath /some/where) ]; then
    echo "Is"
else 
    echo "Is not"
fi
0
inemanja