Script de clima para polybar apresentando erro ao executar

Estou usando um script na polybar que mostra algumas informações sobre o clima, mas está dando esse erro:


Alguém sabe o que pode ser?


Script: GitHub - GuidoFe/weather-polybar-plugin: Weather plugin for the polybar panel

Forneceu e/ou se cadastrou para obter sua chave Weather API - OpenWeatherMap, definindo no ~/.owm-key como instruí o script?


Para saber o porque do erro Bash script: Unary operator expected

Sim:
imagei


image

Como sugere o link do @null, uma das variáveis na linha 131 ($CODE ou $RESPONSECODE) está vazia.

Se for para eu chutar o motivo, é que você não instalou o jq (uma dependência não tão comum assim), que é utilizado para computar $RESPONSECODE, mas para eu ter certeza disso eu tenho que aguardar validarem minha API key amanhã, ou receber a saída de bash -x ./caminho/pro/weather-plugin.sh.

Olhei aqui, pior que o jq tá instalado sim:
image

A minha chave foi validada, e quando testei o script funciona pra mim.

Para ver o problema específico, traga a saída do script rodado do terminal com bash -x, como eu falei na resposta anterior. Isso mostra cada linha que é executada pelo shell.

Se fosse eu, já teria reescrito o script em Python ou alguma outra linguagem que lida melhor com dados estruturados.

Experimente fazer uma chamada à API, para verificar se sua chave é valida, acesse do seu navegador https://api.openweathermap.org/data/2.5/weather?appid=API-KEY


Experimente com outro modulo → GitHub - kamek-pf/polybar-forecast: A weather forecast module for Polybar


E assim como o @Capezotte, aqui também funciona, e como indicado execute com bash -x weather-plugin.sh para tentar rastrear o possível erro…


Verifique se também está instalado o utilitário bc que também consta como dependência…

Com a api key está tudo certo e o utilitário bc está instalado também

Pergunta obvia, mas vai saber, você tem o curl instalado?

Acho que a prioridade é rodar o bash -x

sim.
image

0 erros

O que tá acontecendo agora é que quando inicio o sistema ele aparece aquele erro que postei no tópico, mas depois de uns 30 segundos tudo funciona perfeitamente.

vai entender…

Testei aqui, e rodar esse script sem conexão com a internet faz o erro citado aparecer (e outros mais).

Acho que são os primeiros 30s antes da conexão com a internet ser plenamente estabelecida.

1 curtida

Como já notado, não tem um tratamento se não houver conexão, em analise rápida, notei que na linha 128, se a variável é zero, o código de resposta é definido baseando-se na resposta solicitada através do curl onde sem conexão o deixa vazio, e sua verificação posterior causa muitos erros… Portanto você pode simplesmente adicionar na segunda linha a opção set -e onde se houver error o script sai imediatamente, e suprimira estes avisos… Ou se preferir poderá aplica o patch de correção abaixo, à qual adicionei uma linha de verificação caso o código de resposta seja vazio ele define como 503 (Serviço Temporariamente Indisponível), e uma mensagem indicando o código do erro é exibida…

--- a/weather-plugin.sh
+++ b/weather-plugin.sh
@@ -128,6 +128,7 @@ function getData {
     if [ $CODE -eq 0 ]; then
         RESPONSECODE=`echo $RESPONSE | jq .cod`
     fi
+    [ -z $RESPONSECODE ] && RESPONSECODE=503
     if [ $CODE -ne 0 ] || [ $RESPONSECODE -ne 200 ]; then
         if [ $CODE -ne 0 ]; then
             ERR_MSG="curl Error $CODE"
@@ -325,5 +326,5 @@ if [ $ERROR -eq 0 ]; then
     setIcons
     outputCompact
 else
-    echo " "
+    echo $ERR_MSG
 fi

Para aplicar o patch, copie o acima e salve como weather-plugin.patch dentro do diretório contendo o script, depois execute git apply weather-plugin.patch. Lembrando isto foi feito de forma rápida e não quis alterar muito o código, alem de existirem dezenas de melhores formas para corrigi-lo…

2 curtidas

Não seria melhor adicionar um while loop com sleep dentro que só saia quando a conexão com internet for detectada?

Como citei

Alem que um “loop while” poderia ficar executando infinitamente se não o tratar, pois essa conexão pode nunca vir a acontecer… O que poderia ser feito sem alterar quase todo o código, seria chamar no inicio uma função para verificar se está conectado com uma opção de “timeout”, onde executaria X vezes e caso a conexão não ocorra retorna saindo, para evitar ficar em "loop infinito"…

Funcionou certinho o patch, bem melhor do que aquele caminho gigante mostrando o errro, obg!

Legal, que o patch lhe foi útil, só não entendi o motivo da escolha da resposta tida como solução, onde a mesma aponta para à causa do erro, e a resposta com o patch aponta para de forma simples para à sua “solução”. :thinking:

1 curtida

Eu acabei de propor uma solução diferente no GitHub do projeto. O código não faz CODE=$? imediatamente após chamar o curl, deixando a variável “se contaminar” com (a ausência de) erros dos demais comandos ([, echo, etc.).

Eu movi essa linha e coloquei um valor padrão para $RESPONSECODE (parecido com a solução do @null).

:clap: Agora somente aguardar o “merge”

* Ótima abordagem com operador de atribuição…