我在运行 OS X 10.8.4 的 Mac 上通过 MacPorts 安装了 coreutils。我已设置使用[ ]ls
的 coreutils 版本(如果可用):ls
(GNU coreutils) 8.21
if [ -e /opt/local/libexec/gnubin ]; then
alias ls='/opt/local/libexec/gnubin/ls --color=auto'
else
alias ls='/bin/ls -G'
fi
当我ls -l
在包含已知具有扩展属性 (xattrs) 的文件的目录中运行时,我希望@
在这些列表中的权限后面看到一个标志。然而,我没有看到任何@
迹象。如果我跑步/bin/ls -l
,我就会得到@
标志。
文件列表来自/bin/ls -l
:
-rw-r--r--@ 1 zev.eisenberg staff 132887 Jul 19 16:24 flowchart.graffle
文件列表ls -l
(使用 coreutils):
-rw-r--r-- 1 zev.eisenberg staff 132887 Jul 19 16:24 flowchart.graffle
当 xattrs 存在时,如何获取 coreutils 版本以向ls
我显示标志?@
答案1
您可以向 coreutils ls 添加扩展属性。这是基于 coreutils-8.22 的:
***************
*** 59,62 ****
--- 59,64 ----
#include <wchar.h>
+ #include <sys/xattr.h>
+
#if HAVE_LANGINFO_CODESET
# include <langinfo.h>
***************
*** 3056,3059 ****
--- 3058,3062 ----
: ACL_T_YES));
any_has_acl |= f->acl_type != ACL_T_NONE;
+ any_has_acl |= listxattr(f->name, NULL, 0, XATTR_NOFOLLOW);
if (err)
***************
*** 3811,3814 ****
--- 3814,3819 ----
if (! any_has_acl)
modebuf[10] = '\0';
+ else if (listxattr(f->name, NULL, 0, XATTR_NOFOLLOW) > 0)
+ modebuf[10] = '@';
else if (f->acl_type == ACL_T_SELINUX_ONLY)
modebuf[10] = '.';
基本上,我在 OS Xls
源代码中查找打印 @(调用listxattr
)的逻辑,并将其挂接到 coreutilsls
在权限后面放置符号的位置。这三个变化是:
- 包括
xattr.h
- 设置
any_has_acl
是否有任何列表具有扩展属性 - 这是必需的,以便没有扩展属性的列表在排列权限后插入一个空格 listxattr
通过调用并有条件地设置符号来进行实际检查- 可能值得注意的是,如果同时存在扩展属性和 ACL,@
他们的编写方式将仅显示@
该XATTR_NOFOLLOW
参数告诉listxattr
不要遵循符号链接。 OS X 中使用了该参数ls
。
答案2
我相信 Mark Cohen 的评论是正确的:coreutils 版本中似乎缺少此功能ls
。我实际上没有充分的理由使用 coreutils ls
,所以我切换回内置的 BSD 版本。