@Caleb está en lo correcto al hacer que el script solo pruebe el enlace simbólico. Sin embargo, la parte sobre por qué se quedó fuera y tenía curiosidad. Si observa el código fuente de coreutils y ordena el resultado de la prueba, puede ver que cuando ejecuta la prueba de enlace simbólico usa lstat y si usa la prueba -f, en realidad llama 'stat' que sigue al enlace simbólico:
$ 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
Desde la página de manual de estadísticas:
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.
Esto significa que la prueba -f devolverá verdadero siempre que el nombre de archivo especificado sea un enlace simbólico a un archivo normal o un archivo normal en sí mismo.
-e
y-f
fue que-e
se usó para saber si existía un archivo (de cualquier tipo), y-f
fue específicamente para probar si el archivo existía y era un archivo normal. Parece que no he entendido lo que era un "archivo normal" ..