Cara memverifikasi target tautan simbolik mengarah ke jalur tertentu


16

Dalam skrip bash, saya tahu saya dapat memeriksa apakah suatu file merupakan tautan simbolis dengan sintaks berikut

if [ -L $path ]

Adakah yang tahu bagaimana saya akan menguji apakah jalur itu ditautkan ke jalur tertentu? Misalnya saya ingin memeriksa apakah targetnya $pathadalah /some/where.



2
Apakah maksud Anda terhubung dengan jalur tertentu? Tidak bisakah Anda melakukan readlinkpada jalur yang dikenal dan membandingkannya dengan jalur yang Anda uji?
Bratchley

@Bratchley. Ya, itulah yang saya maksudkan .. terima kasih atas jawabannya.
BillMan

2
Saya sangat menyarankan Anda untuk selalu memasukkan variabel shell dalam tanda kutip (misalnya, if [ -L "$path" ]) kecuali Anda memiliki alasan yang baik untuk tidak melakukannya dan Anda yakin Anda tahu apa yang Anda lakukan.
G-Man Mengatakan 'Reinstate Monica'

@ G-Man terima kasih atas umpan balik yang bagus .. tanpa sadar saya tahu untuk melakukan itu, tetapi lupakan saja dalam praktiknya .. bantuannya membantu.
BillMan

Jawaban:


22

Jika Anda ingin memeriksa apakah $pathtautan simbolis yang memiliki target /some/where, Anda dapat menggunakan readlinkutilitas tersebut. Ini bukan POSIX, tetapi tersedia di banyak sistem (GNU / Linux, BusyBox, * BSD, ...).

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

Perhatikan bahwa ini adalah perbandingan teks yang tepat. Jika target tautannya adalah /some//where, atau jika itu wheredan nilainya $pathadalah /some/link, maka teks tidak akan cocok.

Banyak versi readlinkmendukung opsi -f, yang mengkanonik jalur dengan memperluas semua tautan simbolik.

Banyak shell, termasuk dash, ksh, bash dan zsh, mendukung -efoperator dalam testbuiltin untuk menguji apakah dua file itu sama (hard link ke file yang sama, setelah mengikuti tautan simbolik). Fitur ini juga didukung secara luas tetapi tidak POSIX.

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

contoh pertama tidak berfungsi ketika tautan mengarah ke jalur relatif ...
inemanja

1
@inemanja Tentu. Tapi seperti yang saya nyatakan, ini adalah perbandingan teks . Ini memperlakukan jalur berbeda ke target yang sama berbeda. Jika Anda ingin menguji apakah target tautan simbolis adalah file tertentu , bukan jalur tertentu , gunakan salah satu metode yang saya jelaskan di bawah ini.
Gilles 'SO- stop being evil'

0

Untuk menghindari masalah dengan jalur relatif dan absolut, dan "/" di akhir jalur atau tautan:

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

1
readlinktampaknya tidak diperlukan, realpathakan secara otomatis menyelesaikan tautan simbolik.
Dagang
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.