Piszę skrypt bash, który musi odróżniać zwykły plik od dowiązania symbolicznego. Myślałem, że mogę to zrobić za pomocą wyrażenia if / test, ale nie działa tak, jak się spodziewałem:
$ 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
Dlaczego? I jak mogę to właściwie zrobić?
-e
i-f
była-e
używana-f
do sprawdzenia, czy plik (dowolnego typu) istnieje, a konkretnie do sprawdzenia, czy plik istnieje i czy jest zwykłym plikiem. Wygląda na to, że źle zrozumiałem, czym był „zwykły plik”.-h
Dla dowiązań symbolicznych,-p
nazwanych potoków itp.@Caleb ma rację, jeśli skrypt ma po prostu przetestować dowiązanie symboliczne. Jednak część o tym, dlaczego została pominięta, byłam ciekawa. Jeśli spojrzysz na kod źródłowy coreutils i przejrzysz wynik testu, zobaczysz, że po uruchomieniu testu dowiązania symbolicznego używa on lstat, a jeśli używasz testu -f, to tak naprawdę wywołuje „stat”, który następuje po dowiązaniu symbolicznym:
Ze strony man statystyki:
Oznacza to, że test -f zwróci wartość true, o ile podana nazwa pliku jest dowiązaniem symbolicznym do zwykłego pliku lub samego zwykłego pliku.
źródło