在 conky_parse 中使用 cat 不起作用

在 conky_parse 中使用 cat 不起作用

我正在尝试在 conky 中显示我的 shell 的名称。我可以使用以下命令捕获 shell 的名称:

cat /proc/$$/comm

但是当我在我的文件中使用它时script.lua,如下所示:

text = 'Shell: ' .. conky_parse('${execi 3600 cat /proc/$$/comm}')

它只显示以下单词cat

在此处输入图片描述

我怎样才能解决这个问题?

答案1

我认为这是由于 shell 进行了优化。您的代码最终将运行

sh -c 'cat /proc/$$/comm'

并且 shell 会将 扩展$$为 shell 的 pid,然后决定由于没有更多命令需要执行,它将exec()执行cat而不是分叉为 exec 并等待子进程。

如果你运行上面的命令,你会看到这个,它会回复cat。但如果你添加另一个命令,例如

sh -c 'cat /proc/$$/comm; echo $$'

您将看到sh第二个命令。一个快速修复方法是使用<让 shell 在运行 cat 之前打开 proc 文件:

'${execi 3600 cat </proc/$$/comm}'

如果您想看到差异,请使用strace -f -o /tmp/trace sh -c '...'并查看跟踪输出。


不幸的是,conky 总是使用sh而不是 SHELL您在环境中设置的任何值来运行命令。因此,sh除非它是指向其他 shell 的链接,例如 ,否则您总会发现bash。简单的答案是:

 ${execi 3600 echo $SHELL}

或者如果你需要真正执行 shell 那么:

 ${execi 3600 exec $SHELL -c 'cat /proc/$$/comm;echo -n'}

相关内容