Conky. Использование if_match

Недавно в сообщении Важные новинки в conky я написал, что в последних версиях (с версии 1.7.0 и выше) появились новые интересные фичи. Одна из них: переменная if_match.

На самом деле это не переменная, а блок такого вида:

${if_match expr}
 True block
${endif}

${if_match expr}
 True block
${else}
 False block
${endif}

expr – это логическое выражение. Допускаются к использованию следующие операнды ‘>’, ‘<’, ‘>=’, ‘<=’, ‘==’, ‘!=’. Аргументами могут быть числа и строки. Для сравнения строк аргументы выражения должны быть заключены в кавычки. Если выражение истинно печатается true block. Сейчас я покажу как и для чего ее можно применять.

Индикатор свободного места с цветовой сигнализацией.

Индикаторы свободного места на разделах «жесткого диска» удобная штука – помогут вовремя заметить, когда раздел вот-вот переполнения. Сделать заметнее ситуацию когда раздел на грани переполнения поможет выделение индикатора красным цветом. Реализовать это средствами conky проще простого.

Нужно всего-лишь в конфигурационном файле в переменной TEXT перед индикатором добавить такую конструкцию и индикатор «покраснеет» как только свободного пространства станет меньше 10 процентов (пример для раздела /var):

${if_match ${fs_free_perc /var}&lt;10}${color red}${endif}

Для индикатора fs_bar и раздела /var будет иметь такой вид:

${if_match ${fs_free_perc /var}&lt;10}${color red}${endif}${fs_bar 5,25 /var}

Используя template можно эту запись сократить, например вот так:

Определяем template1:

Template1 \1: ${if_match ${fs_free_perc \1}&lt;10}${color red}${endif}${fs_bar 5,25 \1}

и используем в TEXT, например, таким образом (для разделов /, /var и /usr):

${template1 /} ${template1 /var} ${template1 /usr}

Индикатор батареи с цветовой сигнализацией.

Индикатор батареи battery_bar показывает сколько в батарейке еще осталось заряда. Но сейчас мы сделаем так что он у нас будет краснеть, желтеть или зеленеть в зависимости от текущего состояния. Если батарея заряжена индикатор зеленый, если заряжается – желтый, если ни то и не другое – красный.

Для этого в конфигурационном файле в перед индикатором батарейки добавим такую запись:

${if_match "${execi 10 ~/bin/conky/batt/batt.sh}" != "charged"}${if_match "${execi 10 ~/bin/conky/batt/batt.sh}" != "charging"}${color red}${else}${color yellow}${endif}${else}${color green}${endif}

То магическое заклинание, которое было добавлено в конфиг конки, обяжет его каждые 10 секунд вызывать скрипт ~/bin/conky/batt/batt.sh, который возвращает текущее состояние батареи.

Для моей системы скрипт выглядит так:

#!/bin/sh

sed '/^charging state:/!d; s/charging state:[ /t]*//' /proc/acpi/battery/C1AC/state

И обычно возвращает одно из этих состояний charged, charging, discharging (скорее всего вам придется его видоизменить).


Комментарии

  1. (#)   фримен:

    ${if_match ${cpu cpu0}%>70}${color #E32D1C}${else}${color #000000}${endif}
    в итоге в независимости с каким числом сраниваю выводится перым цветом,мб ктото подскажет в чем ошибка?
    $ conky -v
    Conky 1.8.0 compiled Fri Jul 29 20:16:26 UTC 2011 for Linux 2.6.39-2-amd64 (x86_64)

    Compiled in features:

    System config file: /etc/conky/conky.conf
    Package library path: /usr/lib/conky

    X11:
    * Xdamage extension
    * XDBE (double buffer extension)
    * Xft
    * ARGB visual

    Music detection:
    * MPD
    * MOC

    General:
    * math
    * hddtemp
    * portmon
    * Curl
    * RSS
    * Weather (METAR)
    * Weather (XOAP)
    * wireless
    * support for IBM/Lenovo notebooks
    * nvidia
    * eve-online
    * config-output
    * Imlib2
    * ALSA mixer support
    * apcupsd
    * iostats
    * ncurses
    * Lua

    Lua bindings:
    * Cairo
    * Imlib2

  2. (#)   фримен:

    все нашел решение.не понял логики но писать надо без знака %
    ${if_match ${cpu cpu0}>70}${color #E32D1C}${else}${color #000000}${endif}

  3. (#)   фримен:

    понял логику))я думал что знак % заставляет команду выводить результат в процентах,а он ее сразу выводит в процентах,но просто числом.

Оставить комментарий

Ответ на Conky. Использование if_match