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


16

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

if [ -L $path ]

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



2
特定のパスでリンクされているということですか?readlink既知のパスでa を実行し、テストしているパスと比較できませんでしたか?
-Bratchley

@Bratchley。はい、それは私が意味したものです。答えに感謝します。
ビルマン

2
シェル変数を引用符で囲むことを強くお勧めします(例:)、if [ -L "$path" ]そうする正当な理由がない限り、何をしているのかを確実に知っている必要があります。
G-Manは「Reinstate Monica」と言います

@ G-Manは素晴らしいフィードバックに感謝します。無意識のうちにそうすることは知っていますが、実際には忘れてしまいます。
ビルマン

回答:


22

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

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

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

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

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

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

最初の例は、リンクが相対パスを指す場合は機能しません
...-inemanja

@inemanja確かにそうです。しかし、私が述べているように、これはテキスト比較です。同じターゲットへの異なるパスを異なるものとして扱います。シンボリックリンクのターゲットが特定のパスではなく特定のファイルかどうかをテストする場合は、以下で説明する方法のいずれかを使用します。
ジル 'SO-悪であるのをやめる'

0

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

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

readlink必要ではないと思われる、realpath自動的にシンボリックリンクを解決します。
ダガン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.