私の状況

私の状況

私の状況

以下にいくつかの新しいデバイスファイルをインストールしました。$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; }

ローカルコンピュータでもファイルを見つけることができます。私の場合はlocatedでしたが、/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私のリストには1つ以上の単位があるので、これを含みます。.socket

  • obex|rygel|wireplumber選択したくないユニットのリストです。拒否リストの代わりにホワイトリストを使用するには、!最初から削除する必要があります。

| gum choose質問に書いたように、ガムでこれをさらに進化させたので、スクリプトはawkに従います。これはあなたが見るときに意味があります。プロジェクトの場所

関連情報