Lista de GNU binutils

1

Como posso obter uma lista desse tipo a partir da linha de comando, incluindo a versão de cada utilitário? Por padrão, eles estão no mesmo arquivo?

    
por user3122885 28.01.2014 / 19:10

2 respostas

5

Eles são [<> provavelmente ] todos iguais ( gold tem uma versão extra - veja o final deste post).
Mas considere o resto desta resposta de código de golfe para a melhor maneira de extrair as versões.

dpkg -L binutils | grep "/usr/bin/" | xargs -i sh -c "{} --version"

Faz muito bem o que o roadmr faz.

dpkg -L binutils | xargs -i sh -c "{} --version 2>/dev/null || exit 0"

Tenta executar tudo dpkg -L ... outputs. Obviamente, apenas os executáveis serão executados, portanto, só precisamos redirecionar o erro (e fazer com que xargs os ignore).

dpkg -L binutils | xargs -i bash -c '[[ -x "{}" && -f "{}" ]] && {} --version'

Teste que estamos lidando com um arquivo executável em vez de um caminho de filtragem.

sudo apt-get install parallel
dpkg -L binutils | grep /usr/bin/ | parallel {} --version
dpkg -L binutils | parallel {} --version 2>/dev/null
dpkg -L binutils | parallel '[[ -x "{}" && -f "{}" ]] && {} --version'

Desta vez usamos o GNU parallel para fazer as mesmas abordagens. parallel nos permite ignorar algumas inconveniências em xargs (como se não fosse possível ignorar qualquer código de saída diferente de zero. man parallel é uma leitura genuinamente boa.

Com tudo isso dito, ainda que mais curto, todos os meus exemplos desembocam em um novo shell (inevitável com xargs e mais ou menos o ponto de parallel ), então eles são um pouco mais lentos que os de roadmr. O primeiro é o mais rápido.

Editar: Até agora ...

sh <(dpkg -L binutils | awk '/bin\// {print $0 " --version"}')

Apenas dois garfos (mais ou menos) e são tão rápidos quanto o loop for (embora muito mais curto).

Editar : eles não são exatamente os mesmos. gold tem uma versão secundária (1.11) que os outros comandos não possuem.

$ sh <(dpkg -L binutils | awk '/bin\// {print $0 " --version"}') | \
    grep Binutils | sort -u | column -t
GNU  addr2line  (GNU  Binutils  for  Ubuntu)  2.23.52.20130913
GNU  ar         (GNU  Binutils  for  Ubuntu)  2.23.52.20130913
GNU  assembler  (GNU  Binutils  for  Ubuntu)  2.23.52.20130913
GNU  c++filt    (GNU  Binutils  for  Ubuntu)  2.23.52.20130913
GNU  dwp        (GNU  Binutils  for  Ubuntu)  2.23.52.20130913
GNU  elfedit    (GNU  Binutils  for  Ubuntu)  2.23.52.20130913
GNU  gold       (GNU  Binutils  for  Ubuntu   2.23.52.20130913)  1.11
GNU  gprof      (GNU  Binutils  for  Ubuntu)  2.23.52.20130913
GNU  ld         (GNU  Binutils  for  Ubuntu)  2.23.52.20130913
GNU  nm         (GNU  Binutils  for  Ubuntu)  2.23.52.20130913
GNU  objcopy    (GNU  Binutils  for  Ubuntu)  2.23.52.20130913
GNU  objdump    (GNU  Binutils  for  Ubuntu)  2.23.52.20130913
GNU  ranlib     (GNU  Binutils  for  Ubuntu)  2.23.52.20130913
GNU  readelf    (GNU  Binutils  for  Ubuntu)  2.23.52.20130913
GNU  size       (GNU  Binutils  for  Ubuntu)  2.23.52.20130913
GNU  strings    (GNU  Binutils  for  Ubuntu)  2.23.52.20130913
GNU  strip      (GNU  Binutils  for  Ubuntu)  2.23.52.20130913
    
por Oli 29.01.2014 / 16:52
2

Tente isto:

for util in 'dpkg --listfiles binutils |grep "\/usr\/bin\/"'; do
    echo -n "$util -> "; echo "" | $util --version
done

Isso obtém todos os binários nos pacotes binutils e consulta cada um com seu parâmetro --version. Eu faço eco de uma string vazia para aqueles que esperam entrada no terminal.

    
por roadmr 28.01.2014 / 19:32