Faça ls distinguir scripts de binários na saída

4

É possível fazer ls distinguir scripts executáveis de binários compilados reais?

As permissões são geralmente as mesmas ( +x ), e com ls -F você recebe um sufixo de asterisco ( * ) para ambos, então é difícil diferenciá-las. Eu tenho um script para configurar as cores de ls , mas ele depende do arquivo ser executável ou não, então elas aparecem da mesma forma:

BG='01;32'  # green
EX="ex=$BG" # file with execute permission

Eu não quero depender da extensão, pois muitos desses arquivos não a possuem.

Eu quero isso, então quando vejo alguma mensagem de erro bizarra e penso: "Que código causou isso?", sei se é ou não seguro cat do arquivo.

Se não houver uma solução padrão, que tal analisar a saída de file em uma função comum e inserir alguma marca distintiva? Ou seria muito lento para ls ?

    
por Emanuel Berg 06.11.2012 / 20:25

2 respostas

1

Você precisa examinar o conteúdo de um arquivo para distinguir entre binários e scripts. ls não faz isso, ele apenas analisa nomes de arquivos e metadados (tipo, permissão, etc.).

Aqui está um analisador bruto para file que colore scripts e binários de maneira diferente. Ele age como ls -d ; adicionar metadados exigiria um trabalho de correção que exige uma abordagem mais direta (por exemplo, em Perl ou Python); use lsx somedir/* para listar o conteúdo de um diretório. Supõe-se que os nomes dos arquivos não contenham novas linhas nem dois pontos (você pode alterar o separador : para alguma outra sequência com a opção -F para file ).

lsx () {
  file -iN -- "$@" |
  while IFS= read -r line; do
    name=${line%%: *}; type=${line#*: }
    color=0
    case $type in
      application/x-executable*) color='32';;
      text/x-shellscript*) color='01;32';;
      application/*zip*) color='31';;
    esac
    printf '3[%sm%s3[0m\n' "$color" "$name"
  done
}
    
por 07.11.2012 / 01:24
1

Você pode brincar com dircolors . Dê uma olhada na saída de dircolors -p . Nos meus sistemas, encontro as seguintes definições relevantes:

# This is for files with execute permission:
EXEC 01;32
…
# Or if you want to colorize scripts even if they do not have the
# executable bit actually set.
#.sh 01;32

Se você remover o # na última linha e escrever .sh 07;31 , seus scripts de shell (todos os arquivos com extensão .sh ) piscarão em vermelho.

Guarde as suas definições em ~/.dircolors e adicione ao seu .bashrc a linha:

eval "$(dircolor $HOME/.dircolors)"
    
por 06.11.2012 / 21:26