Список GNU binutils

Список GNU binutils

Как мне получить такой список из командной строки, включая версию каждой утилиты? Они случайно не в одном файле по умолчанию?

решение1

Они [вероятно] все равно ( goldесть дополнительная версия -- см. конец этого поста).
Но рассмотрите остальную часть этого ответа code-golf для лучшего способа извлечения версий.

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

Делает примерно то же, что и roadmr.

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

Пытается бежатьвсе dpkg -L ...выходы. Очевидно, что будут запущены только исполняемые файлы, поэтому нам просто нужно перенаправить ошибки (и заставить xargsих игнорировать).

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

Убедитесь, что мы имеем дело с исполняемым файлом, а не с путем фильтрации.


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'

На этот раз мы используем GNU parallelдля реализации тех же подходов. parallelпозволяет нам обойти некоторые неудобства xargs(например, невозможность пропустить любой ненулевой код завершения). man parallelЭто действительно полезное чтиво.


При всем при этом, хотя они короче, все мои примеры расщепляются на новую оболочку (неизбежную с xargs, и своего рода смысл parallel), поэтому они все немного медленнее, чем у roadmr. Первый — самый быстрый.

Редактировать:До настоящего времени...

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

Всего две вилки (вроде бы) и этокакбыстрый, как цикл for (хотя и намного короче).


Редактировать: На самом деле они не совсем одинаковы. goldимеет вторичную версию (1.11), которой нет у других команд.

$ 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

решение2

Попробуй это:

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

Это получает все двоичные файлы в пакетах binutils и запрашивает каждый из них с его параметром --version. Я вывожу пустую строку для тех, кто ожидает ввода в терминале.

Связанный контент