@Caleb ถูกต้องเกี่ยวกับการสร้างสคริปต์เพียงทดสอบ symlink อย่างไรก็ตามส่วนที่เกี่ยวกับสาเหตุที่ถูกทิ้งและฉันก็อยากรู้ หากคุณดูซอร์สโค้ด coreutils และหยุดเอาต์พุตของการทดสอบคุณจะเห็นว่าเมื่อคุณรันการทดสอบลิงก์สัญลักษณ์มันใช้ lstat และหากคุณใช้การทดสอบ -f จะเรียกว่า 'stat' ซึ่งตามด้วย 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
จากหน้าสถิติคน:
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.
ซึ่งหมายความว่าการทดสอบ -f จะกลับเป็นจริงตราบใดที่ชื่อไฟล์ที่ระบุเป็น symlink ไปยังไฟล์ปกติหรือไฟล์ปกติเอง
-eและ-fที่-eใช้เพื่อทราบว่ามีไฟล์ (ประเภทใด ๆ ) อยู่หรือไม่และ-fเพื่อทดสอบว่าไฟล์นั้นมีอยู่และเป็นไฟล์ปกติหรือไม่ ดูเหมือนว่าฉันเข้าใจผิดว่า "ไฟล์ปกติ" คืออะไร ..