@Caleb правильно стосується того, щоб зробити сценарій просто тестом на симпосилання. Однак частина про те, чому залишилась поза межами, і мені було цікаво. Якщо ви подивитеся на вихідний код coreutils і прострочите вихід тесту, то ви побачите, що при запуску тестування символічної посилання він використовує lstat, а якщо ви використовуєте тест -f, він насправді викликає 'stat', який слідує за символьним посиланням:
$ 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 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.
Це означає, що тест -f повернеться істинним, доки вказане ім'я файлу є символьним посиланням на звичайний файл або сам звичайний файл.
-e
і в-f
тому, що-e
було використано для того, щоб знати, чи існує файл (будь-якого типу), і-f
спеціально для перевірки, чи існує файл і чи є звичайним файлом. Здається, я неправильно зрозумів, що таке "звичайний файл" ..