@Caleb a raison de faire en sorte que le script teste simplement le lien symbolique. Cependant, la partie sur pourquoi a été laissée de côté et j'étais curieux. Si vous regardez le code source de coreutils et étirez la sortie de test, vous pouvez voir que lorsque vous exécutez le test de lien symbolique, il utilise lstat et si vous utilisez le test -f, il appelle en fait 'stat' qui suit le lien symbolique:
$ 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
Depuis la page de manuel de 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.
Cela signifie que le test -f retournera vrai tant que le nom de fichier spécifié est un lien symbolique vers un fichier normal ou un fichier normal lui-même.
-eet-fétait celle qui-eétait utilisée pour savoir si un fichier (de tout type) existait, et-fétait spécifiquement pour tester si le fichier existait et était un fichier normal. Il semble que j'ai mal compris ce qu'était un "fichier ordinaire".