So überprüfen Sie, ob das Ziel einer symbolischen Verknüpfung auf einen bestimmten Pfad verweist

16

Ich weiß, dass ich in einem Bash-Skript überprüfen kann, ob eine Datei ein symbolischer Link mit der folgenden Syntax ist

if [ -L $path ]

Weiß jemand, wie ich testen würde, ob dieser Pfad mit einem bestimmten Pfad verknüpft ist? Ich möchte zB prüfen, ob das Ziel von $pathist /some/where.

BillMan
quelle
2
Meinen Sie damit verbunden von einem bestimmten Pfad? Könnten Sie einen readlinkbekannten Pfad nicht mit dem Pfad vergleichen, den Sie testen?
Bratchley
@Bratchley. Ja, das habe ich gemeint. Danke für die Antwort.
BillMan
2
Ich rate Ihnen dringend, Shell-Variablen immer in Anführungszeichen zu setzen (z. B. if [ -L "$path" ]), es sei denn, Sie haben einen guten Grund, dies nicht zu tun, und Sie sind sicher, dass Sie wissen, was Sie tun.
G-Man sagt, dass Monica am
@G-man danke für das tolle feedback .. unbewusst weiß ich das zu machen, aber vergiss es in der praxis .. die verstärkung hilft.
BillMan

Antworten:

21

Wenn Sie überprüfen möchten, ob $pathes sich um einen symbolischen Link handelt, dessen Ziel es ist /some/where, können Sie das readlinkDienstprogramm verwenden. Es ist kein POSIX, aber es ist auf vielen Systemen verfügbar (GNU / Linux, BusyBox, * BSD,…).

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

Beachten Sie, dass dies ein genauer Textvergleich ist. Wenn das Ziel des Links ist /some//where, oder wenn es whereund der Wert von $pathist/some/link , stimmen die Texte nicht überein.

Viele Versionen readlinkunterstützen die Option-f , die den Pfad kanonisiert, indem alle symbolischen Links erweitert werden.

Viele Shells, einschließlich dash, ksh, bash und zsh, unterstützen den -efOperator im testBuiltin, um zu testen, ob zwei Dateien identisch sind (feste Verknüpfungen zu derselben Datei, nachdem symbolischen Verknüpfungen gefolgt wurde). Diese Funktion wird ebenfalls weitgehend unterstützt, jedoch nicht für POSIX.

if [ "$path" -ef "/some/where" ]; then 
Gilles 'SO - hör auf böse zu sein'
quelle
Das erste Beispiel funktioniert nicht, wenn der Link auf einen relativen Pfad verweist ...
inemanja
@ inemanja Sicher ist es. Aber wie ich Zustand, ist dies ein Textvergleich. Unterschiedliche Pfade zum gleichen Ziel werden als unterschiedlich behandelt. Wenn Sie testen möchten, ob das Ziel eines symbolischen Links eine bestimmte Datei und kein bestimmter Pfad ist , verwenden Sie eine der unten beschriebenen Methoden.
Gilles 'SO - hör auf, böse zu sein'
0

So vermeiden Sie Probleme mit einem relativen und absoluten Pfad und "/" am Ende eines Pfads oder einer Verknüpfung:

if [ "$(realpath $(readlink -- "$path"))" = $(realpath /some/where) ]; then
    echo "Is"
else 
    echo "Is not"
fi
inemanja
quelle
readlinkscheint nicht notwendig zu sein, löst realpathautomatisch den symbolischen Link auf.
Dagang