Executando “dpkg -s” ou “-l” silencioso

3

Estou escrevendo um script que verifica uma lista muito grande de dependências. Então eu escrevi uma função que obtém o nome do pacote como entrada e usando dpkg checks se ele está instalado e imprime uma saída apropriada. Aqui está uma versão desta função:

check_dependency() { 
    dpkg -l  > /dev/null
    if [ $? -eq 0 ]; then
        # print something saying it is installed
    else
        # print something saying it was not found
    fi
}

que funciona bem quando o pacote é instalado. Mas quando não está instalado, de alguma forma não redireciona a saída para /dev/null e solicita:

dpkg-query: no packages found matching foo-bar

Em uma segunda tentativa, modifiquei o corpo da função para usá-lo com grep -q :

check_dependency() { 
    dpkg -s  | grep -q 'installed'
    if [ $? -eq 0 ]; then
        # print something saying it is installed
    else
        # print something saying it was not found
    fi
}

Quando o pacote é instalado, novamente parece funcionar bem, no entanto, quando o pacote não é encontrado e a mensagem indesejada de dpkg aparece no terminal:

dpkg-query: package 'foo-bar' is not installed and no information is available bla bla...

Usando diretamente dpkg-query resulta em um problema semelhante. Como torná-lo silencioso quando não consegue encontrar o pacote?

    
por Pouya 27.11.2015 / 14:00

2 respostas

1

Usando dpkg -l e verificando o código de retorno, diz nada sobre o status da instalação de um pacote.

Use awk e dpkg -l e verifique o status ii

dpkg -l | awk '/^ii +'""' +/'

Exemplo

$ package="mc"
$ dpkg -l | awk '/^ii +'"$package" +' /'
ii  mc      3:4.8.13-3      i386       Midnight Commander - a powerful file manager

$ package="foobar"
$dpkg -l | awk '/^ii +'"$package" +' /'
<returns nothing>

ou

$ package="mc"
$ dpkg -l | awk '/^ii +'"$package"' +/ {print }'
mc
    
por A.B. 27.11.2015 / 14:12
1

Você deseja redirecionar a saída padrão (stdout) e o erro padrão (stderr) para /dev/null . Para isso, substitua > por &> . Este é um atalho específico para bash . Então seu código seria:

check_dependency() { 
    dpkg -l  &> /dev/null
    if [ $? -eq 0 ]; then
        # print something saying it is installed
    else
        # print something saying it was not found
    fi
}

No entanto, isso ainda contaria um pacote como sendo instalado se ele tivesse sido removido, mas os arquivos de configuração permanecessem (como apontado por @ A.B.). Em vez disso, você poderia tentar

check_dependency() { 
    # Get the number of packages installed that match 
    num=$(dpkg -l "" 2>/dev/null | egrep '^ii' | wc -l)

    if [ $num -eq 1 ]; then
        # print something saying it is installed
    elif [ $num -gt 1]; then
        # print something saying there is more than one package matching 
    else
        # print something saying it was not found
    fi
}
    
por Gsxr1k 27.11.2015 / 15:06