Неправильный способ перечисления версий 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 

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

  • Bash (Ubuntu) - Строки в циклах?
  • Поиск деловой даты в пределах диапазона
  • Как я могу выполнить и прервать скрипт в цикле
  • shell Script: сортировка файлов в каталогах и подкаталогах
  • динамический поиск zip-файлов в определенном пути и разархивировать его в той же папке с распакованными файлами?
  • tr -d не работает с возвратом каретки
  • C Shell отменил файл
  • Сгенерируйте большое количество одного и того же байта
  • Как автоматизировать повторяющийся процесс с использованием сценариев оболочки
  • Преобразование подчеркивания в PascalCase, т.е. UpperCamelCase
  • Поиск последнего символа имени базового файла
  • Interesting Posts

    Почему в моей системе Fedora 14 с интегрированным графическим контроллером Intel Mobile GME965 / GLE960 возникает неправильное соотношение сторон?

    Grep в новых файлах журналов по мере их создания

    Изменение linux для разных плат

    Удаление файлов-призраков с символами, отличными от ASCII

    Как я могу узнать, является ли относительная символьная ссылка внутренней для определенного поддерева или нет?

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

    Где заданы предпочтения шрифтов по умолчанию в современном рабочем столе Unix (которые влияют на выбор шрифта нестандартным Emacs 24)?

    Makefile: установка внешнего модуля ядра Linux

    Могу ли я активировать обратную связь по паролю на tty?

    Как заставить систему автоматически монтировать зашифрованное устройство в Linux

    перенаправить раздельный вывод

    Chromium 32.0.1700.19 не может отображать китайский титул

    VMware: Почему нулевое заполнение ext4 необходимо для сжатия файлов .vmdk?

    Каталог ssh исчезает после `mv ssh .ssh`

    Как я могу заставить `ожидать` игнорировать $ (знак доллара) в пароле?

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