데스크탑 항목의 개별 필드를 재정의합니다.

데스크탑 항목의 개별 필드를 재정의합니다.

저는 데스크탑 환경으로 LXDE를 사용하여 Debian 시스템을 설정하고 있습니다(실제로는 방금라즈베리 파이 운영 체제영상).

함께 제공되는 애플리케이션이 있습니다..desktop문서. 시원한!

불행하게도 MyApplication.desktop파일에는 메뉴에 아이콘이 표시되지 않도록 하는 다음 줄이 포함되어 있습니다.

NoDisplay=true

이제 다른 필드를 건드리지 않고 전체 시스템 파일에서 이 단일 필드를 재정의하는 일반적인 방법을 찾고 싶습니다. MyApplication.desktop이를 재정의라고 생각하십시오.

특히, 나는 노력한다피하다이와 같은 해결 방법은...

sed -e 's/^NoDisplay=true/NoDisplay=false/' /usr/share/applications/MyApplication.desktop \
    > /usr/local/share/applications/MyApplication.desktop

...이렇게 하면 파일의 최신 업스트림 버전에서 도입된 변경 사항이 손실되기 때문입니다 ( 시스템에서 제거한 MyApplication.desktop후에도 메뉴 항목이 그대로 유지될 수 있음 ).MyApplication

분명히 표준은 부분적인 .desktop 파일만 허용하지 않습니다. 예를 들어 다음은 작동하지 않습니다.

$ cat /usr/share/applications/MyApplication.desktop
[Desktop Entry]
Name=My Cool Application
GenericName=My Application
Exec=myapp %f
Icon=myapp
Type=Application
Terminal=false
Categories=Application
NoDisplay=true

$ cat /usr/local/share/applications/MyApplication.desktop
[Desktop Entry]
NoDisplay=false

include마찬가지로 다음에 대한 메커니즘도 없습니다 .

$ cat /usr/local/share/applications/MyApplication.desktop
include=/usr/share/applications/MyApplication.desktop
[Desktop Entry]
NoDisplay=false

이를 달성하기 위한 나의 옵션은 무엇입니까?

답변1

.desktop 파일의 새 버전에 대해서는 별로 걱정하지 않습니다. 거의 변경되지 않습니다(변경할 경우 일반적으로 변경 사항은 매우 사소하며 필요한 경우 수동으로 쉽게 편집할 수 있습니다...또는 변경 사항과 함께 사용 diff및 병합할 수 있습니다).patch

이것이 걱정된다면 .desktop 파일의 편집된 사본을 /usr/local/share/applications/.반품원본 파일을 백업합니다(예: 에서 /usr/share/applications/file.desktop으로 /usr/share/applications/file.desktop.orig).

그런 다음 밤이나 매주 cron 작업을 실행하여 비교하고 결과를 메일로 받을 수 있습니다(또는 기억할 때 확인할 수 있도록 파일에 기록할 수 있습니다 :-).

cron-job 스크립트는 다음 기본 사항으로 시작됩니다.

for f in /usr/share/applications/*.desktop.orig; do
  bn="$(basename "$f" ".orig")
  diff -u "$f" "$bn"
done

/usr/share/applications.backup/또는 섹션 에 ".orig"를 추가하여 동일한 이름으로 변경하려는 복사하는 diff대신 파이핑을 통해 누락된 파일에 대한 경고를 음소거할 수 있습니다.-rgrep -v

diff -u -r /usr/share/applications.backup/ /usr/share/applications/ |
  grep -v '^Only in /usr/share/applications/`

또 다른 옵션은 git init/usr/share/applications에서 실행하고(디렉토리가 루트 소유이므로 루트로 실행해야 함) 거기에 있는 모든 .desktop 파일을 커밋하고 새 파일이 추가될 때 커밋하는 것을 기억하는 것입니다. git status그런 다음 git diff및 같은 git 하위 명령을 사용하여 git show차이점이나 커밋되지 않은 변경 사항, 새 파일이나 삭제된 파일을 표시할 수 있습니다.

git는 이러한 구성 파일을 관리하기 위한 훌륭한 도구이며 단지 소스 코드 프로그래밍을 위한 것이 아닙니다. 이것관리자를 기다려주세요예를 들어, 프로그램은 git을 사용하여 /etc에 모든 것의 개정 내역을 저장합니다(업그레이드 전후에 변경 사항을 자동으로 커밋하기 위한 apt, yum, dnf 등에 대한 후크 포함). 아직 설치하지 않았다면 설치할 가치가 있습니다. .

답변2

패키지가 업그레이드되면 데스크탑 항목(.desktop) 파일을 /usr/share/applications덮어씁니다. 변경 사항을 잃지 않고 파일을 덮어쓰려면 복사본을 저장 ~/.local/share/applications하고 변경하세요.


변경 사항이 감지되면 원본 데스크톱 파일을 선택적으로 자동으로 덮어쓰도록 업데이트되었습니다.

목표: 데스크톱 파일의 변경 사항을 모니터링하고 스크립트를 실행하여 필요한 변경 사항을 구현합니다.

  1. /usr/local/bin/update-myapp-desktop-file.sh데스크탑 파일을 원하는 대로 변경하는 스크립트를 작성하십시오 .
#!/usr/bin/env bash

sed -i 's/^NoDisplay=true/NoDisplay=false/' /usr/share/applications/MyApplication.desktop

스크립트를 실행 가능으로 표시합니다.chmod 755 /usr/local/bin/update-myapp-desktop-file.sh

  1. /etc/systemd/system/myapp-desktop-file.service스크립트를 실행하기 위해 systemd 서비스 파일을 만듭니다 .
[Unit] 
Description=Update MyApp desktop file

[Service]
ExecStart=/usr/local/bin/update-myapp-desktop-file.sh
  1. /etc/systemd/system/myapp-desktop-file.path데스크탑 파일 변경 사항을 모니터링하려면 해당 시스템 경로 파일을 만듭니다 .
[Unit]
Description=Monitor for changes to MyApp desktop file

[Path]
PathModified=/usr/share/applications/MyApplication.desktop
Unit=myapp-desktop-file.service

[Install]
WantedBy=multi-user.target
  1. systemd 경로 파일을 확인, 활성화 및 시작합니다.
systemd-analyze verify /etc/systemd/system/myapp-desktop-file.*
systemctl enable myapp-desktop-file.path
systemctl start myapp-desktop-file.path

관련 정보