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
    …
Другие вопросы по тегам