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

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

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

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

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

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

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 

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

  • читать номера телефонов из файла и хранить их в другом файле уникально
  • запуск цикла for в сценарии оболочки
  • Как мне grep найти файл, соответствующий строке, заключенной в подстановочные знаки
  • Перенаправить вывод команды в два разных файла
  • Как обрабатывать подкоманду в сценарии оболочки?
  • Почему printf выводит больше аргументов, чем ожидалось?
  • Как написать скрипт, который смотрит каталог для команды lessc?
  • Перезаписать определенную строку в файле 2 с содержимым файла 1
  • Я могу запустить код из терминала, но ту же команду, выдающую ошибку при запуске в сценарии оболочки
  • Почему «-» в «#! / bin / sh - "shebang?
  • напечатать IP-адрес с именем интерфейса
  • Linux и Unix - лучшая ОС в мире.