2012-06-28 137 views
0

我有一個shell腳本,它有一個命令,在成功創建腳本後生成一個包含所需信息的文件。無法從java運行shell腳本

現在,當Iam直接執行該命令或從cmd行執行腳本本身時,文件正在生成。

但是當iam試圖從使用Runtime.getRuntime().exec(cmd)的java代碼執行相同的腳本時,文件沒有被生成。在該行前後的跟蹤按預期顯示,表明腳本的執行沒有拋出任何異常。

我在哪裏錯了,或者我在想什麼? Plz幫助!

例如,這是代碼IAM tryng執行

import java.io.BufferedReader; 
import java.io.InputStreamReader; 

public class Scripttest { 
public static void main(String args[]) 
{ 
     try{ 
String cmd="ls|grep sys"; 
     Process p=Runtime.getRuntime().exec(cmd); 
     System.out.println("done"); 
     final BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream())); 
     String line = null; 
     while ((line = input.readLine()) != null) 
     System.out.println("proc: " + line); 
} 
     catch(Exception e) 
     { 
       System.out.println("Exception is"+e); 
     } 
} 
} 

和輸出IAM越來越是這樣

java Scripttest 
Exception isjava.io.IOException: Cannot run program "ls|grep": error=2, No such file or directory 

是沒有得到執行的CMD,但不知道生根粉的錯誤,爲什麼它不。

+1

什麼是cmd字符串? – perreal

+0

您可以通過獲取ErrorOutputStream來查看錯誤,看看錯誤是什麼。 –

+0

'cmd'的值是什麼?你確定你已經逃脫了反斜槓等嗎? – kjp

回答

2

下面是一個例子,它有點像使用管道,腳本嵌入在這個例子中的java。

import java.io.*; 
class junk { 
public static void main (String args[]) { 
    try { 
    String line; String script; 
    OutputStream stdin = null; InputStream stderr = null; InputStream stdout = null; 
    Process p = Runtime.getRuntime().exec ("/bin/bash"); 
    stdin = p.getOutputStream(); stderr = p.getErrorStream(); stdout = p.getInputStream(); 
    script = "a=$(cat <<'@@@'\n" + 
"ICAgICBfCiAgICB8IHwgX18gX19fICAgX19fXyBfICAgIF9fXyBfXyBfIF8gX18gICAgXyBfXyBfICAg" + 
"XyBfIF9fCiBfICB8IHwvIF9gIFwgXCAvIC8gX2AgfCAgLyBfXy8gX2AgfCAnXyBcICB8ICdfX3wgfCB8" + 
"IHwgJ18gXAp8IHxffCB8IChffCB8XCBWIC8gKF98IHwgfCAoX3wgKF98IHwgfCB8IHwgfCB8ICB8IHxf" + 
"fCB8IHwgfCB8CiBcX19fLyBcX18sX3wgXF8vIFxfXyxffCAgXF9fX1xfXyxffF98IHxffCB8X3wgICBc" + 
"X18sX3xffCB8X3wKICAgICAgICAgICAgICAgICAgICBfICAgICAgICAgICAgICAgXwogICAgICAgICAg" + 
"ICAgICAgICAgfCB8X18gICBfXyBfIF9fX3wgfF9fCiAgICAgICAgICAgICAgICAgICB8ICdfIFwgLyBf" + 
"YCAvIF9ffCAnXyBcCiAgICAgICAgICAgICAgICAgICB8IHxfKSB8IChffCBcX18gXCB8IHwgfAogICAg" + 
"ICAgICAgICAgICAgICAgfF8uX18vIFxfXyxffF9fXy9ffCB8X3wK" + 
"\n" + 
"@@@)\n" + 
"st=0\n" + 
"for ((i=0; i<\"${#a}\"; i++))\n" + 
"do\n" + 
" x=${a:$i:1}\n" + 
" in=$(($(expr index \\\n" + 
" 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/' \"\\\\$x\")-1))\n" + 
" if [ $in -ge 0 ]; then case $st in\n" + 
" 0) out=$(($in<<2)); st=3;;\n" + 
" 1) out=$(($out|$in)); \n" + 
" printf \\\\$(printf '%03o' $(($out&255))) ; st=0 ;;\n" + 
" 2) out=$(($out+($in>>2))); \n" + 
" printf \\\\$(printf '%03o' $(($out&255))) ;\n" + 
" st=0; out=$(($in<<6)); st=1;;\n" + 
" *) out=$(($out+($in>>4))); \n" + 
" printf \\\\$(printf '%03o' $(($out&255))) ;\n" + 
" st=0; out=$(($in<<4)); st=2;;\n" + 
" esac fi\n" + 
"done\n"; 
    stdin.write (script.getBytes()); 
    stdin.close(); 
    BufferedReader br = new BufferedReader (new InputStreamReader (stdout)); 
    while ((line = br.readLine()) != null) { System.out.println(line); } 
    br.close(); 
    br = new BufferedReader (new InputStreamReader (stderr)); 
    while ((line = br.readLine()) != null) { System.out.println ("2>" + line); } 
    br.close(); 
    p.waitFor(); 
    System.out.println ("exit code " + p.exitValue()); 
    } 
    catch (IOException e) { e.printStackTrace(); } 
    catch (java.lang.InterruptedException e) { e.printStackTrace(); } 
} 
} 
0

將命令ls | grep sys保留在數組中,因爲它由兩個主要命令ls和grep組成。

或者

最好的辦法是使用shell腳本在Linux和批處理文件的窗口。根據您的要求使用這些命令創建一個shell腳本或批處理文件,只需從java代碼執行shell腳本或批處理文件即可。