
我在安裝了 UWIN 的 Windows 10 上使用 perl64。
我編寫了一個 Perl 腳本 sv2jb.pl,當在 ksh 下透過鍵入其名稱來呼叫該腳本時,以及當它位於當前目錄中時,該腳本運行良好。
然後,我在主目錄中建立了一個名為「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
效果很好...
另外,如果我 cd 到該目錄,並呼叫 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 樣式路徑傳遞給腳本。