
Я использую perl64 на Windows 10 с установленным UWIN.
Я написал скрипт perl, sv2jb.pl, который прекрасно работает, если его вызвать из ksh, просто введя его имя, и если он находится в текущем каталоге.
Затем я создал подкаталог в своем домашнем каталоге под названием "scripts", переместил туда этот скрипт, добавил его полный путь в окружение $PATH ksh. Теперь, когда я вызываю sv2jb.pl из любого другого каталога, кроме того, где находится этот скрипт (просто введя имя скрипта), я получаю следующее сообщение:
$ sv2jb.pl
Can't open perl script "//C/users/me/desktop/scripts/sv2jb.pl" : No such file or directory
Но именно здесь и находится этот файл...
Если я вызову его из домашнего каталога (в котором находится каталог скриптов):
$ scripts/sv2jb.pl
работает отлично...
Кроме того, если я перейду в этот каталог и вызову sv2jb.pl:
$ cd scripts
$ sv2jb.pl
он работает правильно.
Я не могу понять, в чем дело:
- Сам скрипт в порядке, так как при вызове из его каталога он запускается. К вашему сведению, его первая строка: #!//c/perl64/bin/perl.exe
- Переменная $PATH в порядке, поскольку сообщение об ошибке показывает, что ksh обнаружил файл (хотя и сообщает, что не может его найти).
решение1
Не знаком с UWIN, но предполагаю, что он похож на cygwin в том, что предоставляет библиотечный слой для работы поверх Windows.
При вызове скрипта он находится в PATH, открывается загрузчиком программ, проверяется на наличие строки #!, исполняемый двоичный файл находится и запускается с помощью exec(), при этом имя скрипта передается в качестве первого аргумента.
Проблема в том, что двоичный файл соответствует ActiveState perl, приложению Windows.
Я подозреваю, что когда скрипт находится в текущем каталоге, perl запускается с именем скрипта, переданным как относительная программа (что-то вроде perl sv2jb.jpl
). Но когда он находится в другом месте, указывается полный путь (что-то вроде perl //C/users/me/desktop/scripts/sv2jb.pl
).
Но двоичный файл Windows не понимает путь, который ему передается. Вы можете увидеть это, вызвав его напрямую из командной строки Windows. Вы должны увидеть следующее:
C:\Perl64\bin>perl //C/users/me/desktop/scripts/sv2jb.pl # what is running
Can't open perl script "//C/users/me/desktop/scripts/sv2jb.pl
C:\Perl64\bin>perl C:/users/me/desktop/scripts/sv2jb.pl # Changed to windows-style filepath
[...program runs....]
Я могу воспроизвести то же самое поведение с cygwin/Win10 и ActiveState Perl.
В принципе, установка двоичного файла windows в качестве исполняемого файла для скрипта unix имеет странные проблемы. С cygwin я бы предложил вам использовать пакет perl вместо пакета windows. Я не знаю, возможно ли это решение для UWIN.
В противном случае вы можете вызвать Windows Perl, но вам необходимо явно указать путь к скрипту в стиле Windows.