.desktop EXEC 명령에서 현재 경로 가져오기

.desktop EXEC 명령에서 현재 경로 가져오기

.desktop과 동일한 디렉터리에 저장된 .sh를 실행하기 위해 .desktop 파일을 가져오려고 합니다. 전체 디렉토리는 한 시스템에서 다른 시스템으로 이동 가능해야 합니다.

내 실행 스크립트는run.sh

나는 시도했다:

[Desktop Entry]
Type=Application
Terminal=true
Name=RunMe
#Exec=sh -c "`dirname %k`/run.sh"
#Exec=bash -c "export PATH=$PATH:`dirname %k`; bash run.sh;"
#Exec=bash -c "export PATH=$PATH:`dirname %k`; sh run.sh;"
Exec=bash -c "export PATH=$PATH:`dirname %k`; run.sh;"

하지만 .desktop 파일을 두 번 클릭하면 아무 일도 일어나지 않습니다. "run.sh"를 두 번 클릭하고 "실행"을 선택하면 스크립트가 제대로 실행됩니다. ""를 사용하여 명령줄에서 스크립트를 실행하면 sh run.sh제대로 작동합니다.

어떤 아이디어나 실제로 실행하려는 경로를 디버깅할 수 있는 방법이 있나요?

답변1

~에 따르면데스크탑 엔트리 사양:

필드 코드는 인용된 매개변수 내에서 사용하면 안 됩니다.

따라서 귀하의 명령은 %k문자 그대로 제공됩니다 bash. 이 줄을 Exec다음과 같이 변경하면 이를 방지할 수 있습니다.

Exec=bash -c '"$(dirname "$1")"/run.sh' dummy %k

위 코드는 로컬에서 작동하며 경로에 공백이 있는 경우에도 작동합니다. 는 스크립트 이름으로 생각되는 대로 스크립트 dummy에 제공되며 확장자는 로 사용할 수 있습니다 . 중첩된 참조 레이어는 사양을 준수하고 공간에 안전해야 합니다.bash$0%k$1

반드시 로컬 파일 경로로 확장되는 것은 %k아닙니다. vfolder URI일 수도 있고 비어 있을 수도 있으며, 진정한 이식성 있는 스크립트는 이러한 경우도 고려해야 합니다. %k또한 자체적으로는 보편적으로 지원되지 않으므로 사용하려는 시스템에 대해 일부 제한이 필요합니다.


디버깅에 관한 한 KDE에서 일반 쉘 리디렉션을 사용할 수 있습니다:

Exec=bash -c ... > /tmp/desktop.log

이는 표준화된 동작이 아니며 GNOME 및 기타 환경에서는 작동하지 않습니다. 또한 스크립트에 절대 경로를 제공하여 필요한 방식으로 해당 매개변수와 작업을 기록할 수도 있습니다.

답변2

스크립트가 파일과 동일한 디렉토리에 있으면 .desktop상대 경로를 사용하십시오. 당신의 것을 만지작 거리 bash -c거나 수정할 이유는 없습니다 .$PATHdirname

[Desktop Entry]
Type=Application
Terminal=true
Name=RunMe
Exec=./run.sh

run.sh파일이 파일과 동일한 디렉토리에 있고 .desktop올바른 shebang 줄이 있는 한 :

#!/usr/bin/env bash

어디에서나 작동해야 합니다. #!/usr/bin/env bash대신 사용하여 사용자 중 한 명이 #!/bin/bash사용되도록 하고 스크립트를 완전히 이식 가능하게 만드세요.bash$PATH


노트:@마이클호머지적주석에서 상대 경로는 모든 데스크탑 환경에서 작동하지 않습니다. Cinnamon에서 시도해 보았는데 예상대로 작동했기 때문에 아마도 다른 Gnome 기반 환경에서도 작동할 것입니다. freedesktop.org 사양에서는 전체 경로를 사용해야 한다고 제안하는 것 같습니다.

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

답변3

에서 언급했듯이데스크탑 엔트리 사양또는 %k다른 필드 코드는 인용된 매개변수 내에서 사용할 수 없습니다. 그러나 따옴표를 사용하지 않고 공백이 있는 표현식을 변수에 복사하는 방법이 있습니다.

Exec=k=$(echo %k) && "$(dirname "$k")"/run.sh

답변4

.desktop 파일의 상위 디렉터리에 대한 상대 경로를 사용하여 프로그램(bash 스크립트가 여기에 제공되지만 다른 프로그램에서도 작동함)을 실행하는 방법( Gnome, KDE, Xfce, LXDE, LXQt, MATE, , Cinnamon, 데스크탑 환경 Budgie에서 테스트됨 ):

난쟁이:

Exec=gnome-terminal -e "bash -c 'cd \"$(dirname "\"%k\"")\"; bash "./relative_file_path.sh" parameter1 parameterN'"

그놈 - 최신:

Exec=gnome-terminal -- bash -c 'cd \"$(dirname "\"%k\"")\"; bash "./relative_file_path.sh" parameter1 parameterN'

키 DE:

Exec=konsole -e "bash -c 'cd $(printf '"%s"' "$(dirname "%k")"); bash "./relative_file_path.sh" parameter1 parameterN'"

Xfce:

Exec=xfce4-terminal -e "bash -c 'cd \"$(dirname "\"%k\"")\"; bash "./relative_file_path.sh" parameter1 parameterN'"

LXDE:

Exec=bash -c 'cd "%k"&&bash "./relative_file_path.sh" parameter1 parameterN'

LXQt:

Exec=bash -c 'cd "%k"&&bash "./relative_file_path.sh" parameter1 parameterN'

동반자:

Exec=mate-terminal -e "bash -c 'cd \"$(dirname "\"%k\"")\"; bash "./relative_file_path.sh" parameter1 parameterN'"

시나몬:

Exec=gnome-terminal -e "bash -c 'cd \"$(dirname "\"%k\"")\"; bash "./relative_file_path.sh" parameter1 parameterN'"

잉꼬:

Exec=tilix -e "bash -c 'cd \"$(dirname "\"%k\"")\"; bash "./relative_file_path.sh" parameter1 parameterN'"

위에 표시된 코드에 대한 .desktop 파일의 예 Exec( LXDELXQt-는 제외 Terminal=false) Terminal=true:

[Desktop Entry]
Version=1.0
Name=Name to display
Comment=A comment
Exec=...
Icon=utilities-terminal
Terminal=false //does not show the initial launcher app (terminal) window
Type=Application
Categories=Application;

python3의 경우 bash "./relative_file_path.sh" parameter1 parameterN로 바꾸 python3 "./file_content_search.py" parameter1 parameterN거나 - 다른 프로그램의 경우 필요에 따라 바꾸십시오.

관련 정보