cron обрабатывает только половину скрипта
Сценарий :
curl -s http://api.ipify.org > ~/ip.txt && [[ -s ~/ip.txt ]] && ip=$(cat ip.txt) && echo $ip > ~/newIP.txt || echo WAN IP is blank: curl, latency or internet issue
# logger -s WAN IP is blank: curl, latency or internet issue
скрипт запускается только до:
curl -s http://api.ipify.org > ~/ip.txt && [[ -s ~/ip.txt ]] && ip=$(cat ip.txt)
другая часть игнорируется, НО, когда я вручную показываю скрипт из терминала, он выполняется правильно.
Я что-то не так делаю?
1 ответ
Это может быть дело вкуса, но я лично считаю, u > v && w && x > y || z
нечитаемые и особенно не отлаживаемые однострочники Если они работают, у них все хорошо, но в остальном, на мой взгляд, это ПИТА.
В вашем случае ошибка была ip=$(cat ip.txt)
частично, потому что cronjobs может иметь или не иметь текущий рабочий каталог, установленный в $HOME. Предыдущий … > ~/ip.txt
записывает файл в ваш $ HOME, но следующий cat ip.txt
пытается получить доступ к файлу ip.txt
откуда каталогcat
было начато в. Простое исправление будет заменятьcat ip.txt
с cat ~/ip.txt
,
Сказав это, я предлагаю следующее:
#!/usr/bin/env bash
if ip=$(curl -s -f http://api.ipify.org); then
echo "$ip" > ~/newIP.txt
else
echo "WAN IP is blank: curl, latency or internet issue"
fi
Это зависит от curl
возвращает неверное значение выхода (!=0), если он не может получить доступ к данному сайту. Если это не так, измените код на:
ip=$(curl -s -f http://api.ipify.org);
if [ "$ip" ]; then
…