java - 从 Java 运行 "who -m"命令会产生空结果

标签 java linux command-line-interface

我正在尝试从 Java 查找当前登录的用户名。

Process p;
try
{
    p = Runtime.getRuntime().exec("who -m");
    p.waitFor();
    BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));

    String line = "";
    while ((line = reader.readLine()) != null)
        System.out.println(line);
}
catch (Exception e)
{

}

上面的代码没有打印任何结果。但是,如果我删除 -m 选项,它会打印用户名和其他详细信息。我还测试了其他选项,如 -s、-u。除了 -m 之外,一切都有效。有谁知道为什么会这样吗?

注意: 我知道

System.getProperty("user.name");

但这对我来说不是一个解决方案。我正在调用一个使用“who -m”的 shell 脚本。所以,我不能使用java类。

最佳答案

您所看到的原因是 Java 进程启动器不保证关联的 TTY 的存在。在实际命令行上考虑这个示例:

$ who -m
user   pts/8        2014-09-02 02:24
$ who -m </dev/null
$

由于标准输入未与第二个 who 调用的终端关联,因此 who 无法确定关联的用户。有趣的是,将 stdin 重定向到 /dev/tty 似乎也不起作用:

$ who -m </dev/tty
$

老实说,除非确定与 stdin 关联的用户正是您所追求的,否则您应该更新脚本以使用主机名以及例如id -un 或 shell 解释器可能提供的任何其他方式来确定当前用户。


对于那些对细节感兴趣的人,我对 another answer of mine 进行了更多挖掘。 .

关于java - 从 Java 运行 "who -m"命令会产生空结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26123706/

相关文章:

java - 更新的 xml 数据未在 xml 文件中更新

c - xlib 获取图标数据以在窗口上绘制

linux - 在 bash 环境中将来自另一个文件的命令插入到 gnuplot 脚本中

java - 命令行java中的MVC

linux - Unix shell 目录历史

java - 如何使我的应用程序模块化?

java - SAXParser 对最小化的 XML 文档一无所获

java - Restful Web 服务中的属性文件

c - 为什么 fwrite libc 函数比 syscall write 函数快?

windows - Windows 上是否有等效的 tail -f?