问题描述
在conky里面,我写了
$Core 0 Temp:$alignr${execi 1 sensors | grep 'Core 0' | awk {'print $3'}} $alignr${execibar 1 sensors | grep 'Core 0' | awk {'print $3'}}
每一秒我都在两个地方运行完全相同的命令 sensors | grep 'Core 0' | awk {'print $3'}
以获得完全相同的输出。有没有办法将输出保存在变量中并使用该变量代替命令。
解决方法
conky
没有用户变量。你可以做的是从 conky 调用 lua 来为你做这件事。 lua 语言通常默认内置于 conky 中,因此您只需将一些代码放入文件中,将该文件包含在 conky 设置文件中,并调用该函数。例如,这些 shell 命令将创建一个测试:
cat >/tmp/.conkyrc <<\!
conky.config = {
lua_load = '/tmp/myfunction.lua',minimum_height = 400,minimum_width = 600,use_xft = true,font = 'Times:size=20',};
conky.text = [[
set ${lua myfunction t ${execi 1 sensors | awk '/^Core 0/{print 0+$3}'}}°C
get ${lua myfunction t}°C ${lua_bar myfunction t}
]]
!
cat >/tmp/myfunction.lua <<\!
vars = {}
function conky_myfunction(varname,arg)
if(arg~=nil)then vars[varname] = conky_parse(arg) end
return vars[varname]
end
!
conky -c /tmp/.conkyrc -o
在 myfunction.lua
文件中,我们声明了一个函数 myfunction()
(需要以 conky_
为前缀,以便我们可以从 conky 调用它)。它需要 2 个参数、一个变量名和一个 conky 表达式。它调用 conky_parse()
来计算表达式,并将值保存在表 vars
中,以调用者提供的名称命名。然后它将结果值返回给调用者。如果没有给出表达式,它将返回之前的值。
在 conky.text
中,以 set
开头的行调用 lua 中的 myfunction
,并使用变量的任意名称 t
和 execi
传感器表达式以评估、保存和返回。以 get
开头的行调用 myfunction
以获取值。
lua_bar
与 exec_bar
类似,但调用 lua 函数,参见 man conky
。但是,它需要一个没有 +
接受的前导 exec_bar
的数字,因此我更改了 awk
以返回它,并将 °C
添加到 conky 文本中相反。