Как мне получить такой список из командной строки, включая версию каждой утилиты? Они случайно не в одном файле по умолчанию?
решение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. Я вывожу пустую строку для тех, кто ожидает ввода в терминале.