2011-06-21 207 views
0

我想運行unset DISPLAY作爲linux終端中的命令,使用Java程序。我試過使用Runtime.getRuntime().exec("unset DISPLAY");,但它不起作用。使用java程序在linux終端運行命令?

我能在這裏做什麼?

+0

hmm ..使用您最熟悉的語言編寫程序... – Thor

回答

3

你需要使用bash可執行這樣來運行它:

Runtime.getRuntime().exec("/bin/bash -c \"unset DISPLAY\""); 
+1

對於windows env也是類似的,它將是cmd而不是/ bin/bash -c – GoodSp33d

+0

但是仍然應該指出,一個簡單的'unset DISPLAY'將會在bash(或cmd或...)過程退出後不起作用,請參閱Chris的答案。 –

+0

@PaŭloEbermann:的確,env變量的任何更改只會被創建的子shell(子shell)看到。 – anubhava

6

這將無法正常工作,這裏的原因。環境變量是從父進程繼承的。小孩無法控制父母的環境。這裏是正在發生的事情在你的設置:

bash -> java -> unset 
    |   |   | 
parent  child  grand-child 
    |   |   | 
unaffected unaffected affected 

所以實際上你的命令工作,但它沒有你想讓它的效果。可悲的是,Java將無法改變父母的環境。

您的java程序可以修改自己的環境變量,並且由java衍生出來的任何孩子都會繼承這些變量。所以你可能會讓java爲你啓動一個bash shell,然後以交互方式使用這個bash shell,但是這看起來有很多開銷。

看到這個職位對如何設置Java的環境變量:
How do I set environment variables from Java?

如果你願意迴避整個Java的問題,大多數人在這種情況下做的是源的特殊文件。例如,創建一個名爲「no-x.sh」文件看起來像這樣:

# Unset the display variable 
unset DISPLAY 

,然後從當前的(交互)外殼,來源是這樣的文件:

$> source no-x.sh 

和現在你的主bash shell已經改變了它的環境。請注意,這是一個HACK(或者對於你所有的bash zealots - 一個特性),你不應該指望用其他任何東西(比如java)來複制這個功能。