У меня была та же ошибка, и я решил ее, установив пакет 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.
Похоже на мой отзыв!
Тестирование с помощью -e
вернет true для не -обычных файлов, :каталогов, каналов, сокетов, устройств и т. д.
Обратите внимание, что символические ссылки являются особым случаем.-test
Обычно используется тип указанного файла -на , а не сама ссылка (, за исключением test -L
, она жеtest -h
).
В упомянутом обзоре вы можете захотеть иметь возможность чтения из FIFO. (С другой стороны, чтение из каталога )точно не сработает.
Позже в обзоре вы действительно не хотите перезаписывать устройство (, хотя вы можете захотеть записать в FIFO, так что точно -настройте в соответствии с вашими потребностями ).
Некоторые «файлы» на самом деле являются каталогами (-d
), FIFO (-p
), узлами устройств(-b
и-c
)и т. д. Они существуют, но не являются обычными файлами.
Поскольку вы используете тест, чтобы избежать создания записи каталога с уже существующим именем, не имеет значения, что это за запись (обычный файл, каталог, 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."