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.

BillMan
sumber
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 
Gilles 'SANGAT berhenti menjadi jahat'
sumber
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
inemanja
sumber
1
readlinktampaknya tidak diperlukan, realpathakan secara otomatis menyelesaikan tautan simbolik.
Dagang