如何在 ls -a 中隐藏文件/目录,同时在符合 POSIX 的系统中仍然可以访问?

s1l*_*v3r 12 filesystems zfs posix dot-files

例如,在 FreeBSD 和 ZoL 下的 ZFS 中.zfs,每个 zpool 挂载点内部都有一个魔法目录,您可以使用zfs set snapdir=visible.zfs目录使该目录可见。

让我好奇的是:如果该设置设置为“隐藏”,那么.zfs目录实际上如何从ls -a或 shell 路径自动完成的输出中隐藏,同时仍然可以访问(您仍然可以访问cd它或调用stat它)?

我无法真正理解这个事实,因为我不知何故认为如果某些东西存在并且可以访问它应该被列出ls -a- 即使它本质上只是魔法/虚拟。

任何人都可以解释这是如何工作的吗?是否有符合 POSIX 标准的方式来拥有一个隐藏ls -a但仍可访问的目录?你怎么做呢?

der*_*ert 10

嗯,如何做很简单:ls从名为readdir. 更改为目录是通过单独的系统调用完成的,chdir. stat也是一个不同的系统调用,大多数其他文件操作也是如此。

简而言之,“这个目录中有什么?” 和“访问这个目录”是内核的完全独立的请求——因此它们可以被编程为以不同的方式工作。

因此,为了不出现在目录中ls -a,你只需要在内核从结果忽略它readdir。但它仍然适用于chdir(等),因为这是一个不同的系统调用。

这与拥有您拥有+x权限的目录并没有太大不同,但不是 -r:您可以访问其中的文件和目录,cd进入其中等,但ls会失败。我相信其他东西也使用了这种安排——例如(这是从模糊记忆中获得的,无需查找)AFS 有一种全局/afs命名空间,您可以在其中基本上通过cd输入它的名称来连接到任何 AFS 服务器;但是,lson/afs不会显示世界上所有的服务器。我见过 FUSE 文件系统做类似的事情(例如,cd连接到匿名 FTP 服务器)。

(我不确定zfs的安排是否严格遵守POSIX)。

  • 这符合 POSIX,因为该行为与并发进程没有区别,并发进程总是在任何人尝试列出隐藏文件之前删除隐藏文件(例如通过调用“readdir”)并在任何人尝试访问它之前创建它(例如通过调用“ chdir`)。 (3认同)