Сценарий теста для установленного пакета debian - обработка ошибок?

Помимо причин, приведенных в других ответах:

  1. Психология: Программист, чья производительность измеряется в строках кода, будет иметь стимул писать излишне многословный код. Чем больше руководство фокусируется на строках кода, тем больше стимул программиста расширять свой код за счет ненужной сложности. Это нежелательно, поскольку повышенная сложность может привести к увеличению стоимости обслуживания и увеличению усилий, необходимых для исправления ошибок.

2
24.11.2016, 01:28
2 ответа

dpkg-query довольно прост, вы можете быстро просмотреть справочную страницу и обнаружить, что у него нет возможности реализовать это напрямую. Итак,

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

проблема сводится к перехвату кодов ошибок в конвейере . Очевидно, строгая обработка ошибок в оболочке Unix становится неудобной. Я наивно надеялся на остроту :).

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
}

Я считаю, что при этом будут выведены все ошибки, возникающие в stderr, и при этом не будет выводиться сообщение, когда единственной «ошибкой» является то, что dpkg (еще) не видел запрошенный пакет.

2
27.01.2020, 21:59

dpkg-query имеет возможность сделать это, и его коды выхода поддерживают ваш вариант использования:

-s , - status имя-пакета ...

Сообщает статус указанного пакета. Это просто отображает запись в базе данных статуса установленного пакета . Если указано несколько имя-пакета , запрошенные записи состояния разделяются пустой строкой в том же порядке, что и в списке аргументов.

(обратите внимание, что он смотрит в базу данных состояния установленного пакета, поэтому он не может сообщить о том, что не установлено - это то, что вам нужно); и

СОСТОЯНИЕ ВЫХОДА

0: Запрошенный запрос был успешно выполнен.

1: Запрошенный запрос полностью или частично завершился неудачно из-за отсутствия файла или пакета (кроме для - путь-управления , - список-элементов управления и - control-show , где такие ошибки фатальны).

2: Неустранимая или неисправимая ошибка из-за недопустимого использования командной строки или взаимодействия с системой, таких как доступ к базе данных, выделение памяти и т. Д.

(страница руководства, включенная в Debian 8 не упоминает об этом, но dpkg-query ведет себя так даже в Debian 8.)

Так что что-то вроде

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

(преобразованное в функцию), как я понимаю, отвечало бы всем требованиям.

2
27.01.2020, 21:59

Теги

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