Мне часто приходится обновлять записи DNS, и мне нужно точно знать, когда начнется обновление (также известное как истечение срока TTL). Я придумал этот однострочник bash, который дает мне желаемый результат:
$ dig +noall +answer www.google.com | \
> awk '{ print $2 }' | \
> { read secs; echo "`expr $secs / 60`m `expr $secs % 60`s remaining ($secs)"; }
вывод:
3m 36s remaining (216)
Я бы хотел обернуть watch
команду вокруг этого, чтобы я мог оставить ее работающей в терминале и получить обратный отсчет в реальном времени. Что-то вроде:
$ watch -n 10 "dig +noall +answer www.google.com | \
> awk '{ print $2 }' | \
> { read secs; echo '`expr $secs / 60`m `expr $secs % 60`s remaining ($secs)'; }"
Но это просто приводит к появлению нефункционального экземпляра часов, за которым следует:
expr: syntax error
Я почти уверен, что это какая-то проблема с конвейером / цитированием, и я не так хорошо разбираюсь в тонкостях. Ради переносимости я бы предпочел оставить его однострочным, а не прибегать к сценарию, требующему сохранения на диск. Кто-нибудь знает, как это сделать?
Проблема с синтаксической ошибкой, потому что вы забыли избежать backstick
характер, double quote
персонаж. И не забудьте убежать dollar sign
Кроме того, значение $ secs передается в expr
, если вы этого не сделаете, в stdout не будет вывода:
watch -n 10 "dig +noall +answer www.google.com | \
awk '{print\$2}' | \
{ read secs; echo \"\`expr \$secs / 60\`m \`expr \$secs % 60\`s remaining (\$secs)\"; }"
Почему бы не позволить AWK выполнить вычисления и печать?
watch -n 10 'dig +noall +answer google.com | awk '\''{print int($2 / 60) "m", $2 % 60 "s remaining", "(" $2 ")"; exit}'\'''
Прежде всего вам нужно избегать использования expr. Используется редко. Вместо этого у меня есть версия, которая делает то же самое. Не сильно отличается от приведенного выше:
watch -n1 'dig +noall +answer google.com | \
awk "{print \$2}" | \
{ read secs; echo "$((secs / 60 ))m $((secs % 60))s remaining $((secs))";}'
Другой подход, который можно использовать, используя tmux
или screen
while sleep 1; do dig +noall +answer google.com | \
{ while read -r secs; do echo "$((secs / 60 ))m $((secs % 60))s remaining $((secs)) seconds"; done < <(awk '{print $2}' | \
head -n1 ); }; done
Удачи.
Мне кажется, это работает.
watch -n 10 "dig +noall +answer www.google.com | \
awk '{print \$2}' | \
{ read secs; echo \"\$((\$secs / 60))m \$((\$secs % 60))s remaining\"; }"
или, альтернативно, цитируется, чтобы избежать такого беспорядка:
watch -n 1 'dig +noall +answer www.google.com | \
awk "{print \$2}" | \
{ read secs; echo "$(($secs / 60))m $(($secs % 60))s remaining"; }'