Estoy escribiendo un script bash que necesita distinguir un archivo normal de un enlace simbólico. Pensé que podría hacer esto con la expresión if / test, pero no funciona como esperaba:
$ 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
¿Porqué es eso? Y, ¿cómo puedo hacer esto correctamente?
-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" ..-h
enlaces simbólicos,-p
canalizaciones con nombre, etc.@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:
Desde la página de manual de estadísticas:
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.
fuente