我通过以下简单代码发现了下一个问题:

let () =
    print_endline "Hello";
    print_endline (Unix.getlogin ())


在正常情况下运行,使用./a.out可以得到:

Hello
ricardo


但是像./a.out </dev/null那样运行会使Unix.getlogin失败:

Hello
Fatal error: exception Unix.Unix_error(20, "getlogin", "")


知道为什么会这样吗?

最佳答案

重定向程序的输入将覆盖其控制终端。没有控制终端,就找不到登录名:

$ tty
/dev/pts/2
$ tty < /dev/null
not a tty


但是,您仍然可以通过获取用户的ID(getuid)并查找其passwd entry (related docs)getpwuid),然后在其中找到其用户名来查找用户的名称(也许)。

08-03 14:40