2012-10-10 98 views
0

我想從運行Java代碼的shell腳本從Java代碼運行shell腳本:語法錯誤: 「(」 意外

Shell腳本:

 function print() { 
      echo "First Script" 
     } 
     print 
     echo "Hello" 

Java代碼:

 final String cmd = "sh test.sh"; 
     final Process p = Runtime.getRuntime().exec(cmd); 
     InputStream is = p.getInputStream(); 
     InputStreamReader isr = new InputStreamReader(is); 
     BufferedReader br = new BufferedReader(isr); 
     String line; 
     while ((line = br.readLine()) != null) { 
      System.out.println(line); 
     } 

     is = p.getErrorStream(); 
     isr = new InputStreamReader(is); 
     br = new BufferedReader(isr); 
     while ((line = br.readLine()) != null) { 
      System.out.println(line); 
     } 

但是當我運行上面的代碼中,我得到這個錯誤test.sh: 1: Syntax error: "(" unexpected

相同的代碼工作正常時,我嘗試了一個命令行,我能夠看到輸出。我也試過dos2unix並運行java代碼,但仍然沒有運氣。任何形式的幫助將非常感激。

+0

腳本中的shebang在哪裏? – Anders

+0

@Anders:將腳本傳遞給'sh'作爲參數時,shebang被忽略。 –

+0

@larsmans Yupp我知道,我只是讀了這個問題馬虎。 – Anders

回答

3

如果您使用bash運行它,它將起作用。

我會(也)以#!/bin/bash開始腳本。這種方式腳本本身決定了它將使用哪個shell,而不是依賴誰來調用它。如下所述,您仍然可以使用任何腳本編寫過程調用腳本,但是會突出顯示正在使用哪種腳本語言/方言。

還請注意the issues surrounding invoking processes from Java and collecting stdout/sterr

+0

建議的第二部分是虛假的。如果使用明確的'sh script.sh'運行腳本,那麼shebang將被忽略。當執行一個標記爲可執行文件的文本文件('chmod + x')時,shebang僅由內核解釋。 –

+0

我不認爲這是假的。我的觀點是提供#!意味着你不需要*使用特定的shell來調用。我明白你可以提供腳本作爲任何shell進程的參數。我會修改答案更清楚,但是 –

+1

好吧,夠公平的。 –

1

最有可能的是,在您的系統上,/bin/sh是POSIX兼容shell而非Bash(在Ubuntu和Debian以及大多數商業版本中都是如此)。在POSIX shells,不使用function關鍵字:

print() { 
    echo "First Script" 
} 
print 
echo "Hello" 

應該工作。 (並且該表單也適用於Bash。)

-2

驗證您的Java版本與您的操作系統匹配。 它可能是您的操作系統是32b和Java是64版本。

+0

儘管您的答案可能會解決問題,但如果您可以提供問題描述以及您的答案如何解決問題,那將會更好。這是一個進一步改善這個和未來答案的建議。 –

相關問題