2016-04-27 6 views
0

Я нашел здесь отличный ответ (Test if a command outputs an empty string)rpm --test никогда не возвращает непустую строку?

Я пытаюсь применить это к команде rpm -e -test. Я хочу иметь возможность проверять зависимости до размещения пакета в списке для удаления. Так что мой простой скрипт выглядит так до сих пор:

for PKG in pkg1 pkg2 
do 
if [[ $(rpm -e --test $PKG) ]]; then 
echo "there are dependencies for $PKG" 
else 
echo "remove $PKG" 
fi 
done 

Однако независимо от того, если пакет имеет зависимость или нет, я всегда проваливаюсь в случае других. Любые мысли о том, как это сделать по-другому?

ответ

4

Команда rpm -e --test вернет код выхода, указывающий, был ли тест успешным. Сравните это:

# rpm -e --test openssh 
error: Failed dependencies: 
    openssh is needed by (installed) connect-proxy-1.100-12.fc23.x86_64 
    openssh = 7.2p2-3.fc23 is needed by (installed) openssh-server-7.2p2-3.fc23.x86_64 
    openssh = 7.2p2-3.fc23 is needed by (installed) openssh-clients-7.2p2-3.fc23.x86_64 
    openssh = 7.2p2-3.fc23 is needed by (installed) openssh-askpass-7.2p2-3.fc23.x86_64 
# echo $? 
1 

Vs:

# rpm -e --test figlet 
# echo $? 
0 

Таким образом, вы можете написать:

for pkg in pkg1 pkg2; do 
    if rpm -e --test $pkg > /dev/null 2>&1; then 
    echo "remove package" 
    else 
    echo "$pkg has dependencies" 
    fi 
done 

Если возможно, то, как правило, лучше использовать коды выхода для определения успеха или неудачи (потому что выход часто проектируется , чтобы быть человеческим и может меняться от одного выпуска к другому).

+0

Спасибо! Я на самом деле пробовал это, но поступил не так. FYI, вы ставите «rpm -q», а не «rpm -e» в выражении if. Это отбросило меня на время :) –

+0

Упс, хороший патч. Исправлено. – larsks

Смежные вопросы