我正在尝试在 java 程序中打印我的 mac [编辑:Apple 计算机] 序列号。我熟悉 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 中是否有类似于 python 的 Popen(command, stdout=PIPE, shell=True)
中的参数 shell = True
的东西,这将允许我传递整个命令字符串?
最佳答案
我看到两种可能性:
使用比方说 Scanner 解析
ioreg -l
的输出.将命令包装在 shell 脚本中并
exec()
它:
#!/bin/sh ioreg -l | awk '/IOPlatformSerialNumber/ { print $4;}'
Addendum: As an example of using ProcessBuilder
, and incorporating a helpful suggestion by Paul Cager, here's a third alternative:
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();
}
}
}
关于java - 使用 Unix 命令在 java 中打印我的 Mac 的序列号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5740390/