Veja atributos estendidos com coreutils ls no Mac

3

Eu tenho o coreutils instalado via MacPorts no meu Mac executando o OS X 10.8.4. Eu tenho ls definido para usar a versão coreutils de ls [ (GNU coreutils) 8.21 ] quando disponível:

if [ -e /opt/local/libexec/gnubin ]; then
    alias ls='/opt/local/libexec/gnubin/ls --color=auto'
else
    alias ls='/bin/ls -G'
fi

Quando executo ls -l em um diretório com arquivos que possuem atributos estendidos (xattrs), espero ver um sinal @ após as permissões nessas listagens. No entanto, não vejo sinal @ . Se eu executar /bin/ls -l , obtenho o sinal @ .

Listagem de arquivos de /bin/ls -l :

-rw-r--r--@  1 zev.eisenberg  staff  132887 Jul 19 16:24 flowchart.graffle

Listagem de arquivos de ls -l (usando coreutils):

-rw-r--r--  1 zev.eisenberg staff 132887 Jul 19 16:24 flowchart.graffle

Como posso obter a versão coreutils de ls para mostrar o sinal @ quando os xattrs estão presentes?

    
por Zev Eisenberg 12.08.2013 / 19:31

2 respostas

1

Acredito que o comentário de Mark Cohen esteja correto: essa funcionalidade parece estar ausente da versão coreutils de ls . Na verdade, não tenho um bom motivo para usar o coreutils ls , então voltei para a versão integrada do BSD.

    
por 21.08.2013 / 21:57
2

Você pode adicionar atributos estendidos ao coreutils ls. Isto é baseado em 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] = '
***************
*** 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] = '%pre%';
+   else if (listxattr(f->name, NULL, 0, XATTR_NOFOLLOW) > 0)
+     modebuf[10] = '@';
    else if (f->acl_type == ACL_T_SELINUX_ONLY)
      modebuf[10] = '.';
'; + else if (listxattr(f->name, NULL, 0, XATTR_NOFOLLOW) > 0) + modebuf[10] = '@'; else if (f->acl_type == ACL_T_SELINUX_ONLY) modebuf[10] = '.';

Basicamente eu olhei no OS X ls source para encontrar a lógica para imprimir o @ (o listxattr call) e enganchei isso em onde o coreutils ls coloca um símbolo após as permissões. As três mudanças são:

  1. incluindo xattr.h
  2. Defina any_has_acl se qualquer uma das listagens tiver atributos estendidos - isso é necessário para que as listagens que não tiverem atributos estendidos tenham um espaço inserido após as permissões para alinhar as coisas
  3. Realize a verificação real chamando listxattr e definindo condicionalmente o símbolo @ - pode ser interessante notar que a maneira como isso é escrito mostrará apenas o @ se houver atributos estendidos e ACL

O argumento XATTR_NOFOLLOW informa listxattr para não seguir links simbólicos. Esse argumento é usado no OS X ls .

    
por 23.06.2014 / 04:29