Выполнение “dpkg-s” или “-l” тихий

Я пишу сценарий, который проверяет на очень большой список зависимостей. Таким образом, я записал функцию, которая получает имя пакета, как введено и использование dpkg проверки, если это установлено и печатает соответствующий вывод. Вот одна версия этой функции:

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

который хорошо работает, когда пакет установлен. Но когда это не установлено, это так или иначе не перенаправляет вывод к /dev/null и подсказки:

dpkg-query: no packages found matching foo-bar

Во второй попытке, я modifed тело функции для использования его с grep -q:

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

Когда пакет установлен, снова это, кажется, хорошо работает, однако, когда пакет не найден и нежелательное сообщение от dpkg появляется на терминале:

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

Используя непосредственно dpkg-query результаты в подобной проблеме. Как сделать это тихим, когда этому не удается найти пакет?

3
задан 27 November 2015 в 16:00

2 ответа

Используя dpkg -l $1 и проверка кода возврата говорит ничто о состоянии установки пакета.

Использование awk и dpkg -l и проверка состояние ii

dpkg -l | awk '/^ii +'"$1"' +/'
<час>

Пример

$ 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>

или

$ package="mc"
$ dpkg -l | awk '/^ii +'"$package"' +/ {print $2}'
mc
1
ответ дан 1 December 2019 в 17:00

Вы хотите перенаправить и стандартный вывод (stdout) и стандартную погрешность (stderr) к /dev/null. Чтобы сделать это, замените > &>. Это - ярлык, характерный для bash. Таким образом, Ваш код был бы:

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

Однако это все еще считало бы пакет, как устанавливаемый, если он был удален, но файлы конфигурации остались (как указано @A.B.). Вместо этого Вы могли попробовать

check_dependency() { 
    # Get the number of packages installed that match $1
    num=$(dpkg -l "$1" 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 $1
    else
        # print something saying it was not found
    fi
}
1
ответ дан 1 December 2019 в 17:00

Другие вопросы по тегам:

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