Неправильный способ перечисления версий python из bash

Из-за бюрократии я столкнулся с ситуацией, когда я могу заставить кого-то запустить сценарий bash на сервере Linux и дать мне результаты, но я не могу войти туда или сам запустить сценарий.

Я вполне уверен, что на сервере, на котором работает сервер Debian или Ubuntu.

Я хочу узнать, какой python и какие версии g++ установлены (длинный рассказ).

Пока что моя лучшая идея – получить $PATH , разделить ее на : а затем искать все пути для всего, что соответствует python , g++ соответственно.

Есть ли более здравый путь?

  • Два условия в if (только положительные числа без букв)
  • Результат вывода команды времени на переменную в сценарии bash
  • Может кто-то уточнить: «случай»: $ PATH: «in» в скрипте?
  • Помогите мне понять, почему тест $? -eq 0 истинно, даже если я ожидаю, что оно будет ложным
  • Скрипт работает вечно
  • Создание нескольких сценариев с разными именами файлов
  • Как написать скрипт, который смотрит каталог для команды lessc?
  • Форматирование и отображение интервала с дробными секундами в оболочке
  • 6 Solutions collect form web for “Неправильный способ перечисления версий python из bash”

    Следующее должно работать для g ++, если у вас нет локальных установок g ++.

     dpkg -l 'g++*' 

    В моей системе это дает:

     dpkg -l 'g++*' Desired=Unknown/Install/Remove/Purge/Hold | Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend |/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad) ||/ Name Version Architecture Description +++-================================-=====================-=====================-====================================================================== ii g++ 4:4.9.2-2 amd64 GNU C++ compiler ii g++-4.6 4.6.3-14 amd64 GNU C++ compiler un g++-4.6-multilib <none> <none> (no description available) ii g++-4.9 4.9.2-10 amd64 GNU C++ compiler ii g++-4.9-multilib 4.9.2-10 amd64 GNU C++ compiler (multilib files) ii g++-multilib 4:4.9.2-2 amd64 GNU C++ compiler (multilib files) 

    Для Python аналогичный подход заставит слишком много ложных срабатываний, потому что на Debian и его производных все библиотеки Python начинаются с python- . Таким образом, нужен более утонченный шаблон шара.

    Что-то вроде

     dpkg -l 'python?.?' 

    должно сработать.

     dpkg -l 'python?.?' Desired=Unknown/Install/Remove/Purge/Hold | Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend |/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad) ||/ Name Version Architecture Description +++-================================-=====================-=====================-====================================================================== ii python2.6 2.6.8-1.1 amd64 Interactive high-level object-oriented language (version 2.6) ii python2.7 2.7.9-2 amd64 Interactive high-level object-oriented language (version 2.7) un python3.1 <none> <none> (no description available) ii python3.4 3.4.2-1 amd64 Interactive high-level object-oriented language (version 3.4) 

    С zsh :

     $ type -ma '(python|g++)*' g++ is /usr/bin/g++ g++-4.4 is /usr/bin/g++-4.4 g++-4.6 is /usr/bin/g++-4.6 g++-5 is /usr/bin/g++-5 python is /usr/bin/python python-config is /usr/bin/python-config python-coverage is /usr/bin/python-coverage python2 is /usr/bin/python2 python2-config is /usr/bin/python2-config python2-coverage is /usr/bin/python2-coverage python2-gflags2man is /usr/bin/python2-gflags2man python2.7 is /usr/bin/python2.7 python2.7-config is /usr/bin/python2.7-config python2.7-coverage is /usr/bin/python2.7-coverage python3 is /usr/bin/python3 python3.2 is /usr/bin/python3.2 python3.2mu is /usr/bin/python3.2mu python3.4 is /usr/bin/python3.4 python3.4m is /usr/bin/python3.4m python3.5 is /usr/bin/python3.5 python3.5m is /usr/bin/python3.5m python3m is /usr/bin/python3m pythontex is /usr/bin/pythontex pythontex3 is /usr/bin/pythontex3 

    Подобно type cmd но сообщает команды (и псевдонимы, функции и встроенные функции, которые были бы релевантны, если оболочка пользователя окажется zsh ), которая обрабатывает шаблон.

    Если вы хотите, чтобы версии находились в $ PATH, вы можете запускать:
    python -V ; g++ --version

    Просто используйте диспетчер пакетов ОС для запроса:

     $ dpkg -l | awk '/^ii/ && $2 ~ /^python[0-9](\.[0-9]+)+$/ {print $2}' python2.6 python2.7 python3.2 python3.4 

    Вы можете использовать which -a для поиска пути.

     function get_versions { for p in $(which -a $1); do $p --version done } get_versions python get_versions g++ 

    Учитывая, что вы не знаете все о системе, в которой будет работать ваш скрипт, и вам не придется легко ее фиксировать, вы должны держать ее в покое и с низким уровнем допущений.

    Напишите переносимый скрипт sh, который перечисляет PATH . Это касается установки без пакета, а также установки пакета, если установки, отличные от пакета, находятся в рекламируемом месте. (Если вы не можете доверять администраторам, чтобы сделать установки, которые вы хотите обнаружить, вам лучше установить свои собственные.)

     #!/bin/sh set -f; IFS=: set -- $PATH set +f; unset IFS for dir; do if [ -x "$dir/python" ]; then printf %s "$dir/python is "; "$dir/python -V; fi ls -l "$dir/python"* 2>/dev/null if [ -x "$dir/python" ]; then printf %s "$dir/g++ is "; "$dir/g++ --version | head -n 1; fi ls -l "$dir/g++"* 2>/dev/null done 

    Результат этого скрипта – всего лишь образец, вы можете упростить анализ.

    Interesting Posts

    Использование вывода команды для определения имени файла для перенаправления вывода на

    Вставка текста между двумя шаблонами

    Как изменить значок типа файла в XFCE (Thunar)?

    NetworkManager изменяет политику маршрутизации по умолчанию

    Список истории `yum / dnf` в порядке возрастания (вспять)

    Отсутствует файл iptables в каталоге /etc/init.d/ (Fedora 17)

    Предоставляет ли разрешение на запись для файлов журналов определенным пользователям хорошую практику?

    Как сделать bash glob строковой переменной?

    Как узнать имена и количество пользователей в вашей системе?

    сопоставить первый столбец файла a с параграфами файла b

    Возможно ли обновить руководства для MacOS?

    Как использовать функцию bash как регулярную команду в цепочке труб?

    нужна помощь и уточнить с помощью grep & regex

    Перечислить пакеты в системе на основе apt по дате установки

    fedora 15, oracle 11: не удается войти с помощью sqlplus

    Linux и Unix - лучшая ОС в мире.