Perl& #Оператор проверки файла 39;s -f возвращает true для символических ссылок

Раньше я думал, что -fпроверяет файл, чтобы убедиться, что это обычный файл, а не что-то еще. Но Perl, кажется, ведет себя по-другому. Я просмотрел запись perldoc , и там написано:

-f  File is a plain file.

Предположим, у меня есть каталог с одним файлом с именем file1и 5 символическими ссылками 1 2 3 4 5, каждая из которых указывает на file1, например поэтому:

-rw-r--r-- file1
lrwxrwxrwx 1 -> file1
lrwxrwxrwx 2 -> file1
lrwxrwxrwx 3 -> file1
lrwxrwxrwx 4 -> file1
lrwxrwxrwx 5 -> file1
drwxr-xr-x../
drwxr-xr-x./

Если я запускаю find в этом каталоге с помощью фильтра -type f, он выдает результат, как и ожидалось:

%  find. -type f
./file1

Но когда я запускаю сценарий perl с помощью оператора -f, он дает следующий вывод:

%  ls | perl -e 'while(<>) { chomp; print "$_\n" if -f $_ }'
1
2
3
4
5
file1

Когда я добавляю тест -lтоже работает, как и ожидалось:

%  ls | perl -e 'while(<>) { chomp; print "$_\n" if -f $_ and not -l $_}'
file1

Считаются ли символические ссылки простыми файлами? Если да, то почему? Является ли мое использование файла test неправильным?

17
задан Greg Bacon 25 April 2012 в 16:03
поделиться