Если я правильно понял ваши требования, это похоже на работу, с которой sed
может справиться хорошо благодаря своей способности разграничивать «подпотоки -» в своем входном потоке.
Это должно быть POSIX:
sed -n "/^define service/,/^}/{/^[[:blank:]]\\{1,\}host_name[[:blank:]]\\{1,\\}${V_MAQUINA}/,/^}/{\\%^[[:blank:]]\\{1,\\}check_command[[:blank:]]\\{1,\\}${V_NAGIOS_COMMAND}%{p;q}}}" file
или, если вы можете использовать GNU sed, для меньшего экранирования в строке:
sed -En "/^define service/,/^\\}/{/^[[:blank:]]+host_name[[:blank:]]+${V_MAQUINA}/,/^\\}/{\\%^[[:blank:]]+check_command[[:blank:]]+${V_NAGIOS_COMMAND}%{p;q}}}" file
Объяснение:
sed -En # use Extended Regular Expressions, and don't print by default
# main `sed` script for entire stream
/^define service/,/^\\}/ # between 'define service' and '}'
{ # sub-stream: between specified 'host_name' and '}'
/^[[:blank:]]+host_name[[:blank:]]+${V_MAQUINA}/,/^\\}/
{ # look for specified 'check_command', using '%' because '/' can be in command
\\%^[[:blank:]]+check_command[[:blank:]]+${V_NAGIOS_COMMAND}%
{p;q} # if found, print line and quit `sed`
}
}
Это печатает строку check_command
, если она найдена в «фрагменте» file
, разделенном регулярными выражениями, или вообще ничего, если не найдена.
Таким образом, вы можете просто проверить наличие или отсутствие возвращаемой строки.
Не проверяйте статус выхода, потому что sed
возвращает 0 даже тогда, когда ничего не печатается.
Несколько дополнительных замечаний:
\\
для выражения одного \
, потому что мы находимся внутри двойных -кавычек оболочки $V_MAQUINA
и$V_NAGIOS_COMMAND
%
в качестве разделителя регулярного выражения в последнем регулярном выражении, но вы можете выбрать любой символ, который не будет присутствовать в вашей $V_NAGIOS_COMMAND
переменной Изучите вместе с diff
результаты env | sort
в двух средах. $DISPLAY
нужно проверить.
Также читайте man isatty
.
Если вы запускаете ps axu
, найдите в столбце TTY корневую «консоль», которую использует процесс.
У каждого процесса есть родитель, работающий до корневого процесса инициализации
Это похоже на возможную проблему XY.
Старая команда Unix tty
может сообщить вам, на каком устройстве работает ваш терминал. Так что что-то вроде этого может сделать то, что вы просите:
if [ $(tty) = "/dev/console" ]; then
echo "Yes, I am on the console."
else
echo "No, I am not on the console."
fi
Однако программа, запущенная в сеансе входа в виртуальную консоль Linux, вместо этого может увидеть /dev/tty1
или подобное. Если используется последовательная консоль, вы можете увидеть /dev/ttyS0
или другое устройство последовательного порта. Единственный раз, когда вы можете увидеть литерал /dev/console
, может быть при работе в режиме аварийной оболочки/однопользовательском режиме -. Знать, какие устройства (и )могут быть допустимыми консолями, непросто; это одна из причин, почему /etc/securetty
существует и настраивается системным администратором.
(Если вы решили отказаться от последовательных портов, системный администратор, пытающийся где-то использовать последовательное -соединение по -локальной сети для исправления очень удаленной системы, может вас ненавидеть.)
Если процесс или сценарий запускается как служба systemd
, он может вообще не иметь TTY в традиционном смысле; вместо этого его стандартный вывод и стандартная ошибка будут подключены к средству журналирования systemd
, которое может передавать или не передавать их на консоль во время загрузки в зависимости от того, как настроена служба.
Пожалуйста, отредактируйте свой вопрос, чтобы указать почему вы хотите знать, используете ли вы «консоль» или нет, чтобы мы могли попытаться найти способ получить ответ на ваш вопрос в некотором смысле это соответствует вашим реальным потребностям.