이유 1: 가장 간단한 상대 경로 버전은 기존 표준과 충돌합니다.

이유 1: 가장 간단한 상대 경로 버전은 기존 표준과 충돌합니다.

이것.desktop 파일GUI에서 실행 파일을 쉽게 시작할 수 없고 많은 실행 프로그램이 응용 프로그램 아이콘을 사용하지 않고 .desktop 파일에 지정된 아이콘만 사용하기 때문에 이는 Linux 데스크탑에서 응용 프로그램에 쉽게 액세스하기 위한 사실상의 표준이 되었습니다.

그렇다면 실행 파일의 상대 경로를 지정하는 .desktop 파일을 사용하는 것이 불가능해 보이는 이유는 무엇입니까? 이 문제를 해결할 수 있는 방법이 있습니까?

사용자에게 강제로 설치하지 않으려는 소프트웨어를 게시할 때 이를 달성할 수 있는 유일한 방법은 상대 경로입니다.

AppImage는 사용자가 처음 실행할 때 .desktop 파일을 설치하여 이 문제를 해결하는 것으로 보입니다. 이는 유연한 경로가 있는 소프트웨어의 아이콘과 실행 프로그램을 활성화하는 투박한 방법처럼 보입니다. 상대 경로가 더 나은 접근 방식입니다. Linux 데스크톱에서 이 솔루션을 사용할 수 없는 이유는 무엇입니까? 이것이 단순한 실수일 것 같지는 않지만, 이 결정 뒤에 숨은 더 깊은 이유를 간과하고 있었던 것 같습니다.

답변1

인라인 쉘 스크립트를 사용하여 경로를 계산할 수 있습니다.

Exec=sh -e -c "exec \\"\\$(dirname \\"\\$0\\")/some_app\\"" %k

예, 두 가지 수준의 이스케이프가 필요합니다.

답변2

FreeDesktop 표준은 단지 표준일 뿐이라는 점을 기억하십시오. 원칙적으로 KDE, GNOME, LXDE 또는 XFCE와 같은 공급업체는 표준 프로세스를 거치지 않고 상대 경로에 대한 지원을 추가할 수 있지만 실제로는 어느 공급업체도 그렇게 하지 않았습니다. (GNOME 3.28.2나 KDE Plasma 5.12.9 모두 상대 경로를 지원하지 않는 것으로 확신하며, 내가 아는 한 다른 데스크탑 환경도 상대 경로를 지원하지 않습니다.)

왜 이런거야?

이유 1: 가장 간단한 상대 경로 버전은 기존 표준과 충돌합니다.

다음 데스크톱 파일을 고려해보세요.

[Desktop Entry]
Type=Application
Name=My example app
Exec=my_example_app
Icon=example-app

이것FreeDesktop 사양에 따르면:

표준 버튼

Icon

파일 관리자, 메뉴 등에 표시되는 아이콘 이름이 절대 경로인 경우 해당 파일이 사용됩니다. 이름이 절대 경로가 아닌 경우에 설명된 알고리즘은아이콘 테마 사양아이콘을 배치하는 데 사용됩니다.

[. . . ]

유형 값은 iconstring아이콘의 이름입니다. 이는 절대 경로이거나 에 설명된 알고리즘을 사용하여 찾은 아이콘의 기호 이름일 수 있습니다.아이콘 테마 사양. 이러한 값은 사용자가 표시할 수 없으며 UTF-8로 인코딩됩니다.

절대 경로가 아니기 때문에 example-app아이콘을 표시하려는 메뉴와 패널은 아이콘 테마 사양에 따라 일반적으로 유사한 폴더를 찾아 올바른 경로를 찾습니다.

/usr/share/icons/hicolor/48x48/apps/example-app.png

그러나 example-app상대 경로도 유효하므로 이제 아이콘 문자열이 모호해졌습니다. 한 데스크탑 환경에서는 상대 경로를 사용하고 다른 데스크탑 환경에서는 상대 경로를 사용하지 않으면 호환성이 깨집니다.

다시 한 번 Exec핵심을 고려해보세요.

Exec=my_example_app

사양에 따르면 전체 경로(즉, 절대 경로) 또는 실행 파일이어야 합니다 $PATH.

Exec에는 명령줄이 포함되어 있어야 합니다. 명령줄은 실행 가능한 프로그램(선택적으로 하나 이상의 인수가 뒤따름)으로 구성됩니다. 실행 프로그램은 전체 경로를 사용하거나 실행 파일 이름만 사용하여 지정할 수 있습니다. 전체 경로가 제공되지 않으면 $PATH데스크톱 환경에서 사용하는 환경 변수에서 실행 파일을 찾습니다.

https://specations.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html#exec-variables

따라서 my_example_app를 살펴봐야 하지만, 상대 경로라고 생각했다면 존재하지도 않는 어딘가를 $PATH살펴봐야 합니다 . $PATH어느 것이 우선인가?

