我正在NixOS上运行Haskell项目(使用
stack
)利用
XDG_RUNTIME_DIR
stack exec my-compositor-project-exe # nix is enabled by default
我得到一个错误:
error: XDG_RUNTIME_DIR not set in the environment
但是如果我和你一起跑
--no-nix-pure
,我没有得到一个错误:
stack --no-nix-pure exec my-compositor-project-exe
# ... no error ...
但是,这真的是修复此错误的最佳方法吗?
echo $XDG_RUNTIME_DIR
在NixOS终端我得到
echo $XDG_RUNTIME_DIR
/run/user/1000
当我跑的时候
nix-shell
在我的Haskell stack项目中,我也得到了
[nix-shell:~/my-project]$ echo $XDG_RUNTIME_DIR
/run/user/1000
所以我为什么会犯这样的错误是个谜。
问题:
上下文
以防万一
here
$XDG_RUNTIME_DIR
指:
$XDG_RUNTIME_DIR定义了与存储用户特定的非基本运行时文件和其他文件对象(如套接字、命名管道等)相关的基本目录。该目录必须由用户拥有,并且他必须是唯一具有读写权限的用户。其Unix访问模式必须为0700。
如果未设置$XDG_RUNTIME_DIR,应用程序应返回到具有类似功能的替换目录,并打印警告消息。应用程序应使用此目录进行通信和同步,并且不应在其中放置较大的文件,因为它可能驻留在运行时内存中,并且不一定能交换到磁盘。
我的程序中产生错误的特定FFI调用是对
wl_display_add_socket
WL_EXPORT int
wl_display_add_socket(struct wl_display *display, const char *name)
{
runtime_dir = getenv("XDG_RUNTIME_DIR");
if (!runtime_dir) {
wl_log("error: XDG_RUNTIME_DIR not set in the environment\n");
/* to prevent programs reporting
* "failed to add socket: Success" */
errno = ENOENT;
return -1;
}
//...
}