Почему перенаправление вывода влияет на результат теста в bash?

StackOverflow https://stackoverflow.com//questions/12651750

Вопрос

Я пытаюсь написать сценарий для запуска 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top