UWIN이 설치된 Windows 10에서 perl64를 사용하고 있습니다.
나는 이름을 입력하여 ksh에서 호출할 때와 현재 디렉토리에 있을 때 잘 실행되는 Perl 스크립트 sv2jb.pl을 작성했습니다.
그런 다음 홈 디렉토리에 "scripts"라는 하위 디렉토리를 만들고 스크립트를 그곳으로 이동한 다음 ksh의 $PATH 환경에 전체 경로를 추가했습니다. 이제 이 스크립트가 있는 다른 디렉토리에서 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에 익숙하지 않지만 Windows 위에서 실행되는 라이브러리 계층을 제공한다는 점에서 cygwin과 유사하다고 가정합니다.
스크립트를 호출하면 프로그램 로더에 의해 열린 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의 경우 Windows 패키지 대신 Perl 패키지를 사용하는 것이 좋습니다. 이것이 UWIN에 가능한 솔루션인지 모르겠습니다.
그렇지 않으면 Windows Perl을 호출할 수 있지만 Windows 스타일 경로를 스크립트에 명시적으로 전달해야 합니다.