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
Estou usando um script na polybar que mostra algumas informações sobre o clima, mas está dando esse erro:
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:
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:
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.
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.
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…
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”.
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).
Agora somente aguardar o “merge”…
* Ótima abordagem com operador de atribuição…