我正在尝试在Java程序中打印我的mac的[edit:Apple computer]序列号。我熟悉Unix命令
ioreg -l | awk '/IOPlatformSerialNumber/ { print $4;}'
在终端中完成此任务。 当我尝试
String command = "ioreg -l | awk '/IOPlatformSerialNumber/ { print $4; }'" Runtime terminal = Runtime.getRuntime(); String input = new BufferedReader( new InputStreamReader( terminal.exec(commands).getInputStream())).readLine(); System.out.println(new BufferedReader( new InputStreamReader( terminal.exec(command, args).getInputStream())).readLine());
我的序列号未打印。而是打印:
<+-o Root class IORegistryEntry, id 0x100000100, retain 10>
我认为问题是这terminal.exec()并不意味着要使用整个命令字符串。Java中是否有类似于shell = Truepython中的参数的东西Popen(command, stdout=PIPE, shell=True),可以让我传递整个命令字符串?
terminal.exec()
Popen(command, stdout=PIPE, shell=True)
我看到两种可能性:
解析ioreg -l使用Scanner的输出。
ioreg -l
将命令包装在shell脚本中,exec()然后执行以下操作:
exec()
#!/ bin / sh ioreg -l | awk'/ IOPlatformSerialNumber / {打印$ 4;}'
附录:作为使用的示例ProcessBuilder,并结合了Paul Cager的有用建议,这是第三个替代方法:
ProcessBuilder
import java.io.BufferedReader; import java.io.InputStreamReader; public class PBTest { public static void main(String[] args) { ProcessBuilder pb = new ProcessBuilder("bash", "-c", "ioreg -l | awk '/IOPlatformSerialNumber/ { print $4;}'"); pb.redirectErrorStream(true); try { Process p = pb.start(); String s; // read from the process's combined stdout & stderr BufferedReader stdout = new BufferedReader( new InputStreamReader(p.getInputStream())); while ((s = stdout.readLine()) != null) { System.out.println(s); } System.out.println("Exit value: " + p.waitFor()); p.getInputStream().close(); p.getOutputStream().close(); p.getErrorStream().close(); } catch (Exception ex) { ex.printStackTrace(); } }
}