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 $path
adalah /some/where
.
readlink
pada jalur yang dikenal dan membandingkannya dengan jalur yang Anda uji?if [ -L "$path" ]
) kecuali Anda memiliki alasan yang baik untuk tidak melakukannya dan Anda yakin Anda tahu apa yang Anda lakukan.Jawaban:
Jika Anda ingin memeriksa apakah
$path
tautan simbolis yang memiliki target/some/where
, Anda dapat menggunakanreadlink
utilitas tersebut. Ini bukan POSIX, tetapi tersedia di banyak sistem (GNU / Linux, BusyBox, * BSD, ...).Perhatikan bahwa ini adalah perbandingan teks yang tepat. Jika target tautannya adalah
/some//where
, atau jika ituwhere
dan nilainya$path
adalah/some/link
, maka teks tidak akan cocok.Banyak versi
readlink
mendukung opsi-f
, yang mengkanonik jalur dengan memperluas semua tautan simbolik.Banyak shell, termasuk dash, ksh, bash dan zsh, mendukung
-ef
operator dalamtest
builtin 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.sumber
Untuk menghindari masalah dengan jalur relatif dan absolut, dan "/" di akhir jalur atau tautan:
sumber
readlink
tampaknya tidak diperlukan,realpath
akan secara otomatis menyelesaikan tautan simbolik.