[РЕШЕНО] Перенаправление консольного вывода в буфер в памяти: реализация на Lua

Задача следующая - перенаправить вывод команды pacman -Qu в таблицу строк Lua.

Делаю виджет, отображающий список доступных обновлений, и пока эта задача реализована так

1. Каждые 5 минут cron синхронизирует базу

pacman -Syy

а так же выводит список доступных обновлений в текстовый файл

pacman -Qu > updates.lst

2. Далее lua-скрипт в conky читает этот файл в таблицу строк и парсит полученную структуру

Вопрос - как можно обойтись без промежуточного вывода в файл

Текст скрипта

require	'cairo'
----------------------------------------------------------------------------------
--	Функция отрисовки, вызываемая из conky
----------------------------------------------------------------------------------
function conky_startlua()
if conky_window == nil then return end
-- Создаем поверхность для рисования
local cs = cairo_xlib_surface_create (conky_window.display, conky_window.drawable, conky_window.visual, conky_window.width, conky_window.height)
-- Создаем ресурс для рисования
cr = cairo_create (cs)
-- Открываем для чтения файл со списком пакетов
f = io.open("/home/maisvendoo/.conky/updates.lst", "r")
-- Создаем пустую таблицу пакетов
local pkg = {}
-- Читаем список обновлений в таблицу
-- одновременно читая их количество
local num_pkg = 0
for line in f:lines() do
  pkg[num_pkg] = line
  num_pkg = num_pkg + 1
end
-- Вывод на экран
-- Заголовок
local title = "Доступные обновления ("..num_pkg..")"
cairo_select_font_face(cr, 'Arial', 0, 0)
cairo_set_font_size(cr, 18)
cairo_set_source_rgba(cr, 1, 1, 1, 1)
cairo_move_to(cr, 10, 50)
cairo_show_text(cr, title)
-- Список
local extents = cairo_text_extents_t:create()
local tx = 10
local ty0 = 100
local ty = ty0
local max_tw = 0
cairo_select_font_face(cr, 'Terminus', 0, 0)
cairo_set_font_size(cr, 15)
cairo_set_source_rgba(cr, 1, 1, 1, 1)
for j = 0, num_pkg - 1 do
  -- Цвет по умолчанию
  cairo_set_source_rgba(cr, 0.7, 0.7, 0.7, 1)
  -- Выбираем цвет в зависимости от типа обновления
  -- Ядро
  if string.find(pkg[j], "linux") ~= nil then
    cairo_set_source_rgba(cr, 1, 0, 0, 1)
  end
  -- Система инициализации
  if string.find(pkg[j], "systemd") ~= nil then
    cairo_set_source_rgba(cr, 1, 0.5, 0, 1)
  end
  -- Офисный пакет
  if string.find(pkg[j], "libre") ~= nil then
    cairo_set_source_rgba(cr, 0, 0.5, 0, 1)
  end
  -- Разработка на java
  if (string.find(pkg[j], "java") ~= nil) or (string.find(pkg[j], "jre") ~= nil) then
    cairo_set_source_rgba(cr, 0, 1, 1, 1)
  end
  -- Разработка на C/C++
  if (string.find(pkg[j], "gcc") ~= nil) or (string.find(pkg[j], "glibc") ~= nil) then
    cairo_set_source_rgba(cr, 0.35, 0.0, 0.62, 1)
  end
  -- Драйвера NVidia
  if string.find(pkg[j], "nvidia") ~= nil then
    cairo_set_source_rgba(cr, 0, 1.0, 0, 1)
  end
  cairo_text_extents (cr, pkg[j], extents)
  cairo_move_to(cr, tx, ty)
  cairo_show_text(cr, pkg[j])
  if extents.width > max_tw then max_tw = extents.width end
  ty = ty + extents.height + 2
  if ty > conky_window.height - ty0 then
    ty = ty0
    tx = tx + max_tw + 5
  end
end
io.close(f)
end
Да пребудет с нами Сила...!
CPU Intel Core i9 10900-KF/RAM DDR4 128 Gb/NVidia GForce GTX 1080 Ti Turbo 11Gb/SSD M2 512 Gb/HDD Seagate SATA3 2 Tb/HDD Toshiba 3Tb/HDD Toshiba 6Tb
http://rusrailsim.org
Ну, как мне кажется, нужно просто использовать в вашем случае
os.execute ("pacman -Qu")
serkhay
Ну, как мне кажется, нужно просто использовать в вашем случае
os.execute ("pacman -Qu")

