Saya sedang menulis skrip bash yang perlu membedakan file biasa dari symlink. Saya pikir saya bisa melakukan ini dengan ekspresi if / test, tetapi tidak berfungsi seperti yang saya harapkan:
$ touch regular_file
$ test -f regular_file; echo $?
0
$ test -h regular_file; echo $?
1
$ ln -s regular_file symlink
$ test -h symlink; echo $?
0
$ test -f symlink; echo $?
0
Mengapa demikian? Dan, bagaimana saya bisa melakukan ini dengan benar?
-e
dan-f
itu yang-e
digunakan untuk mengetahui apakah file (dari jenis apa pun) ada, dan-f
secara khusus untuk menguji apakah file tersebut ada dan merupakan file biasa. Sepertinya saya salah mengerti apa itu "file biasa" itu ..-h
untuk symlink,-p
untuk pipa bernama, dll.@ Caleb benar tentang membuat skrip hanya menguji symlink. Namun bagian tentang mengapa ditinggalkan dan saya ingin tahu. Jika Anda melihat kode sumber coreutils dan mengukur output tes Anda dapat melihat bahwa ketika Anda menjalankan tes tautan simbolik ia menggunakan lstat dan jika Anda menggunakan uji -f itu benar-benar memanggil 'stat' yang mengikuti symlink:
Dari halaman manual stat:
Ini berarti tes-f akan mengembalikan true selama nama file yang ditentukan adalah symlink ke file biasa atau file biasa itu sendiri.
sumber