지금,어쩌면 모든 상대 경로에 접두사가 붙도록 요구할 수도 있습니다. 그것들을 명확하게 하기 위해 ./. 이는 파일 이름에 허용되지 않으므로 /모호하지 않습니다 . 예를 들면 다음과 같습니다.

Icon=./example-app.png
Exec=./my_example_app

동일한 작업 디렉토리에 있는 파일의 경우 또는

Icon=./../example-app.png
Exec=./../my_example_app

상위 디렉터리에 있는 파일의 경우.

이는 또 다른 질문을 제기합니다. 작업 디렉토리로 간주되는 것은 무엇입니까?

이유 2: 데스크톱 파일의 예상 작업 디렉터리가 명확하지 않을 수 있습니다.

데스크탑 파일은 다음 키를 사용하여 작업 디렉토리를 설정할 수 있습니다 Path.

Path

항목 유형이 Application실행 중인 프로그램의 작업 디렉터리입니다.

따라서 데스크탑 파일에 유효한 Path키가 있고 다음과 같은 상대 경로를 지정하려는 경우:

Path=/home/username/path/to/myfolder/
Exec=./my_example_app

데스크탑 파일의 위치에 상대적입니까, 아니면 키에 상대적입니까 Path?

고려해야 할 다른 가능성이 있습니다.

  • 경로는 상대적이어야 합니까 $XDG_DATA_HOME?

    이는 실제 데스크톱 파일과 아이콘이 저장되는 위치이지만 실행 파일이 저장되는 위치가 아니기 때문에 어느 정도 의미가 있습니다.

  • 경로는 실행기 프로세스의 작업 디렉터리에 상대적이어야 합니까?

    패널이나 메뉴를 표시하는 프로세스는 실행 파일과 아이콘이 어디에 있는지 알아야 하기 때문에 이는 의미가 있습니다. 일반적으로 창 관리자의 작업 디렉터리는 사용자의 홈 디렉터리이지만 원칙적으로 작업 디렉터리는 어디에든 있을 수 있습니다.

이유 3: 데스크톱 파일을 이동하는 경우 상대 경로를 업데이트해야 합니다.

Path좋아요, 실행 파일과 아이콘의 경로가 항상 데스크톱 파일에 상대적이고 키 , 실행 프로그램 프로세스 및 기타 모든 것을 무시한다고 지정한다고 가정해 보겠습니다 .

이제 해당 데스크탑 파일을 다른 곳에 복사하고 싶다고 가정해 보겠습니다. 예를 들면 다음과 같습니다.

~/Desktop/example-app.desktop

이제 상대 경로가 다르므로 데스크톱 파일을 편집하고 경로를 다시 변경해야 합니다. 절대 경로나 표준 폴더 위치를 사용하면 이 문제를 해결할 수 있습니다.

이유 4: 메뉴와 패널을 사용하려면 데스크탑 파일이 어디에나 있어야 합니다.

상대 경로는 데스크톱 파일을 동일한 디렉터리에 저장하고 파일 관리자를 사용하여 실행하는 한 작동합니다. 하지만 메뉴나 패널 실행기에서 데스크탑 파일을 실행하고 싶다고 가정해 보겠습니다. 이제 데스크톱 파일은 다음 위치에 있을 수 있습니다.

/usr/share/applications/

아니면 안에 있을 수도 있지

~/.local/share/applications/

또는

~/.config/xfce4/panel/

아이콘이나 실행 파일의 상대 경로는 어느 것과도 동일하지 않습니다. 게다가, 그것은 다음에 따라 달라집니다$XDG_DATA_HOME 그리고$XDG_DATA_DIRS, 데스크톱 파일은 완전히 다른 곳에 있을 수 있습니다.

원래 질문에서 언급된 사용 사례는 GUI에서 실행 파일을 실행하고 설치 없이 사용자 정의 아이콘을 표시하는 것이었습니다.

그렇지 않으면 실행 파일이 GUI에서 쉽게 시작되지 않고 많은 실행 프로그램이 응용 프로그램 아이콘을 사용하지 않고 .desktop 파일에 지정된 아이콘만 사용합니다.

그렇다면 실행 파일의 상대 경로를 지정하는 .desktop 파일을 사용하는 것이 불가능해 보이는 이유는 무엇입니까? 이 문제를 해결할 수 있는 방법이 있습니까?

사용자에게 강제로 설치하지 않으려는 소프트웨어를 게시할 때 이를 달성할 수 있는 유일한 방법은 상대 경로입니다.

우리가 처음에 소프트웨어의 표준 설치 절차를 귀찮게 하는 이유 중 하나는 다른 프로세스가 리소스를 찾을 수 있도록 리소스를 표준 위치에 배치하기 위해서입니다. 이로 인해 설치 및 제거가 더 복잡해지지만 확인할 디렉터리가 적기 때문에 캐싱 및 디버깅과 같은 작업에 도움이 됩니다.

