tangguo

使用Unix命令在Java中打印Mac的序列号

java

我正在尝试在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),可以让我传递整个命令字符串?


阅读 383

收藏
2020-10-16

共1个答案

小编典典

我看到两种可能性:

  1. 解析ioreg -l使用Scanner的输出。

  2. 将命令包装在shell脚本中,exec()然后执行以下操作:

#!/ bin / sh
ioreg -l | awk'/ IOPlatformSerialNumber / {打印$ 4;}'

附录:作为使用的示例ProcessBuilder,并结合了Paul Cager的有用建议,这是第三个替代方法:

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();
        }
    }

}

2020-10-16