Я пишу сценарий, который проверяет на очень большой список зависимостей. Таким образом, я записал функцию, которая получает имя пакета, как введено и использование 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
результаты в подобной проблеме. Как сделать это тихим, когда этому не удается найти пакет?
Используя 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
Вы хотите перенаправить и стандартный вывод (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
}