[英]OCaml: unexpected exception with Unix.getlogin when stdin redirected
我在这个简单的代码中找到了下一个问题:
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条目(相关文档) ( getpwuid
),然后在其中查找用户名来查找用户名(可能)。
取决于您的应用:
如果你真的不关心“getlogin”返回的值,你可以这样做:
try Unix.getlogin () with _ -> Sys.getenv "USER"
你可能会得到比getuid
更好的东西,因为它也适用于具有Set-User-ID标志(sudo / su)的程序。
如果你真的关心“getlogin”返回的值,即你真的想知道谁登录了,你应该在getlogin失败时失败。 任何其他解决方案只会给出正确结果的近似值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.