2012-01-22 59 views
5

我想從shell腳本調用我的linux可執行文件。在調用這個可執行文件之前,我想用特定的值來設置LD_LIBRARY_PATH。我的外殼腳本是如下:無法爲Java進程設置LD_LIBRARY_PATH

Parent.sh(包含2條線)

- source set_env.sh 
    - executable.so 

Set_env.sh

- setenv LD_LIBRARY_PATH /proj/something 

在從Linux控制檯,可執行手動執行Parent.sh素文字。所以正確調用LD_LIBRARY_PATH。但是,它集成室內用Java代碼後:

String[] commandArray ={"Parent.sh"}; 
Runtime runtime = Runtime.getRuntime(); 
Process javap = runtime.exec(commandArray); 
javap.waitFor(); 

LD_LIBRARY_PATH沒有設置executable.so

我希望說明清楚:)

請讓知道什麼是錯的代碼。

+0

非常感謝親愛的好問題+ 1vote –

回答

16

沙丘答案解決了您的問題,但我強烈建議在這種特殊情況下使用不同的方法。您不應該依賴shell來設置環境參數,而應該在Java代碼中執行此操作。這樣您就不需要知道系統上存在哪些shell以及它們的語言是什麼,它只能在所有平臺上運行。

爲此,您可以使用Runtime.exec(String[] cmd, String[] environment)過載(javadoc)。作爲第二個參數,您可以傳遞包含子進程將看到的所有環境變量的數組。

一點點更好,甚至是ProcessBuilder API:

ProcessBuilder pb = new ProcessBuilder("executable.so"); 
Map<String, String> env = pb.environment(); 
env.put("LD_LIBRARY_PATH", "/proj/something"); 
Process javap = pb.start(); 
javap.waitFor(); 

這樣,子進程將繼承Java進程的所有環境變量,另外有LD_LIBRARY_PATH變量集。

+0

爲LD_LIBRARY_PATH添加了環境數組並且工作正常。現在我完全不依賴shell解釋器。感謝Dune和Philipp爲您提供了寶貴的答案,這些答案在調試過程中花費了大約6-7個小時,但無法實現。 –

+0

非常感謝親愛的+1爲好的答案 –

1

你確定子進程正在使用csh嗎?如果它使用bash或其他東西啓動,那麼這將阻止腳本工作(但不會拋出IOException)。

你應該真的在你的腳本的第一行添加一個hashbang行來說明你希望使用哪個shell解釋器。

例如。

#!/usr/bin/env csh 
+0

非常感謝......它在第一槍時很有效......令人驚歎!是的,目前我正在測試csh。您可以讓我知道如何在運行時檢查當前正在運行的lunux中的可用shell解釋器,以便在運行時修改此.sh文件。 –