考虑以下代码:
String commandf = "ls /etc | grep release"; try { // Execute the command and wait for it to complete Process child = Runtime.getRuntime().exec(commandf); child.waitFor(); // Print the first 16 bytes of its output InputStream i = child.getInputStream(); byte[] b = new byte[16]; i.read(b, 0, b.length); System.out.println(new String(b)); } catch (IOException e) { e.printStackTrace(); System.exit(-1); }
该程序的输出为:
/etc: adduser.co
当然,当我从外壳运行时,它可以按预期工作:
poundifdef@parker:~/rabbit_test$ ls /etc | grep release lsb-release
互联网告诉我,由于管道行为不是跨平台的事实,在生产Java的Java工厂工作的才华横溢的人无法保证管道能正常工作。
我怎样才能做到这一点?
我不会使用Java构造而不是grepand 来进行所有解析sed,因为如果我想更改语言,将被迫用该语言重新编写解析代码,这完全是不行的。
调用Shell命令时,如何使Java做管道和重定向?
编写脚本,然后执行脚本而不是单独的命令。
管道是外壳的一部分,因此你还可以执行以下操作:
String[] cmd = { "/bin/sh", "-c", "ls /etc | grep release" }; Process p = Runtime.getRuntime().exec(cmd);