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

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

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

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

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

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

  • Обработка сообщения whois отказалось от сообщения в сценарии оболочки
  • Попросив свой сценарий принять аргументы, содержащие пробелы
  • Помогите мне понять сложную подстановку команд с помощью {} и нескольких `\ ls`
  • сравнить два поля в двух разных файлах
  • Допускаются двойные утверждения «if» в сценариях оболочки
  • C Shell отменил файл
  • Как создать каталог, объединив два имени?
  • пытаясь передать несколько строк, один за другим (каждая строка имеет 3 элемента, разделенных пробелом), поданных в уже написанный скрипт
  • 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 

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

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