Вывод выполняется в консоль, а возвращаемое этой функцией значение носит характер статусного. Интересует возможность возвратить в какую-либо переменную результат выполнения консольной команды
Да пребудет с нами Сила...!
CPU Intel Core i9 10900-KF/RAM DDR4 128 Gb/NVidia GForce GTX 1080 Ti Turbo 11Gb/SSD M2 512 Gb/HDD Seagate SATA3 2 Tb/HDD Toshiba 3Tb/HDD Toshiba 6Tb
http://rusrailsim.org
Тогда присмотритесь к функции io.popen
serkhay
Тогда присмотритесь к функции io.popen

Йеее-ссс! Спасибо огромное!

Получилось, кусок кода реализующий это, работать оказывается так же как и с файлом :)
f_pipe = io.popen("pacman -Qu")
-- Создаем пустую таблицу пакетов
local pkg = {}
-- Читаем список обновлений в таблицу
-- одновременно читая их количество
local num_pkg = 0
for line in f_pipe:lines() do
  pkg[num_pkg] = (num_pkg+1)..". "..line
  num_pkg = num_pkg + 1
end
io.close(f_pipe)

А вот результат
Да пребудет с нами Сила...!
CPU Intel Core i9 10900-KF/RAM DDR4 128 Gb/NVidia GForce GTX 1080 Ti Turbo 11Gb/SSD M2 512 Gb/HDD Seagate SATA3 2 Tb/HDD Toshiba 3Tb/HDD Toshiba 6Tb
http://rusrailsim.org
Кстати, если вы любите lua, попробуйте awesome wm. У него из коробки, помимо прочего, есть вся функциональность conky и даже больше. Хотя conky я и не понимаю, рабочий стол у меня всегда перекрыт окнами
serkhay
Кстати, если вы любите lua, попробуйте awesome wm. У него из коробки, помимо прочего, есть вся функциональность conky и даже больше. Хотя conky я и не понимаю, рабочий стол у меня всегда перекрыт окнами

C Lua я играюсь дня три :) Но мне понравилось :)
Да пребудет с нами Сила...!
CPU Intel Core i9 10900-KF/RAM DDR4 128 Gb/NVidia GForce GTX 1080 Ti Turbo 11Gb/SSD M2 512 Gb/HDD Seagate SATA3 2 Tb/HDD Toshiba 3Tb/HDD Toshiba 6Tb
http://rusrailsim.org
maisvendoo
serkhay
Кстати, если вы любите lua, попробуйте awesome wm. У него из коробки, помимо прочего, есть вся функциональность conky и даже больше. Хотя conky я и не понимаю, рабочий стол у меня всегда перекрыт окнами

C Lua я играюсь дня три :) Но мне понравилось :)
А как в conky прописываешь lua?
Последний крик моды - эхо 30-летней давности.
tchgefest
А как в conky прописываешь lua?

Вот конфиг
#background no
own_window yes
own_window_type normal
own_window_transparent yes
#own_window_color 000000
own_window_argb_visual yes
own_window_argb_value 128
own_window_hints undecorated,below,sticky,skip_taskbar,skip_pager
# Шрифт
use_xft yes
#xftfont Terminus:size=10
# Включаем двойную буфферизацию
double_buffer yes
# Включаем тени
#draw_shades yes
# Задаем дефоолтные цвета
#default_color white
#default_shade_color black
#default_outline_color blue
# Положение на экране
alignment top_left
gap_x 20
gap_y 400
# Минимальный размер окна
minimum_size 1560 630
# Период обновления
update_interval 0.5
lua_load ~/.conky/lua_updates.lua
lua_draw_hook_pre startlua
TEXT

Собственно

lua_load - грузит скрипт расположенный по указанному пути

lua_draw_hook_pre - задает имя функции, вызываемой при перерисовке окна conky

Сам conky должен быть собран с поддержкой Lua, для этого надо установить из AUR пакеты toluapp и conky-lua. Conky из репозитория собрана без поддержки Lua

Вообще же есть хороший мануал, лежащий здесь, в формате PDF, я пользовался именно им
Да пребудет с нами Сила...!
CPU Intel Core i9 10900-KF/RAM DDR4 128 Gb/NVidia GForce GTX 1080 Ti Turbo 11Gb/SSD M2 512 Gb/HDD Seagate SATA3 2 Tb/HDD Toshiba 3Tb/HDD Toshiba 6Tb
http://rusrailsim.org
 
Зарегистрироваться или войдите чтобы оставить сообщение.