Script um teste para o pacote debian instalado - tratamento de erros?

2

Eu quero fazer o script de um teste para um pacote debian sendo instalado.

A pesquisa usando dpkg-query retornará um erro se nenhum pacote corresponder. Mas se eu quiser detectar isso especificamente e abortar qualquer outro erro (por exemplo, exaustão de recursos), não sei como fazer isso.

    
por sourcejedi 24.11.2016 / 00:28

2 respostas

2

dpkg-query é bastante simples, você pode rapidamente percorrer a página do manual e descobrir que não tem nenhuma opção para implementar isso diretamente. Então

dpkg-query -W -f '${Package} ${State}\n' | grep "^my-package .* installed"

O problema é reduzido a captura de códigos de erro em um pipeline . Manipulação de erro aparentemente restrita no shell do Unix fica estranha. Eu estava esperando ingenuamente por one-liners:).

set -e

function pkg_is_installed() {
  PKG="$1"
  LISTF=$(mktemp)
  dpkg-query -W -f '${Package} ${State}\n' >$LISTF
  grep "^${PKG} .* installed$" $LISTF >/dev/null   
  GREP_RC=$?
  rm $LISTF

  # for even moar strict error handling
  test $GREP_RC == 0 -o $GREP_RC == 1

  return $GREP_RC
}

Acredito que isso irá imprimir quaisquer erros que ocorram ao stderr, enquanto evita imprimir uma mensagem quando o único "erro" é que o dpkg não (ainda) viu o pacote requisitado.

    
por 24.11.2016 / 00:28
2

dpkg-query tem uma opção para fazer isso e seus códigos de saída dão suporte ao seu caso de uso:

-s, --status package-name...

Report status of specified package. This just displays the entry in the installed package status database. When multiple package-name are listed, the requested status entries are separated by an empty line, with the same order as specified on the argument list.

(note que ele aparece no banco de dados de status de pacotes installed , de modo que ele não pode relatar sobre qualquer coisa não instalada - que é o que você está procurando); e

EXIT STATUS

0: The requested query was successfully performed.

1: The requested query failed either fully or partially, due to no file or package being found (except for --control-path, --control-list and --control-show were such errors are fatal).

2: Fatal or unrecoverable error due to invalid command-line usage, or interactions with the system, such as accesses to the database, memory allocations, etc.

(A página man incluída na Debian 8 não menciona isso, mas dpkg-query se comporta assim mesmo no Debian 8.)

Então, algo como

#!/bin/sh

dpkg-query -s package > /dev/null 2>&1
case $? in
0)
    echo $1 is installed
    ;;
1)
    echo $1 is not installed
    ;;
2)
    echo An error occurred
    ;;
esac

(transformado em uma função) caberia a conta como eu a entendo.

    
por 25.11.2016 / 09:46

Tags