我在尋找到一個最有效的方式來決定:Java,Runtime.exe或ProcessBuilder:如何知道文件是shell還是binary?
- 我應該preprend與外殼可執行
- 如果是用戶提供的命令行,將在該可執行文件是什麼呢? (/ bin/sh?/ usr/bin/perl?/ usr/bin/ksh?c:/../ cmd.exe?)
已知要從Java啓動shell腳本應該啓動所述殼來代替:
ProcessBuilder pb = new ProcessBuilder("/bin/sh", "script.sh", "arg1", "arg2);
要啓動一個二進制應該開始二進制本身:如果二進制與殼執行
ProcessBuilder pb = new ProcessBuilder("/path/binary", "arg1", "arg2);
,它產生一個錯誤:
ProcessBuilder pb = new ProcessBuilder("/bin/sh", "/path/binary", "arg1", "arg2);
(sh: cannot execute binary file)
如果一個shell腳本沒有外殼的二進制執行,它會產生一個錯誤:
ProcessBuilder pb = new ProcessBuilder("script.sh", "arg1", "arg2);
(error 2: file not found)
我的情況是在我的應用程序不知道是什麼開始,二進制或腳本。
已啓動的應用程序是由最終用戶提供的事件處理程序。它很可能是在Unix下執行的shell腳本;但它可以是Windows下的* .cmd,或者是在某個不太明確的平臺下執行的Perl腳本。畢竟它是Java。
我第一次天真的嘗試是用shell啓動命令行,看看它是否有效。如果不是,請嘗試將其作爲二進制文件執行。
這是醜陋而危險的:在平臺和shell的某些未知組合下,第二次運行可能仍會執行第二次腳本,結果不可預知。
另外,我無法分辨何時腳本開始正常,並且由於某些問題而導致它無法啓動,當我無法啓動它時。
現在我考慮的最好的事情是:
- 讀了劇本,並尋找任何不可打印的字節
- 如果找到了,認爲這是一個二進制
- 如果沒有,添加/箱/ sh(或cmd.exe如果在Windows下)
請告知,如果你有任何更好的想法。
UPDATE /部分解決
謝謝大家誰與我分享他們的想法。
事實證明,我都弄得自己和
預先設置應在用戶輸入的命令行之前提供二進制不要求上網:)其餘:
- 腳本在PATH
- (對於Unix)的腳本是可執行的
- (對於Unix)的腳本有#!/路徑/到/解釋
當我測試我的代碼時,這些條件中的一個或另一個沒有遇到。 :-(
後從臨時腳本已被執行認真執行測試。
點3只可以由用戶來完成,並已對用戶手冊中加以記錄。
由於這些腳本傳播到目標系統的方式,它們可能不可執行,並且可能不在PATH中。
我關心的唯一路徑是相對路徑,所以它足以將./添加到任何相對路徑。
Making th在Unix(以及任何其他平臺)下可執行的腳本是一個更大的挑戰。這不是WORA。將/ bin/sh放在它的前面可能會有所幫助,但如果我在Solaris下記住,shell不會執行不可執行的腳本。
本週晚些時候我會發布另一個更新。
你的shell腳本是否在頂部有一個合適的shebang行('#!')?如果是這樣,那麼你可以簡單地讓內核運行它(只要它是'+ x'可執行文件),而不用擔心它可能需要哪個命令解釋器。 – 2012-01-09 05:25:32
我不知道。該腳本來自最終用戶,不隨軟件提供。 – 2012-01-09 05:26:55