簡體   English   中英

從Java / Groovy運行復合Shell命令

[英]Run a compound shell command from Java/Groovy

我在嘗試從Groovy腳本運行復合shell命令時遇到了麻煩。 這是用“ &&”分隔的命令之一,因此如果第一個命令失敗,則第二個命令將永遠不會運行。 無論出於什么原因,我都無法正常工作。 我正在使用:

println "custom-cmd -a https://someurl/path && other-cmd -f parameter".execute([], new File('/some/dir')).text

Shell不斷誤解命令拋出的錯誤,例如“ custom-cmd -f無效選項”。這就像忽略了兩者之間的“ &&”一樣。 我也嘗試使用分號,但並不幸運。 我嘗試使用直接Java API Runtime.getRuntime()。exec()並將命令拆分為一個數組。 我嘗試將命令包裝在單引號中,並將其提供給'/ bin / sh -c',但沒有任何效果。

如何從Java運行復合Shell命令? 我知道我過去曾經做過,但是今天我無法弄清楚。

使用groovy,execute的列表形式應該可以工作:

def out = ['bash', '-c', "custom-cmd -a https://someurl/path && other-cmd -f parameter"].execute([], new File('/some/dir')).text

當然,您可能要在進程上使用consumeProcessOutput方法,就像輸出太大一樣,調用文本可能會阻塞

嘗試類似:

Runtime.getRuntime().exec("cmd /c \\"start somefile.bat && start other.bat && cd C:\\\\test && test.exe\\"");

可以使用Runtime.getRuntime().exec()而不將命令拆分為一個數組。

參見https://stackoverflow.com/a/18867097/1410671

編輯:

您是否嘗試過使用ProcessBuilder 這似乎可以在我的OSX機器上使用:

public static void main(String[] args) throws IOException {
    ProcessBuilder builder = new ProcessBuilder( "/bin/sh", "-c", "echo '123' && ls" );

    Process p=null;
    try {
        p = builder.start();
    }
    catch (IOException e) {
        System.out.println(e);
    }


    Scanner s = new Scanner( p.getInputStream() );
    while (s.hasNext())
    {
        System.out.println( s.next() );
    }
    s.close();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM