Список GNU binutils

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

2 ответа

Решение

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

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) так что все они несколько медленнее, чем роудмеры. Первый самый быстрый.

Редактировать: до сих пор...

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

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

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

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

Другие вопросы по тегам