java - 使用 Unix 命令在 java 中打印我的 Mac 的序列号

标签 java macos unix io

我正在尝试在 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 的东西,这将允许我传递整个命令字符串?

最佳答案

我看到两种可能性:

  1. 使用比方说 Scanner 解析 ioreg -l 的输出.

  2. 将命令包装在 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/

相关文章:

java - 有效地生长原子阵列

java - H2 - 使用索引号更新每行(0,1,2,3,..)

python - 玩弄 py2app

python - 收到 ValueError : Unknown level when running GoogleScraper

linux - 如何根据上一个命令比较得到下一个输入命令[bash-script]

java - 具有优化空间的最不常见子序列(两列,因为它是马尔可夫)

linux - VirtualBox guest 无法解析主机名,但 git 可以

c - 查找针对其生成核心转储的可执行文件

macos - 从 sed 中提取多个捕获组到变量

java - 创建没有嵌套循环的特定模式