Bashスクリプト内で、ファイルが次の構文のシンボリックリンクであるかどうかを確認できることを知っています
if [ -L $path ]
そのパスが特定のパスにリンクされているかどうかをテストする方法を知っている人はいますか?例えば。 $path
のターゲットが/some/where
かどうかを確認したい。
$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