@ 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:
$ ln -s varnish_config XXX
$ strace -s 2000 test -L XXX 2>&1 | grep XXX
execve("/usr/bin/test", ["test", "-L", "XXX"], [/* 47 vars */]) = 0
lstat("XXX", {st_mode=S_IFLNK|0777, st_size=14, ...}) = 0
$ strace -s 2000 test -L varnish_config 2>&1 | grep varnish
execve("/usr/bin/test", ["test", "-L", "varnish_config"], [/* 47 vars */]) = 0
lstat("varnish_config", {st_mode=S_IFREG|0664, st_size=1046, ...}) = 0
$ strace -s 2000 test -f XXX 2>&1 | grep XXX
execve("/usr/bin/test", ["test", "-f", "XXX"], [/* 47 vars */]) = 0
stat("XXX", {st_mode=S_IFREG|0664, st_size=1046, ...}) = 0
Dari halaman manual stat:
stat() stats the file pointed to by path and fills in buf.
lstat() is identical to stat(), except that if path is a symbolic link,
then the link itself is stat-ed, not the file that it refers to.
Ini berarti tes-f akan mengembalikan true selama nama file yang ditentukan adalah symlink ke file biasa atau file biasa itu sendiri.
-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 ..