.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
거나 수정할 이유는 없습니다 .$PATH
dirname
[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
( LXDE
및 LXQt
-는 제외 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
거나 - 다른 프로그램의 경우 필요에 따라 바꾸십시오.