Ich schreibe ein Bash-Skript, das eine reguläre Datei von einem Symlink unterscheiden muss. Ich dachte, ich könnte das mit if / test machen, aber es funktioniert nicht so, wie ich es erwartet hatte:
$ touch regular_file
$ test -f regular_file; echo $?
0
$ test -h regular_file; echo $?
1
$ ln -s regular_file symlink
$ test -h symlink; echo $?
0
$ test -f symlink; echo $?
0
Warum das? Und wie kann ich das richtig machen?
-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 ..-h
dateitypspezifischen Test durchführen, z. B. für Symlinks, Named-p
Pipes usw.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:
Von der Stat Manpage:
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.
quelle