J'écris un script bash qui doit distinguer un fichier normal d'un lien symbolique. Je pensais que je pouvais le faire avec l'expression if / test, mais cela ne fonctionne pas comme je m'y attendais:
$ 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
Pourquoi donc? Et, comment puis-je le faire correctement?
-e
et-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".-h
pour les liens symboliques,-p
pour les canaux nommés, etc.@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:
Depuis la page de manuel de stat:
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.
la source