내 상황

내 상황

내 상황

아래에 몇 가지 새로운 장치 파일을 설치했습니다.$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내 목록에 하나 이상의 단위가 있기 때문에 이것을 포함합니다 ..socket

  • obex|rygel|wireplumber선택하고 싶지 않은 단위의 목록입니다. 거부 목록 대신 허용 목록을 사용하려면 !처음부터 삭제해야 합니다.

| gum choose질문에 썼듯이 껌으로 이것을 더 발전시켰기 때문에 스크립트가 awk를 따릅니다. 이것은 당신이 볼 때 의미가 있습니다.프로젝트 장소.

관련 정보