答案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'}