Come verificare la destinazione di un collegamento simbolico punta verso un determinato percorso


16

All'interno di uno script bash, so di poter verificare se un file è un collegamento simbolico con la seguente sintassi

if [ -L $path ]

Qualcuno sa come testerei se quel percorso fosse collegato a un percorso particolare? Ad esempio, voglio verificare se l'obiettivo di $pathè /some/where.



2
Intendi collegato da un percorso particolare? Non potresti fare un readlinkpercorso conosciuto e confrontarlo con il percorso che stai testando?
Bratchley,

@Bratchley. Sì, questo è ciò che intendevo .. grazie per la risposta.
BillMan,

2
Ti consiglio vivamente di inserire sempre le variabili della shell tra virgolette (ad es. if [ -L "$path" ]) A meno che tu non abbia una buona ragione per non farlo e sei sicuro di sapere cosa stai facendo.
G-Man dice "Ripristina Monica" il

@G-Man grazie per l'ottimo feedback .. inconsciamente so di farlo, ma dimenticalo in pratica .. il rinforzo aiuta.
BillMan,

Risposte:


22

Se si desidera verificare se si $pathtratta di un collegamento simbolico la cui destinazione è /some/where, è possibile utilizzare l' readlinkutilità. Non è POSIX, ma è disponibile su molti sistemi (GNU / Linux, BusyBox, * BSD, ...).

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

Si noti che questo è un confronto esatto del testo. Se la destinazione del collegamento è /some//where, o se è wheree il valore di $pathè /some/link, i testi non corrisponderanno.

Molte versioni readlinksupportano l'opzione -f, che canonicalizza il percorso espandendo tutti i collegamenti simbolici.

Molte shell, tra cui dash, ksh, bash e zsh, supportano l' -efoperatore testincorporato per testare se due file sono uguali (hard link allo stesso file, dopo aver seguito i link simbolici). Questa funzione è anche ampiamente supportata ma non POSIX.

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

il primo esempio non funziona quando il collegamento punta a un percorso relativo ...
inemanja

1
@inemanja Certo che lo è. Ma, come ho affermato, questo è un confronto testuale . Tratta percorsi diversi per lo stesso target come diversi. Se si desidera verificare se la destinazione di un collegamento simbolico è un file particolare , piuttosto che un percorso particolare , utilizzare uno dei metodi che descrivo di seguito.
Gilles 'SO- smetti di essere malvagio' il

0

Per evitare problemi con un percorso relativo e assoluto e "/" alla fine di un percorso o collegamento:

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

1
readlinknon sembra necessario, realpathrisolverà automaticamente il collegamento simbolico.
Dagang,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.