如何将shell脚本的输出存储在conky中的变量中?

问题描述

所以我要使用 sensors 命令获取 cpu 核心温度。

在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,并使用变量的任意名称 texeci 传感器表达式以评估、保存和返回。以 get 开头的行调用 myfunction 以获取值。

lua_barexec_bar 类似,但调用 lua 函数,参见 man conky。但是,它需要一个没有 + 接受的前导 exec_bar 的数字,因此我更改了 awk 以返回它,并将 °C 添加到 conky 文本中相反。