我的情况
我在下面安装了一些新的单元文件$HOME/.local/share/systemd/user/
ls -1 $HOME/.local/share/systemd/user/
some.service
some.timer
some_other.service
我运行了以下命令以正确加载它们:systemctl --user daemon-reload
它们出现在 的自动完成中systemctl --user enable <tab> <tab>
。我正在寻找的是一种稍后编写脚本的方法胶向我显示当前未启用的那些单元的列表以启用它们。
我的问题
ls -1 $HOME/.local/share/systemd/user/
还有比获取我正在寻找的列表更好的方法吗?
systemctl
通过自动完成了解单位,但对于一个看似相当简单的问题,我不想那么深入。我在看systemctl 列出所有可能的(包括禁用的)服务以及 Systemd 文档的某些部分,但我还无法找到我想要的内容。它不一定是完美的,自动完成列表还有一些我可以过滤掉的其他条目。这对我来说不会是问题。
答案1
一般来说,systemctl --user list-unit-files
显示所有用户服务的列表。
因此,您可以运行以下命令来获取禁用的用户服务列表:
systemctl --user --full --no-legend --no-pager list-unit-files --state=disabled
顺便说一句,你可以看看bash补全文件 查看systemctl
它如何获取禁用服务列表,这非常相似:
__systemctl() {
local mode=$1; shift 1
systemctl $mode --full --legend=no --no-pager --plain "$@" 2>/dev/null
}
[...]
__get_disabled_units() { __systemctl $1 list-unit-files "$2*" \
| while read -r a b c ; do [[ $b == "disabled" ]] && echo " $a"; done; }
您还可以在本地计算机上找到该文件。就我而言,它位于/usr/share/bash-completion/completions/systemctl
,但我不确定它是否是所有发行版的标准路径。
答案2
aviro 的回答激励我花更多的时间在这上面。这就是我现在想出的:
SYSTEMD_COLORS=no systemctl list-unit-files \
--full \
--no-legend \
--no-pager \
--state=disabled \
--type=service,timer \
--user \
| sort \
| awk '!/^(obex|rygel|wireplumber)(@)?\.(service|timer)/ {print $1}'
您不需要
SYSTEMD_COLORS=no
,systemctl 本身应该检测到其输出已发送到管道,但我将其留在这里供将进一步试验代码的读者使用。我之所以将其列入,是因为我的清单中
--type=service,timer
至少有一个单位。.socket
obex|rygel|wireplumber
是我不想选择的单位列表。如果要使用允许列表而不是拒绝列表,则需要!
在开始时删除。
| gum choose
正如我在问题中所写,我用口香糖进一步处理这个问题,所以我的脚本中紧接着 awk 。当您查看时,这是有道理的项目地点。