Mac OS X 上的 XDG_RUNTIME_DIR

9

Mac OS X是否实现XDG基本目录规范?如果没有,有没有与$XDG_RUNTIME_DIR等效的东西?我协助维护的应用程序需要一个临时目录,其中可以放置和执行二进制(即可执行)文件。因此,这个目录最好是用户唯一的,并且必须保证允许文件设置可执行位(如果Mac OS X使用的文件系统支持这样的功能)。


目录通常都有可执行位...否则无法列出... - Macmade
1
抱歉,我的意思是目录应该允许其中的文件设置执行位。在*nix世界中,许多人将他们的$TMPDIR挂载为noexec作为安全措施。(我相信XDG基本目录规范模糊地禁止了这种做法,对于$XDG_RUNTIME_DIR,它指出该目录必须“按操作系统标准具有完整功能”,包括“适当的权限”。) - Psychonaut
2个回答

1

根据规范

$XDG_RUNTIME_DIR 定义了相对于哪个基本目录存储用户特定的非必需运行时文件和其他文件对象(如套接字、命名管道等)。该目录必须由用户拥有,并且他必须是唯一具有读写访问权限的用户。它的 Unix 访问模式必须为 0700。

没有给出太多其他指导。我认为这意味着您可以将其放在您的 $HOME 中的任何文件夹中。如果权限正确且数据类似缓存,则我认为这与您的 $XDG_CACHE_HOME 可能没有太大区别。


2
使用“您的$HOME中的任何文件夹”违背了使用特定的、标准化的位置,例如XDG基本目录规范的目的。(这个想法是防止文件系统被成百上千个不同的缓存、配置和临时文件夹所淹没,每个应用程序都使用一个不同的文件夹。)问题是关于Mac OS X(现在的macOS)的设计者是否明确指定了一个特定的位置用于临时可执行文件,而不是是否安全地使用您选择的位置。 - Psychonaut
既然规范中没有指定,显然就是自由发挥。别把怒火撒在我身上,我也不喜欢这样。我个人使用 ~/.run - mattmc3
在大多数Linux系统中,XDG_RUNTIME_DIR/run/user/$(id -u),其中/run是一个tmpfs(内存虚拟文件系统),这是一个很大的提示,说明其预期目的:您的运行时目录基本上是工作内存或临时空间,只是恰好位于文件系统而不是进程中 - 不希望在系统重新启动、用户登录以及(尽管这不太明显)甚至程序执行之间保留。 - mtraceur

1
在MacOS上,使用~/Library/Caches/TemporaryItems作为"runtime"目录;MacOS不遵循XDG规范。
使用~/Library/Caches内的内容是一个很好的选择,因为它会自动被排除在Time Machine(内置备份和版本控制工具)之外。因此,MacOS和遵循MacOS约定的第三方应用程序会自然地理解该目录中的任何内容都是类似缓存的东西 - 特别是排除了永久应用程序数据、稳定的程序库/可执行文件以及配置等。
缓存目录下的TemporaryItems子目录过去常被用于临时的"工作内存"样式的东西 - 例如,MacOS上的Microsoft Outlook曾经将其用于打开的(因此是本地下载的)附件。
同样地,Python库platformdirs似乎也做出了相同的决定。

还有 /private/var... 我不知道有什么明显的理由选择它而不是 ~/Library/Caches/TemporaryItems。少数用户觉得随机删除 ~/Library/Caches 是可以接受的 - /private/var 看起来更像系统级别,也许在人类感知上给了它一点更多的保护。此外,用户的主目录可能被挂载到 MacOS 服务器/集群上,但没有 "标准" 的设置将 /private/var 进行网络挂载。如果这些对您足够重要,请考虑使用 /private/var/run/private/var/folders。我进行了快速搜索,但并没有立即找到如何正确使用 /private/var/folders 的任何提示…例如,您如何获得您的 /private/var/folders/?? 子目录?但 /var/run原始(根/系统)运行时目录,/private/var/run 是每个用户的运行时目录,所以似乎值得完整介绍。

但截至目前,我会使用 ~/Library/Caches/TemporaryItems,因为那似乎是流行的约定。


虽然MacOS确实不遵循XDG规范,但个别应用程序可以自由选择遵循。例如,Elvish shell就是这样做的。 - Kurtis Rader
在运行时目录的情况下,我的答案是选择在MacOS上遵循XDG(或者你可以严格按照规范行事,即在环境中没有XDG_RUNTIME_DIR的情况下,假设不存在运行时目录,因为据我所知,XDG并没有为运行时目录指定默认值,就像它为许多其他目录指定了默认值一样,但由于MacOS不会将其放入环境中,这意味着你要么总是失败,要么总是使用备用方案,要么只是将运行时目录的问题向根节点推进)。 - mtraceur
@KurtisRader 此外,单独的应用程序可能会在选择是否遵循MacOS上的XDG规范时出现问题(就像在XDG系统上的应用程序选择不遵循也会有问题一样),因为系统、第三方应用程序和本地/常用用户都可能直接或间接地期望、假设甚至依赖于操作系统的惯例被遵循。(如果惯例确实值得遵循,那么可以有很强的理由认为在你所运行的操作系统上,官方/本地/主要的惯例值得遵循。但是,是的,对于某些程序来说,在MacOS上遵循XDG可能是有道理的。) - mtraceur
我至少会将它放入一个名为runtime的子目录中,以减少潜在的冲突,虽然这样做并不安全,但至少更安全一些。同时,使用mkdirchmod 0700命令来遵循XDG的指南。 - Martin Braun
在我的macOS Ventura 13.6上,/var只是一个指向/private/var的软链接,所以在这里没有系统和每个用户之间的区别。因此,/var/run在技术上违反了标准要求它由用户拥有并且权限为700。不过,我还是会选择使用它,因为其他所有文件似乎都存储在那里。如果遇到任何问题,我会将其切换到/var/run/user/$USER - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接