Bei @Caleb ist es richtig, das Skript nur auf den Symlink testen zu lassen. Der Teil über das Warum wurde jedoch ausgelassen und ich war neugierig. Wenn Sie sich den Quellcode von coreutils ansehen und die Ausgabe von test verfolgen, können Sie feststellen, dass beim Ausführen des Symbolic Link-Tests lstat verwendet wird und wenn Sie den -f-Test verwenden, wird tatsächlich 'stat' aufgerufen, der auf den Symlink folgt:
$ 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
Von der Stat Manpage:
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.
Dies bedeutet, dass der Test -f true zurückgibt, solange der angegebene Dateiname ein Symlink zu einer regulären Datei oder einer regulären Datei selbst ist.
-e
und-f
wurde das-e
verwendet wurde , um zu wissen , ob eine Datei (jeglicher Art) bestand, und-f
war speziell zu testen , ob die Datei eine reguläre Datei existiert und war. Es scheint, ich habe falsch verstanden, was eine "normale Datei" war ..