Список 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. Я отображаю пустую строку для тех, кто ожидает ввода в терминале.