Почему перенаправление вывода влияет на результат теста в bash?
-
11-12-2019 - |
Вопрос
Я пытаюсь написать сценарий для запуска xfce и xbmc в их собственных сеансах x.
Для этого я устанавливаю DISPLAY
значение, запускаю первый в фоновом режиме и жду, пока не получу успешный возврат от xset q
.Тогда я меняю DISPLAY
и сделать то же самое для другого.
Я пишу это по частям, чтобы проверить, что у меня правильный синтаксис для каждой части, и часть, на которой я застрял, - это «ожидание, пока я не получу успешный возврат от xset q
.
export DISPLAY=":0.0"
while [[ ! `xset q` ]]
do
echo -n "."
done
Кажется, что этот код работает, поэтому, когда XFCE запущен, он немедленно завершает работу, а когда нет, он продолжает печатать. .xset: unable to open display ":0.0"
Однако я не хочу видеть результат xset
поэтому я пытаюсь перенаправить его вывод.
export DISPLAY=":0.0"
while [[ ! `xset q > /dev/null 2>&1` ]]
do
echo -n "."
done
Однако добавление этого перенаправления, похоже, нарушает обнаружение, и независимо от того, запущен XFCE или нет, он просто печатает точки.
Я протестировал обе команды по отдельности, и в сценарии оболочки они обе работают так, как я ожидаю, возвращая 1, когда XFCE не запущен, и 0, когда он запущен.
Может ли кто-нибудь объяснить, зачем помещать эту команду внутрь [[ ! `…` ]]
ломает while
тест и как я мог бы это переписать while
цикл правильно?
(Бег по Арке)
Решение
Проблема в том, что вы не тестируете код возврата xset
вообще, вы обрабатываете его вывод.Когда вы перенаправляете вывод на /dev/null
, выражение в обратных кавычках ничего не возвращает, как если бы у вас было:
while [[ ! '' ]] ...
который всегда будет запускать while
тело.
Что вам следует делать:
while ! xset q > /dev/null 2>&1
do
...
done