내 상황
아래에 몇 가지 새로운 장치 파일을 설치했습니다.$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를 따릅니다. 이것은 당신이 볼 때 의미가 있습니다.프로젝트 장소.