2015-11-13 1 views
2

На моей машине CentOS я написал сценарий, который сообщает мне, установлена ​​ли служба или нет. Вот сценарийУдалить chkconfig заголовок с вывода

count=$(chkconfig --list | grep -c "$1") 
if [ $count = 0 ]; then 
    echo "False" 
else 
    echo "True" 
fi 

Проблема заключается в том, что вывод команды всегда включает в себя начальные строчки chkconfig вывода. Например вот выход script.sh network

[[email protected] ~]# ./script.sh network 

Note: This output shows SysV services only and does not include native 
     systemd services. SysV configuration data might be overridden by native 
     systemd configuration. 

     If you want to list systemd services use 'systemctl list-unit-files'. 
     To see services enabled on particular target use 
     'systemctl list-dependencies [target]'. 

True 

кажется, что переменная счетчик правильно содержит счетчик Grep вхождений но сценарий будет всегда выводится строки заголовка chkconfig, даже если я повторяю только «True» или «Ложное "в скрипте.

Почему это происходит? И как скрыть эти строки?

ответ

5

Это потому, что chkconfig --list первоначально возвращает заголовок через stderr. Просто молчанию с помощью 2>/dev/null:

count=$(chkconfig --list 2>/dev/null | grep -c "$1") 
#      ^^^^^^^^^^^ 

Заметим также, что весь if/else блок может быть сведена к простой:

chkconfig --list 2>/dev/null | grep -q "$1" && echo "True" || echo "False" 

Поскольку мы используем -q вариант grep который (от man grep) делает немедленно выйдите с нулевым статусом, если найдено совпадение.

+0

Perfect. Я тестировал это эквивалентное (но менее элегантное) решение, просто для удовольствия. 'chkconfig --list 2>/dev/null | grep -c "$ 1">/dev/null && echo "True" || echo «False» ' – gvdm

+0

Да, это тоже прекрасно, хотя второй'>/dev/null' не нужен, потому что 'grep -c' вряд ли вернет какой-либо stderr на такой канал. – fedorqui

+0

Я положил '>/dev/null', потому что' grep -c '$ 1 "' будет выводить количество вхождений в противном случае – gvdm