Maneira sã de enumerar versões de python do bash

3

Devido à burocracia, estou em uma situação onde posso fazer com que alguém execute um script bash em um servidor Linux e me dê saídas, mas não consigo fazer login ou executar o script sozinho.

Eu tenho certeza que o servidor em questão está rodando Debian ou Ubuntu.

Eu quero descobrir quais python e quais g++ versões estão instaladas (longa história).

Até agora, minha melhor idéia é obter $PATH variable, dividir por : e pesquisar todos os caminhos para tudo que corresponda a python , g++ respectivamente.

Existe uma maneira mais saudável?

    
por Xarn 29.02.2016 / 13:38

6 respostas

8

O seguinte deve funcionar para g ++, desde que você não tenha instalações g ++ locais.

dpkg -l 'g++*'

No meu sistema, isso dá:

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)

Para o Python, uma abordagem similar vai pegar muitos falsos positivos, porque no Debian e seus derivados, todas as bibliotecas do Python começam com python- . Então, seria necessário um padrão glob mais refinado.

Algo como

dpkg -l 'python?.?'

deve funcionar.

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)
    
por 29.02.2016 / 14:36
5

com 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

Como type cmd , mas relata a ll os comandos (e aliases e funções e builtins que seriam relevantes se o shell do usuário for zsh ) que m atch o padrão.

    
por 29.02.2016 / 16:28
4

Se você deseja as versões que estão em $ PATH, você pode executar:% python -V ; g++ --version

    
por 29.02.2016 / 15:11
3

Apenas usando o gerenciador de pacotes do SO para consultar:

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

Você pode usar which -a para pesquisar o caminho.

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

get_versions python
get_versions g++
    
por 01.03.2016 / 08:12
0

Dado que você não sabe tudo sobre o sistema no qual seu script será executado e você não terá dificuldade em consertá-lo, você deve mantê-lo com baixa tecnologia e baixa suposição.

Escreva um script sh portátil que enumere PATH . Isso cuida das instalações que não são de pacotes, bem como da instalação de pacotes, desde que as instalações que não sejam de pacotes estejam em um local anunciado. (Se você não pode confiar nos administradores para ter feito as instalações que você deseja descobrir, é melhor instalar o seu próprio.)

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

A saída deste script é apenas uma amostra, você pode facilitar a análise.

    
por 01.03.2016 / 01:52