Разъяснение различий и использования test -f vs test -e в сценарии оболочки

У меня была та же ошибка, и я решил ее, установив пакет perl-cgi

$ sudo pacman -S perl-cgi

Nb, я отладил это, запустив сбойный скрипт напрямую, то есть

$ cd /usr/share/gitweb/ 
$ ./gitweb.cgi
Can't locate CGI.pm in @INC (you may need to install the CGI module)(@INC contains: /usr/lib/perl5/site_perl /usr/share/perl5/site_perl /usr/lib/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib/perl5/core_perl /usr/share/perl5/core_perl .) at ./gitweb.cgi line 13.
BEGIN failed--compilation aborted at ./gitweb.cgi line 13.
4
20.06.2018, 07:34
3 ответа

Похоже на мой отзыв!

Тестирование с помощью -eвернет true для не -обычных файлов, :каталогов, каналов, сокетов, устройств и т. д.

Обратите внимание, что символические ссылки являются особым случаем.-testОбычно используется тип указанного файла -на , а не сама ссылка (, за исключением test -L, она жеtest -h).

В упомянутом обзоре вы можете захотеть иметь возможность чтения из FIFO. (С другой стороны, чтение из каталога )точно не сработает.

Позже в обзоре вы действительно не хотите перезаписывать устройство (, хотя вы можете захотеть записать в FIFO, так что точно -настройте в соответствии с вашими потребностями ).

4
27.01.2020, 20:46

Некоторые «файлы» на самом деле являются каталогами (-d), FIFO (-p), узлами устройств(-bи-c)и т. д. Они существуют, но не являются обычными файлами.

9
27.01.2020, 20:46

Поскольку вы используете тест, чтобы избежать создания записи каталога с уже существующим именем, не имеет значения, что это за запись (обычный файл, каталог, FIFO, узел устройства или другое )только то, что она уже существует и не может быть создан (, так как имя уже используется ).

Тест -fобнаруживает только «обычные файлы». -eобнаруживают некоторые другие типы.

Это ближе к вашим намерениям:

[ -e "$output_filename" ] && 
    print_error_and_exit 6 "Destination file name exists."

Однако -eне обнаруживает ссылки. Вам нужно использовать эту конструкцию:

[ -e "$output_filename" ] || [ -L "$output_filename" ] && 
    print_error_and_exit 6 "Destination file name exists."
3
27.01.2020, 20:46

Теги

Похожие вопросы