
Estoy usando perl64 en Windows 10 con UWIN instalado.
Escribí un script en Perl, sv2jb.pl, que funciona bien cuando se invoca bajo ksh simplemente escribiendo su nombre y cuando está en el directorio actual.
Luego creé un subdirectorio de mi directorio de inicio llamado "scripts", moví ese script allí y agregué su ruta completa al entorno $PATH de ksh. Ahora, cuando invoco sv2jb.pl desde cualquier otro directorio que no sea donde está este script (simplemente escribiendo el nombre del script), este es el mensaje que recibo:
$ sv2jb.pl
Can't open perl script "//C/users/me/desktop/scripts/sv2jb.pl" : No such file or directory
Pero aquí es exactamente donde está ese archivo...
Si lo invoco desde el directorio de inicio (en el que está el directorio de scripts):
$ scripts/sv2jb.pl
funciona bien...
Además, si accedo a ese directorio e invoco sv2jb.pl:
$ cd scripts
$ sv2jb.pl
funciona correctamente.
No puedo entender qué está mal:
- El script en sí está bien, ya que cuando se invoca desde su directorio se ejecuta. Para su información, su primera línea es: #!//c/perl64/bin/perl.exe
- La variable $PATH está bien, ya que el mensaje de error muestra que ksh localizó el archivo (aunque dice que no puede encontrarlo).
Respuesta1
No estoy familiarizado con UWIN, pero asumiré que es similar a cygwin en el sentido de que proporciona una capa de biblioteca para ejecutar sobre Windows.
Cuando invoca el script, se encuentra en la RUTA, lo abre el cargador del programa y lo examina para encontrar el código #! línea, el binario ejecutable se encuentra y se ejecuta(), con el nombre del script pasado como primer argumento.
El problema es que el binario es consistente con ser ActiveState perl, una aplicación de Windows.
Sospecho que cuando el script está en el directorio actual, Perl se ejecuta con el nombre del script pasado como un programa relativo (algo así perl sv2jb.jpl
). Pero cuando está en otro lugar, se proporciona una ruta de acceso completa (algo así como perl //C/users/me/desktop/scripts/sv2jb.pl
).
Pero el binario de Windows no comprende la ruta que se le pasa. Puede ver esto invocándolo directamente desde el símbolo del sistema de Windows. Deberías ver que esto suceda:
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....]
Puedo reproducir el mismo comportamiento con cygwin/Win10 y ActiveState Perl.
Básicamente, configurar un binario de Windows como ejecutable para un script de Unix tiene problemas extraños. Con cygwin, te sugiero que uses el paquete perl en lugar del de Windows. No sé si esa es una posible solución para UWIN.
De lo contrario, puede llamar a Windows Perl, pero debe pasar explícitamente una ruta de estilo Windows al script.