
Estou usando perl64 no Windows 10 com UWIN instalado.
Eu escrevi um script perl, sv2jb.pl, que funciona bem quando invocado no ksh apenas digitando seu nome e quando está no diretório atual.
Em seguida, criei um subdiretório do meu diretório inicial chamado "scripts", movi esse script para lá e adicionei seu caminho completo ao ambiente $PATH do ksh. Agora, quando eu invoco sv2jb.pl de qualquer outro diretório que não seja onde este script está (apenas digitando o nome do script), esta é a mensagem que recebo de volta:
$ sv2jb.pl
Can't open perl script "//C/users/me/desktop/scripts/sv2jb.pl" : No such file or directory
Mas é exatamente aqui que esse arquivo está ...
Se eu invocá-lo a partir do diretório inicial (no qual está o diretório de scripts):
$ scripts/sv2jb.pl
Funciona bem...
Além disso, se eu fizer cd para esse diretório e invocar sv2jb.pl:
$ cd scripts
$ sv2jb.pl
ele funciona corretamente.
Não consigo entender o que está errado:
- O script em si está OK, pois quando invocado de seu diretório ele é executado. Para sua informação, sua primeira linha é: #!//c/perl64/bin/perl.exe
- A variável $PATH está OK, pois a mensagem de erro mostra que ksh localizou o arquivo (ao mesmo tempo em que diz que não consegue encontrá-lo).
Responder1
Não estou familiarizado com o UWIN, mas presumo que seja semelhante ao cygwin, pois fornece uma camada de biblioteca para ser executada no Windows.
Quando você invoca o script, ele é encontrado no PATH, aberto pelo carregador de programa, examinado para encontrar o #! linha, o binário executável é encontrado e executado em exec(), com o nome do script passado como o primeiro argumento.
O problema é que o binário é consistente com o ActiveState perl, um aplicativo do Windows.
Eu suspeito que quando o script está no diretório atual, o perl é executado com o nome do script passado como um programa relativo (algo como perl sv2jb.jpl
). Mas quando está em outro lugar, um nome de caminho completo é fornecido (algo como perl //C/users/me/desktop/scripts/sv2jb.pl
).
Mas o binário do Windows não entende o caminho que está sendo passado para ele. Você pode ver isso invocando-o diretamente no prompt de comando do Windows. Você deverá ver isso acontecer:
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....]
Posso reproduzir o mesmo comportamento com cygwin/Win10 e ActiveState Perl.
Basicamente, definir um binário do Windows como executável para um script unix apresenta problemas estranhos. Com o cygwin, sugiro que você use o pacote perl em vez do pacote windows. Não sei se essa é uma solução possível para o UWIN.
Caso contrário, você pode chamar o perl do Windows, mas deve passar explicitamente um caminho no estilo do Windows para o script.