ao não executar o comando agendado - solução de problemas

ao não executar o comando agendado - solução de problemas

Estou escrevendo este script bash, que lerá um arquivo contendo uma data, uma hora e um número de telefone, e usará uma API de provedor de SMS para enviar um lembrete por SMS.

#!/bin/bash

while read date time phone
do

user=user
pass=pass
senderid=senderid
message=Your%20appointment%20is%20at%20$date%20$time.%20For%20cancellations%20call%2096989898.%20Thank%20you.
api="https://sms.service.com/Websms/sendsms.aspx?User=$user&passwd=$pass&mobilenumber=357$phone&message=$message&senderid=$senderid&type=0"

curl -k $api

done < ~/sms_reminders/events/events_$(date +%d-%m-%y)

Quando executo assim, recebo um SMS imediatamente. Mas quero agendar o lembrete para sair em um horário específico. Então eu mudo o script para isso.

#!/bin/bash

while read date time phone
do

user=user
pass=pass
senderid=senderid
message=Your%20appointment%20is%20at%20$date%20$time.%20For%20cancellations%20call%2096989898.%20Thank%20you.
api="https://sms.service.com/Websms/sendsms.aspx?User=$user&passwd=$pass&mobilenumber=357$phone&message=$message&senderid=$senderid&type=0"

echo curl -k $api | at $time

done < ~/sms_reminders/events/events_$(date +%d-%m-%y)

E recebo uma mensagem dizendo

warning: commands will be executed using /bin/sh
job 22 at Fri Jun  6 21:46:00 2019

Qual é bom.

Mas nunca recebo o SMS.

Meu palpite é que o problema tem algo a ver com sh, mas não tenho como ter certeza porque at não gera realmente um arquivo de log informando se o comando foi concluído com sucesso ou não.

Responder1

Você pode expandir os parâmetros para dizer ao Bash para citar a apivariável:

${parameter@operator}
A expansão é uma transformação do valor do parâmetro ou uma informação sobre o próprio parâmetro, dependendo do valor do operador. Cada operador é uma única letra:

  • Q A expansão é uma string que é o valor do parâmetro citado em um formato que pode ser reutilizado como entrada.

Então:

echo curl -k "${api@Q}" | at "$time"

Se você escapar das aspas como em echo curl -k \"$api\", a expansão de apisofrerá divisão de campo e expansão de curinga, o que pode causar problemas dependendo do conteúdo. Portanto, é melhor citá-lo normalmente "${api}"e dizer ao bash para citá-lo novamente para entrada usando "${api@Q}".

Para referência, com a entrada de exemplo, a saída é:

$ echo curl -k "${api@Q}"
curl -k 'https://sms.service.com/Websms/sendsms.aspx?User=user&passwd=pass&mobilenumber=357&message=Your%20appointment%20is%20at%20%20.%20For%20cancellations%20call%2096989898.%20Thank%20you.&senderid=senderid&type=0'

Observe as aspas simples adicionadas ao URL na saída.

Responder2

Eu tive que fazer assim

echo curl -k \"$api\" | at $time

informação relacionada