2012-10-12 17 views
0

我想讓我的Java程序在幾個基於Unix的系統上運行命令echo "text" > /home/maxbester/test.txtJava - exec的行爲不像shell

我的代碼如下所示:

private static final Logger LOG = Logger.getLogger(MyClass.class); 
public String run(String cmd) { 
    String res = null; 
    InputStream is = null; 
    try { 
     final Runtime rt = Runtime.getRuntime(); 
     final Process p = rt.exec(cmd); 
     int exitStatus = -1; 
     try { 
      exitStatus = p.waitFor(); 
     } catch (InterruptedException e) { 
      L0G.error(e.getMessage(), e); 
     } 
     is = p.getInputStream(); 

     if (exitStatus == 0) { 
      if (is != null && is.available() > 0) { 
       StringWriter stringWriter = new StringWriter(); 
       IOUtils.copy(is, stringWriter); 
       res = stringWriter.toString(); 
      } else { 
       L0G.error("InputStream is not available!"); 
      } 
     } 
    } catch (SecurityException e) { 
     L0G.error(e.getMessage(), e); 
    } catch (IOException e) { 
     L0G.error(e.getMessage(), e); 
    } 
    return res; 
} 

在CMD等於echo "text" > /home/maxbester/test.txt和文件test.txt存在,資源包含"text" > /home/maxbester/test.txt(而不是echo "text" > /home/maxbester/test.txt,該呼應 disapeared)和test.txt的是空的。但是,出口值是0(所以它應該正常工作)。

我手動運行echo "text" > /home/maxbester/test.txt。什麼都沒有返回,退出值也是0.

那麼exec命令出了什麼問題?

回答

0

如果要使用Java將文本寫入文件,則應該查看FileWriter,而不是依賴諸如流重定向之類的特定於shell的詳細信息。

+0

事實是,在某種模式下,程序使用JSch在遠程機器上完成工作。所以我只能使用'setCommand'方法來完成這項工作。我想有一個類似的行爲。 – Maxbester

0

如果您希望exec的行爲像一個shell,您必須調用一個shell。例如。

String shell = System.getEnv("SHELL"); 
cmd = shell + " -c \"echo test > /home/maxbester/test\""; 

您的測試不讀取stderr。也許那裏有一些有趣的事情。

+0

我的程序必須能夠在HP-UX系統上運行,並且bash不存在。是的,我將更新我的示例以閱讀stderr。 – Maxbester

+0

如果你的目標平臺支持java,你應該像@Peter所說的那樣使用FileWriter。 – assafmo

+1

更新了答案。不要忘記,所有的shell都必須支持-c選項,echo,重定向等。我必須同意其他人使用FileWriter。事實上,你可能想在遠程系統上做類似的事情似乎沒有關係,因爲你將使用jsch而不是rt.exec。無論你做什麼,它都會有所不同。 –