Script Perl não encontrado quando executado em um diretório diferente do atual

Script Perl não encontrado quando executado em um diretório diferente do atual

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:

  1. 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
  2. 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.

informação relacionada