Por que o redirecionamento da saída afeta o resultado de um teste no bash?
-
11-12-2019 - |
Pergunta
Estou tentando escrever um script para iniciar o xfce e o xbmc em suas próprias sessões x.
Para fazer isso estou configurando o DISPLAY
valor, executando o primeiro em segundo plano e aguardando até obter um retorno bem-sucedido de xset q
.Então eu mudo DISPLAY
e faça o mesmo com o outro.
Estou escrevendo isso peça por peça para verificar se tenho a sintaxe correta para cada parte e a parte em que estou preso é 'esperar até obter um retorno bem-sucedido de xset q
.
export DISPLAY=":0.0"
while [[ ! `xset q` ]]
do
echo -n "."
done
Este código parece funcionar, então quando o XFCE está em execução ele sai imediatamente e quando não está, ele fica imprimindo .xset: unable to open display ":0.0"
No entanto, não quero ver a saída de xset
então estou tentando redirecionar sua saída.
export DISPLAY=":0.0"
while [[ ! `xset q > /dev/null 2>&1` ]]
do
echo -n "."
done
Adicionar esse redirecionamento, no entanto, parece interromper a detecção e, independentemente de o XFCE estar em execução ou não, ele apenas fica imprimindo pontos.
Eu testei os dois comandos por conta própria e em um script de shell por conta própria, ambos funcionam como esperado, retornando 1 quando o XFCE não está em execução e 0 quando está.
Alguém pode explicar por que colocar esse comando dentro de [[ ! `…` ]]
quebra o while
teste e como eu poderia reescrever isso while
loop corretamente?
(Executando no Arch)
Solução
O problema é que você não está testando o código de retorno de xset
em tudo, você processa sua saída.Quando você redireciona a saída para /dev/null
, a expressão em crases não retorna nada, é como se você tivesse:
while [[ ! '' ]] ...
que sempre executará o while
corpo.
O que você deveria fazer é:
while ! xset q > /dev/null 2>&1
do
...
done