Разумный способ перечисления версий python из bash

Предполагая, что вы хотите отрицать все положительные значения и оставить только отрицательные, сработает условный оператор:

$3 > 0 ? -1 * $3 : $3
3
29.02.2016, 14:45
6 ответов

Следующее должно работать для 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)
8
27.01.2020, 21:07

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

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

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

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

#!/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

Вывод этого сценария является всего лишь примером, вы можете упростить его анализ .

0
27.01.2020, 21:07

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

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

get_versions python
get_versions g++
0
27.01.2020, 21:07

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

4
27.01.2020, 21:07

С 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, но сообщает aвсе команды (и псевдонимы, и функции, и встроенные модули, которые будут уместны, если оболочка пользователя окажется zsh), которые match шаблон.

4
27.01.2020, 21:07

Теги

Похожие вопросы