Выполнить пользовательскую команду во всплывающей подсказке awesomewm

У меня есть простой виджет для отображения свободной памяти:

myFreeMemory = awful.widget.watch('bash -c "free -h | awk \'/^Mem:/ {print $3}\'"', 1)

Эта строка производит одно число.

Я хотел бы создать для него всплывающую подсказку, которая запускает пользовательскую команду:

local free_memory_tooltip = awful.tooltip
{
    objects        = { myFreeMemory },
    timer_function = function()
        return "free -h"
    end,
    font = "monaco 18",
    timeout=0,
    opacity=0.9,
    bg="#000000",
    fg="#ffffff",
    align="top_left"
}

Что я должен поставить вместо return "free -h", чтобы выполнить эту команду и вернуть текстовый вывод?


person light9876    schedule 05.01.2021    source источник


Ответы (1)


Самым простым решением может быть использование return io.popen("free -h"):read("*a"), но здесь используется io.popen, чего лучше избегать в AwesomeWM.

Лучшим решением может быть написать парсер для /proc/meminfo самостоятельно. Фу.

Промежуточное решение будет примерно таким:

local last_result = ""
local function my_timer_function()
    local cmd = "free -h | awk '/^Mem:/ {print $3}'""
    awful.spawn.easy_async_with_shell(cmd, function(result)
        last_result = result
        free_memory_tooltip:set_markup(last_result)
    end)
    return last_result
end
-- Call it once to initialise its state; otherwise you would get a brief flicker of empty text
my_timer_function()
person Uli Schlachter    schedule 05.01.2021