실행 파일을 설치하지 않으려면 상대 경로를 통해 실행할 수 있지만, 다른 프로세스(예: 메뉴 실행기 또는 패널)를 통해 편리하게 실행하려면 다른 프로세스에서 이를 알아야 합니다. 보세요. 각 프로세스에는 자체 작업 디렉터리가 있으므로 상대 경로가 다를 수 있습니다.

이것사양에는 할 말이 있습니다.:

따라서 당신은 응용 프로그램 작성자이고 KDE 및 Gnome 메뉴에서 작동하도록 응용 프로그램 아이콘을 설치하려고 합니다. 적어도 hicolor 테마에는 48x48 아이콘을 설치해야 합니다. 이는 $prefix/share/icons/hicolor/48x48/apps에 PNG 파일을 설치하는 것을 의미합니다. 다양한 크기의 아이콘을 설치하도록 선택할 수 있습니다. 예를 들어, $prefix/share/icons/hicolor/scalable/apps에 svg 아이콘을 설치한다는 것은 대부분의 데스크탑에 모든 크기에 대한 아이콘이 있다는 것을 의미합니다.

따라서 여기에 아이콘을 설치할 수 있습니다.

~/.local/share/icons/hicolor/48x48/apps/example-app.png

아니면 여기:

~/.local/share/icons/hicolor/scalable/apps/example-app.svg

iconstring그런 다음 간단히 다음과 같이 인용하십시오 example-app.

Icon=example-app

그리고 런처 프로세스는 아이콘을 찾을 수 있습니다.

이는 실제로 상대 경로는 아니지만 절대 경로를 사용해야 하는 문제를 해결하고 데스크톱 파일을 다른 위치로 이동해도 중단되지 않습니다.

아이콘 폴더의 이미지가 아닌 Exec실행 파일이라는 점을 제외하면 키 에도 동일하게 적용됩니다 .$PATH

결론: 이전 토론 및 링크.

아이콘에 대한 상대 경로 지원은 적어도 2008년 9월 초에 FreeDesktop 메일링 리스트에서 논의되었습니다.

Magnus Bergmark gmail.com의 magnus.bergmark

2008년 9월 23일 화요일 01:01:32 PDT

[. . . ]

어떻게든 상대 경로를 사용할 수 있도록 허용하는 것이 좋습니다.

  1. 나는 여러 개의 .directory 파일을 사용하여 영화 포스터를 아이콘으로 사용하여 영화가 포함된 디렉토리를 만듭니다. 이 동작은 만화책, 음악(앨범 아트), 사진 등 모든 형태의 미디어에 적용될 수 있습니다.

  2. 공급업체는 데스크탑 메뉴에 표시되지 않아 애플리케이션 디렉토리에 남아 있는 .desktop 파일과 함께 사용하기 위해 배포 중인 소프트웨어에 아이콘을 묶을 수 있습니다.

https://lists.freedesktop.org/archives/xdg/2008-September/009940.html

이 제안에 대해 제가 찾을 수 있는 유일한 반박은 다음과 같습니다.

표준 애플리케이션 디렉토리에 들어가지 않는 .desktop 파일은 거의 전혀 쓸모가 없습니다. 어쩌면 몇 가지 패키지 제안과 구현을 살펴보고 사용해야 할 수도 있습니다. 또 다른 옵션은 적절한 위치에 .desktop 파일과 아이콘을 설치하는 xdg utils 스크립트입니다. 귀하가 제거한 앱도 아이콘 테마 및 아이콘 명명 규칙을 따르지 않도록 의도된 것이라고 가정할 수 있습니다. 그리고 저는 디렉토리에 아이콘을 설정하는 것이 정말 유용하다고 생각하지 않습니다. elf 바이너리에는 win32 바이너리와 동일한 리소스가 없지만 실제 실행 파일에 대한 아이콘을 설정하는 것이 더 유용할 것입니다.

https://lists.freedesktop.org/archives/xdg/2008-September/009962.html

관련 질문:

관련된 링크들:

답변3

내 .home 디렉토리에 대한 상대 경로가 필요합니다 firefox.desktop. 이렇게 하면 각 사용자는 자신만의 Firefox 프로필을 시작할 수 있습니다 firefox-frank.~/Documents/.../home/frank/Documents/...

유효한 실행 라인은 다음과 같습니다.(위의 @timothy-baldwin의 답변에 감사드립니다)

Exec=sh -e -c "/usr/bin/firefox -profile \"/home/$(whoami)/Documents/chrome-profiles/firefox-$(whoami)\""

답변4

이 상황을 이해하려면 "무엇과 관련이 있는가?"라고 자문해 보십시오. 이러한 .desktop파일은 GUI 컨텍스트에서 사용되며 기본 경로가 .desktop파일에 넣을 것을 고려할 수 있는 상대 경로에서 절대 경로를 구축할 수 있다고 가정할 수 없습니다.

상대 경로는 명시적 위치(절대 경로)로 변환할 수 있고 참조점이 필요한 경우에만 유용합니다. 이는 일반적인 GUI 컨텍스트에서는 가정할 수 없습니다.

관련 정보