터미널에서 .desktop 파일 실행


141

내가 수집 할 수있는 것에서 .desktop파일은 애플리케이션 설정을 사용자 정의 할 수있는 바로 가기입니다. 예를 들어, 나는 내 /usr/share/applications/폴더 에 그것들을 많이 가지고 있습니다 .

에서 해당 폴더를 열면 nautilus관련 파일을 두 번 클릭하여 이러한 응용 프로그램을 실행할 수 있습니다. 예를 들어 두 번 클릭하면 firefox.desktopFirefox가 실행됩니다. 그러나 터미널을 통해 동일한 작업을 수행하는 방법을 찾을 수 없습니다.

내가 그렇게 gnome-open foo.desktop하면 단순히 foo.desktop텍스트 파일로 열립니다 . 실행 파일을 만들고 bash에서 실행하면 실패합니다 (예상 히 bash 스크립트는 아닙니다).
편집 : exec /fullpath/foo.desktop내가 나에게 Permission denied소유권을 변경하더라도 나에게 메시지를 제공합니다 . 실행 파일을 만들고 동일한 명령을 수행하면 사용중인 터미널 탭이 닫힙니다 (충돌이라고 생각합니다). 마지막으로을 수행 sudo exec /fullpath/foo.desktop하면 오류보고가 표시 sudo: exec: command not found됩니다.

그것은 내 질문 foo.desktop입니다. 터미널에서 파일을 어떻게 실행할 수 있습니까?


5
주의 : exec실패한 이유 는 exec가 현재 실행중인 프로세스를 지정한 프로세스로 교체하기 때문에 쉘을 데스크탑을 컴파일 된 바이너리로 실행하는 것으로 바꾸려고했기 때문입니다. 당신이 할 수 없었던 이유 sudo exec는 바이너리 명령이 아니라 쉘 내장이기 때문입니다.
데니스

흥미롭게도 탭이 닫히는 이유가 궁금했습니다.
Malabarba


나는 그들이 .desktop 파일을 파싱하는 것을 본다. 어쨌든 링크 주셔서 감사합니다.
enzotib

사회자 : 죄송합니다. 실수로 신고 한 것 같습니다. 죄송합니다.
Croad Langshan

답변:


54

실행되는 명령은 데스크탑 파일 내에 포함되어 Exec=있으므로 다음과 같이 추출하여 실행할 수 있습니다.

`grep '^Exec' filename.desktop | tail -1 | sed 's/^Exec=//' | sed 's/%.//' | sed 's/^"//g' | sed 's/" *$//g'` &

그것을 분해하려면

grep  '^Exec' filename.desktop    - finds the line which starts with Exec
| tail -1                         - only use the last line, in case there are multiple
| sed 's/^Exec=//'                - removes the Exec from the start of the line
| sed 's/%.//'                    - removes any arguments - %u, %f etc
| sed 's/^"//g' | sed 's/" *$//g' - removes " around command (if present)
`...`                             - means run the result of the command run here
&                                 - at the end means run it in the background

~/bin/deskopen내용을 파일에 넣을 수 있습니다.

#!/bin/sh
`grep '^Exec' $1 | tail -1 | sed 's/^Exec=//' | sed 's/%.//' | sed 's/^"//g' | sed 's/" *$//g'` &

그런 다음 실행 가능하게하십시오.

chmod +x ~/bin/deskopen

그리고 당신은 할 수 있습니다

deskopen /usr/share/applications/ubuntu-about.desktop

인수 ( %u, %F등이)에 자세히 설명되어 있습니다 http://standards.freedesktop.org/desktop-entry-spec/desktop-entry-spec-1.0.html#exec-variables 그들 중 누구도 명령 줄에서 시작을위한 관련이 없습니다 - .


이것은 지금까지 최상의 결과를 제공하지만 때때로 원하지 않는 동작을 생성합니다. "Exec ="줄에 % u 또는 % i와 같은 인수가있을 때마다 발생합니다. Bash는 해당 문자열을 일반 인수로 전달하려고합니다. 예를 들어 www. % u.comgrep '^Exec' firefox.desktop | sed 's/^Exec=//' 을로드하는 탭이있는 Firefox가 열립니다 .
Malabarba

지금은 sed인수를 제거하기 위해 1 초 를 추가했습니다 . 그러나 더 자연스럽게 실행하는 방법이있을 것으로 생각합니다.
Malabarba

추가 sed로 답변을 업데이트했습니다. 데스크톱 파일에 인수가있을 수 있다는 것을 잊었습니다.
Hamish Downer

"grep"다음에 파이프에 "tail -1"을 추가해야합니다. "Exec ="은 여러 번 나타날 수 있으며 그 이후에는 마지막 모양 만 실행되어야합니다 ..
daisy

13
-1 : 이것은 간단한 작동 할 수 있습니다 .desktop파일,하지만 같은 항목을 무시 Path=하고 TryExec=있는 실행에 영향을 미칠 수 있습니다. Exec=파일에 데스크탑 작업 ( "quicklists")이 포함 된 경우 에도 잘못 실행 됩니다.
MestreLion

85

대답은

xdg-open program_name.desktop

그러나 버그 로 인해 더 이상 작동하지 않습니다.


7
와우 이것은 여전히 ​​버그이며 xdg에서 많은 진전이 있습니다. exo-open해결 방법으로 표시되며 gedit도 열립니다. :(
Drew

1
@RichardHolloway : 호출 gnome-open하지 않습니다xdg-open . 다른 방법입니다! 따라서 문제는 gvfs-open(후임자 또는 gnome-open)
MestreLion

13
"더 이상 작동하지 않습니까?" 결코하지 않았다! xdg-openmimetype 연관에 의해 작동하고 .desktop파일은 텍스트의 서브 클래스이기 때문에 텍스트 편집기와 연관되어 있습니다.
MestreLion

13
이 (터미널에서 데스크톱 파일을 실행 할 합리적인 방법이 없다는 것을) 너무 바보입니다
샘 왓킨스

2
아치 리눅스에서 작동하지만 우분투 관련 버그 일 수 있습니다.
Victor

75

gtk-launch단순히 지원하는 최근 우분투에서

gtk-launch <file>여기서 .desktop부품 이 있거나없는 .desktop 파일의 이름입니다.

그래서 gtk-launch foo열립니다foo.desktop

( gtk-launch문서 )

.desktop은 / usr / share / applications, / usr / local / share / applications 또는 ~ / .local / share / applications에 있어야합니다.

터미널 또는 alt + F2에서 사용 가능 (alt + F2는 기록에 명령을 저장하므로 쉽게 액세스 할 수 있음)


이것은 데비안에서도 작동합니다.

gtk-launch firefox.desktop ~ / .local / share / applications / 는 ~ / .local / share / applications / 디렉토리를보고 파이어 폭스를 시작 합니다. 정확하다면 firefox가 .desktop 파일의 디렉토리를 인수로 전달해서는 안됩니다. 실제로 gtk-launch에 전달 된 디렉토리는 .desktop 파일을 포함하는 디렉토리를 찾는 데 사용되지 않아야합니다 (실제로는 아님)
Croad Langshan

예이! 작동하는 답변!
Alicia

이것은 아치 리눅스에서도 작동합니다. 다른 답변은 만족스럽지 않지만 이것은 좋습니다. :-) KDE를 실행하더라도 작동합니다.
MountainX

2
이 버전은 Ubuntu 18.10에서 작동하지 않습니다. 데스크탑 파일이있는 폴더에 있는지 여부, .desktop 확장자를 포함하는지 여부 및 별도로 디렉토리 이름을 지정하는지 여부 등 응용 프로그램이 존재하지 않는다고 불평 할 때마다.
Joseph Garvin

38

오늘 (12.10) 현재 버그 는 여전히 존재합니다. 실제로는 gvfs-open(가 호출 한 xdg-open) 작동 방식에 따라 다릅니다 .

그래도 빠른 해결 방법 (노틸러스 소스 코드에서 영감을 얻음)을 관리했습니다. 약간 복잡하지만 Ubuntu 12.10에서 완벽하게 작동 ?하여 Unity 런처에 의미있는 아이콘 (더 이상 없음 )을 추가합니다 .

먼저 Gio를 사용하여 Python 스크립트를 작성하고 다음과 같이 저장했습니다 ~/bin/run-desktop.

#!/usr/bin/python

from gi.repository import Gio
import sys 

def main(myname, desktop, *uris):
    launcher = Gio.DesktopAppInfo.new_from_filename(desktop)
    launcher.launch_uris(uris, None)

if __name__ == "__main__":
    main(*sys.argv)

스크립트는 실행 권한이 필요하므로 터미널에서 이것을 실행했습니다.

chmod +x ~/bin/run-desktop

그런 다음에 상대 .desktop항목을 만들었습니다 ~/.local/share/applications/run-desktop.desktop.

[Desktop Entry]
Version=1.0
Name=run-desktop
Exec=run-desktop %U
MimeType=application/x-desktop
Terminal=false
Type=Application

마지막으로 섹션 ~/.local/share/applications/mimeapps.list아래의 항목을 기본 처리기로 연결 [Default Applications]했습니다.

[Default Applications]
....
application/x-desktop=run-desktop.desktop

지금:

  • xdg-open something.desktop이 예상대로 작동합니다
  • #!/usr/bin/xdg-open 실행 가능한 데스크탑 항목의 hashbang도 작동합니다.

gvfs-open버그를 해결할 때 쓸모없는 일 이지만 그 동안은 ...


1
이것은 명령의 여러 줄과 매개 변수를 올바르게 처리하므로 Hamish Downer의 대답 보다 낫습니다 . Exec=%
Flimm

4
코드에 감사드립니다-나는 Lucid에 있고, 이것을 간단히로 저장 하고 대신 /usr/bin/xdg-openpy그것을 주었고 대신에 chmod +x사용 launcher.launch([],context)했습니다 ...None,context)( " TypeError : argument 1 : NoneType이 아니라 sequence이어야 함 ") 이제 xdg-openpy app.desktop명령 줄에서 작동하고 (을 두 번 클릭하면 모두 정상적으로 작동 app.desktop) 터미널에서 전화를 걸고 xdg-open탭을 누르면 알림을받을 수 있습니다 . 건배!
sdaau

3
+1. 이것은 .desktop파일을 수동으로 파싱 할 필요가없는 유일한 대답 이므로 가장 깔끔하고 안전한 방법입니다. 또한 gi.repository더 이상 사용되지 않는 대신 현대 를 사용 pygtk하므로 훌륭합니다! :)
MestreLion

2
실제로 이것은 Carlo Pellegrini의 답변에 관한 질문입니다. 나는 새로운 사람입니다, 그것을 배치하는 더 좋은 방법이 있다면 저를 수정하십시오. 스크립트는 제대로 작동하지만 Unity 런처에 표시되는 아이콘은 .desktop 파일에 정의 된 아이콘이 아니라 'Exec'ed 명령의 기본 아이콘입니다. 그것에 대한 아이디어가 있습니까?
Ingo Leonhardt

1
@Noitidart는 마지막 답변을 작성하여 mo가 일부 Google을 수행하도록 유도했으며 그 사실 발견 했습니다 . 그것을 확인하지는 않았지만 아마도 도움이 될 것입니다.
Ingo Leonhardt

31

옳은 길

gtk-launch가능한 경우 실제로 사용해야 합니다. 일반적으로 libgtk-3-bin 패키지의 일부입니다 (이는 배포판에 따라 다를 수 있음).

gtk-launch 다음과 같이 사용됩니다.

gtk-launch APPLICATION [URI...]
gtk-launch app-name.desktop
gtk-launch app-name

그주의 사항 gtk-launch요구 의 .desktop (즉, 위치 설치 될 파일 /usr/share/applications또는 ~/.local/share/applications).

따라서이 문제를 해결하기 위해 원하는 .desktop 파일을 시작하기 전에 임시로 설치하는 해시 작은 Bash 기능을 사용할 수 있습니다 . .desktop 파일 을 설치하는 "올바른"방법은 사용하는 desktop-file-install것이지만 무시하겠습니다.

launch(){

    # Usage: launch PATH [URI...]

    # NOTE: The bulk of this function is executed in a subshell, i.e. `(..)`
    #       This isn't strictly necessary, but it keeps everything
    #       out of the global namespace and lessens the likelihood
    #       of side effects.

    (

    # where you want to install the launcher to
    appdir=$HOME/.local/share/applications

    # the template used to install the launcher
    template=launcher-XXXXXX.desktop

    # ensure $1 has a .desktop extension, exists, is a normal file, is readable, has nonzero size
    # optionally use desktop-file-validate for stricter checking
    # desktop-file-validate "$1" 2>/dev/null || {
    [[ $1 = *.desktop && -f $1 && -r $1 && -s $1 ]] || {
        echo "ERROR: you have not supplied valid .desktop file" >&2
        return 1
    }

    # ensure the temporary launcher is deleted upon exit
    trap 'rm "$launcherfile" &>/dev/null' EXIT

    # create a temp file to overwrite later
    launcherfile=$(mktemp -p "$appdir" "$template")

    launchername=${launcherfile##*/}

    # overwrite temp file with the launcher file
    if cp "$1" "$launcherfile" &>/dev/null; then
        gtk-launch "$launchername" "${@:2}"
    else
        echo "ERROR: failed to copy launcher to applications directory" >&2
        return 1
    fi

    )

}

당신은 그렇게 사용할 수 있습니다 (또한 원하는 경우 추가 인수 또는 URI를 전달하십시오).

launch PATH [URI...]
launch ./path/to/shortcut.desktop

수동 대안

.desktop 파일 을 수동으로 구문 분석하고 실행 하려면 다음 awk명령을 사용하십시오.

awk '/^Exec=/ {sub("^Exec=", ""); gsub(" ?%[cDdFfikmNnUuv]", ""); exit system($0)}' app-name.desktop

awk명령을 올인원 스크립트처럼 취급하려는 경우 Exec 명령을 찾을 수없는 경우 오류 메시지를 표시하고 리턴 코드 1로 종료 할 수도 있습니다 .

awk 'BEGIN {command=""} /^Exec=/ {sub("^Exec=", ""); gsub(" ?%[cDdFfikmNnUuv]", ""); command=$0; exit} END {if (command!="") {exit system(command)} else {if (FILENAME == "-") {printf "ERROR: Failed to identify Exec line\n" > "/dev/stderr"} else {printf "ERROR: Failed to identify Exec line in \047%s\047\n", FILENAME > "/dev/stderr"} close("/dev/stderr"); exit 1}}'

위에서 언급 한 명령은 다음과 같습니다.

  1. Exec =로 시작하는 줄을 찾으십시오.
  2. Exec =를 제거하십시오
  3. 어떤 Exec에서 변수를 제거합니다 (예를 들어 %f, %u, %U). 사양에서 의도 한대로 이러한 인수를 위치 인수로 대체 할 수 있지만 그렇게하면 문제가 상당히 복잡해집니다. 최신 데스크탑 항목 사양을 참조하십시오 .
  4. 명령을 실행
  5. 적절한 종료 코드로 즉시 종료하십시오 (여러 개의 Exec 행을 실행하지 않도록 )

이 AWK 스크립트는 다른 답변들 중 일부에 의해 적절히 해결되거나 해결되지 않을 수있는 몇 가지 최첨단 사례를 다룹니다. 특히,이 명령은 여러 제거 Exec에서의 단일 실행됩니다, 변수 (그렇지 않으면 % 기호를 제거하지 않도록주의하면서)를 Exec을 줄 명령을, 예상대로해도 동작합니다 Exec을 줄 명령은 하나 이상의 등호 포함 (예를 script.py --profile=name).

다른 몇 가지주의 사항 ... 사양에 따르면 TryExec 은 다음과 같습니다.

프로그램이 실제로 설치되었는지 확인하는 데 사용되는 디스크의 실행 파일 경로입니다. 경로가 절대 경로가 아닌 경우 파일은 $ PATH 환경 변수에서 조회됩니다. 파일이 없거나 실행 가능하지 않은 경우 항목이 무시 될 수 있습니다 (예 : 메뉴에서 사용되지 않음).

그것을 염두에두고, 가치를 실행하는 것은 의미가 없습니다.

다른 관심사는 Path and Terminal 입니다. 경로 는 프로그램을 실행하는 작업 디렉토리로 구성됩니다. 터미널 은 프로그램이 터미널 창에서 실행되는지 여부를 나타내는 부울입니다. 이것들은 모두 다룰 수 있지만, 이미 사양의 구현이 있기 때문에 바퀴를 재발 명하는 것은 의미가 없습니다. Path 를 구현 하려면 system()하위 프로세스 를 생성하므로 다음과 같은 작업을 수행하여 작업 디렉토리를 변경할 수 없습니다 system("cd \047" working_directory "\047"); system(command). 그러나 아마도 당신은 같은 것을 할 수 system("cd \047" working_directory "\047 && " command)있습니다. 참고 \ 047은 작은 따옴표입니다 (따라서 명령은 공백이있는 경로에서 중단되지 않습니다).

파이썬 대안

나는 카를로에서 페이지를 훔치는거야 여기 의 사용하기 위해 파이썬 스크립트를 작성 제안, 병사 모듈을. 다음은 파일을 작성하지 않고 I / O에 대해 걱정할 필요없이 쉘에서 동일한 코드를 실행하는 최소한의 방법입니다.

launch(){

# Usage: launch PATH [URI...]

python - "$@" <<EOF
import sys
from gi.repository import Gio
Gio.DesktopAppInfo.new_from_filename(sys.argv[1]).launch_uris(sys.argv[2:])
EOF

}

그런 다음 다음과 같이 런처 기능을 실행하십시오.

launch ./path/to/shortcut.desktop

URI 사용은 선택 사항입니다. 또한 오류 검사가 수행되지 않으므로 스크립트를 내구성있게하려면 시작 프로그램이 존재하고 읽을 수 있는지 (사용하기 전에) 확인해야합니다.


그러나 awk명령은 훌륭합니다. 따라서 +1
AB

이 맥락에서 URI는 무엇입니까? 임의의 폴더에 데스크탑 파일이 있습니다. 도대체 다른 스크립트로 래핑하지 않고 gtk-launch를 어떻게 실행합니까? 이건 미친 짓이야
Joseph Garvin

awk명령에 이중 이스케이프 공백이나 백 슬래시가 있으면 이 솔루션이 제대로 작동하지 않습니다. 그것은 이것에 속합니다 : Exec=env WINEPREFIX="/path/to/.wine" wine c:\\\\windows\\\\command\\\\start.exe /Unix /path/to/.wine/dosdevices/c:/users/Public/Рабочий\\ стол/appname.lnk그리고 dex해결책은 잘 작동합니다.
MarSoft

27

OP는 KDE에 대해 묻지 않았지만 KDE를 실행하는 사람은 다음 명령을 사용할 수 있습니다.

kioclient exec <path-to-desktop-file>

Fedora에서는 kde-runtimerpm에 포함되어 있습니다.


5
작동하기 때문에 공감. 이 프로그램이 설치되어 있으면 KDE를 전혀 실행할 필요가 없습니다.
basic6

이것에 stdout하는 방법이 있습니까? 클레멘 타인 플레이어를 컴파일했는데 .desktop 파일 (플라즈마 쉘 포함)을 통해서만 시작되는 버그가 있습니다. 그리고 출력 로그 로그를 작성하는 방법을 알 수 없습니다.
Kwaadpepper

@Kwaadpepper를 사용하면 .desktop 파일을 사용하여 내부적으로 명령을 실행하고 출력을 파일로 리디렉션하는 셸 스크립트를 시작할 수 있습니다.
Raman

현재 Linux 용 KDE 패키지에서 kioclient를 찾을 수 없습니다. 그러나 gtk-launch는 KDE에서 작동합니다.
MountainX

15

dex 사용할 수 있습니다 .

dex foo.desktop

2
IMHO 이것은 정답입니다. 하나의 도구, 파일 만 매개 변수로 한 번의 호출. 손으로 쓴 .desktop파일 을 테스트하기 위해 내가 찾던 것입니다 . 그리고 .desktop파일도 만들 수 있습니다 . :-)
Axel Beckert

완전한! dex gist.github.com/stuaxo/4169fc1342c496b7c8f7999188f2f242 를 / usr / share / applications /에 사용하는 .desktop 파일을 추가하면 기본적으로 gedit에서 파일을 열지 않고도 파일 관리자에서 데스크탑 파일을 시작할 수 있습니다.
Stuart Axon

13
exo-open [[path-to-a-desktop-file]...]

exo-utils가 설치된 경우 13.10 릴리스에서 작동하는 것 같습니다 (Xubuntu의 경우와 같습니다).


예, 우분투 스튜디오 14.04에서 테스트했습니다. BTW. xdg-open 및 gvfs-open도 작동합니다.
jarno

15 일에도 활동
Jonathan

xfce와 함께 데비안 사용하기. 잘 작동합니다!
king_julien

우분투 14.04에서 나를 위해 작동
타일러 콜리어

8

Hamish의 답변에 대한 부록.

deskopen 스크립트가 제공되면 주석 문자가 여전히이므로 .desktop 파일 에서 shebang 행으로 참조를 사용할 수 있습니다 #. 즉, 이것을 .desktop 파일 의 첫 번째 줄로 넣으십시오 .

#!/usr/bin/env deskopen

그런 다음 플래그 의 .desktop (A와 예를 들어, 실행 파일과 파일 chmod +x whatever.desktop), 다음을 수행 할 수 있습니다

path/to/whatever.desktop

그리고 voilà- 앱이 열립니다! (어떻게할지 모르겠지만 지정한 아이콘 파일로 완성하십시오.)

이제 deskopen이 명령 줄 매개 변수를 통과하도록하려면 약간 수정 된 버전을 대신 사용할 수 있습니다.

#!/bin/sh
desktop_file=$1
shift
`grep '^Exec' "${desktop_file}" | sed 's/^Exec=//' | sed 's/%.//'` "$@" &

옆으로, 나는 "#{@:2}"대신에 사용하려고 시도 shift했지만 계속 나에게 '나쁜 대체'를주었습니다 ...


나는 이것이 Hamish의 대답에 대한 적절한 의견이라는 것을 알고 있지만 새로운 사용자이며 의견을 말할 수는 없습니다. 오 잘!
pabst

평판이 있다면 가장 적절한 조치는 실제로 해당 답변을 편집하는 것입니다.
Flimm

로그인하지 않은 사용자라도 누구나 수정 사항을 제안 할 수 있습니다. 더 큰 방법은 없습니다.
Flimm

1
이것은 그 자체만으로도 정답입니다.
Bruno Pereira

당신이 사용할 수있는 "${@:1}"대신 shift,하지만 필요 bash대신 sh당신의 #!오두막.
MestreLion

6

현재 Ubuntu 아카이브에 설명 된 내용을 수행하는 응용 프로그램이 없습니다. 이러한 XDG 사양을 준수하지 않는 데스크탑 환경 (예 : openbox)에 통합을 제공하기위한 일반적인 솔루션을 만들기 위해 몇 가지 노력이 진행되고 있습니다.

Arch Linux는 python-xdg 라이브러리를 기반으로 xdg-autostart 구현을 위해 노력하고 있습니다. 내가 찾을 수 있듯이, 이것은 아직 완전하지는 않지만 성공에 대한 보고서가 있습니다.

또한 gitorious (http://gitorious.org/xdg-autostart/)에 xdg-autostart의 C ++ 구현이있어 더 폭넓게 사용할 수 있습니다.

어느 쪽이든 해결책이 효과가 있다면 데비안이나 우분투에 포함시키기 위해 필요한 작품을 제출하는 것을 고려하십시오.

openstart와 함께 두 도구를 사용하려면 /etc/xdg/openbox/autostart.sh에서 도구를 호출하십시오 (오픈 박스 설명서를 올바르게 읽고있는 경우). 그래도 동작하지 않는다면, 오픈 박스 세션 초기화 스크립트에서 호출 할 수 있습니다.



6

"표준 명령 사용" 요구 사항을 충족하는 즉각적인 솔루션은 없지만 .desktop파일 을 최소한 구문 분석 하거나 Bash 별칭을 만들려면 다음이 작동해야합니다.

  • awk -F= '/Exec=/{system($2); exit}' foo.desktop

흥미로운 또 다른 방법은 파일에서 binfmt-misc일치하는 것보다 커널 수준의 방법 을 만드는 것입니다 .desktop( grep -r . /proc/sys/fs/binfmt_misc/현재 활성화 한 패턴 참조 ).

하루의 끝에서, 뭔가 어딘가 구문 분석해야합니다 .desktop그냥 얼마나 "표준 / 기본"의 질문, 파일을.


고마워요 "표준"이란 DE가 제공하고 freedesktop.org를 준수하는 것을 의미합니다.
enzotib

s와 s의 awk체인이 아니라 공감하십시오 . grepsed
jmtd

당신이 ultiple이있는 경우 - 찬성 투표, 그것은 작동하지 않지만 (너무 많이 작동 이상 넣어) Exec=라인 : /
보리스 Churzin

2

의 Carlo의 답변 에서 스크립트를 가져 와서 내 데스크톱 사용을 위해 개선하려고했습니다.

이 스크립트 버전을 사용하면 첫 번째 결과 일 가능성이있는 한 HUD에 입력 한 것처럼 앱을 실행할 수 있습니다. URI를 지원하지 않는 .desktop 파일에 대한 파일 인수를 전달할 수도 있습니다.

#!/usr/bin/env python

from gi.repository import Gio
from argparse import ArgumentParser
import sys, os

def find_app(search_string):
    for group in Gio.DesktopAppInfo.search(search_string):
        for entry in group:
            try:
                return Gio.DesktopAppInfo.new(entry)
            except: pass
    return None

def main(args):
    launcher = None
    if os.path.isfile(args.appName):
        try:
        # If it's a file, do that first.
            launcher = Gio.DesktopAppInfo.new_from_filename(args.appName)
        except TypeError:
            print "'" + args.appName + "' is not a .desktop file"
            sys.exit(-1)
    # If it's a .desktop file in the DB, try using that
    if launcher is None and args.appName.endswith('.desktop'):
        try:
            launcher = Gio.DesktopAppInfo.new(args.appName)
        except TypeError: pass

    if launcher is None:
        # Search for the app by the text given
        launcher = find_app(args.appName)

    if launcher is None:
        print "No app named " + args.appName + " could be found"
        sys.exit(-1)
    if (launcher.supports_uris()):
        launcher.launch_uris(args.uris, None)
    elif (launcher.supports_files()):
        launcher.launch(list({ Gio.File.parse_name(x) for x in args.uris }), None)
    else :
        launcher.launch()

if __name__ == "__main__":
    argParser = ArgumentParser(description="Launch a .desktop file or application")
    argParser.add_argument("appName", 
        help="the name of any application, a desktop file's basename, or a concrete path to a desktop file", 
        action='store'
    )
    argParser.add_argument("uris", 
        nargs='*', 
        help="Files or URIs to pass to the application"
    )
    args = argParser.parse_args()
    main(args)

1

이 파일을 테스트하려고 할 때 DM 또는 세션 관리자가 UI 폴더 브라우저에서 주변 디렉토리를 연 다음 두 번 클릭하여 열 것이라고 예상 한 것을 수행하는 가장 간단한 방법을 찾았습니다.

명령 행에있는 경우 : gvfs-open .또는 gnome-open .구성된 폴더 브라우저에서 명령 행 을 엽니 다.

sed는 탈출구와 같은 어리석은 것들과 대체 행동을 원하지 않는 인용문을 포함하여 DM의 행동을 반영하지 않습니다. 커맨드 라인은 아니지만 유효성을 검사했습니다. Terminal=true디버깅에 유용한 설정도 발견했습니다 .


터미널 = true를 사용하는 경우 단말기가 즉시 사라라는 메시지를 볼 수있는 시간이 없어 :들
gouessej

1

SO 답변 은 나를 위해 분명하게했습니다. 데스크톱 파일을 실행하려고 시도하지 말고, 데스크탑 파일에서 지정된 파일을 실행하십시오.

예를 들어, /home/jsmith/Desktop/x11vnc.sh를 실행하십시오.

Exec=/home/jsmith/Desktop/x11vnc.sh

1

(여기의 다양한 답변에서 편집)

시스템 및 시스템에 존재하거나 존재하지 않는 다양한 버그에 따라 다음 중 하나가 작동 할 때까지 다음을 시도하십시오.

  1. xdg-open program_name.desktop
  2. exo-open program_name.desktop
  3. gtk-launch program_name.desktop
  4. kioclient exec program_name.desktop
  5. dex program_name.desktop

Ubuntu 시스템에서는 "시작 메뉴"데스크탑 런처를에서 사용할 수 있습니다 /usr/share/applications/.

예를 들어, 위 명령 중 Ubuntu 14.04 시스템에서 작동하거나 작동하지 않는 명령을 표시하려면 다음과 같은 호출 결과가 있습니다.

  1. xdg-open /usr/share/applications/eclipse_for_cpp.desktop # 버그로 인해 실패 함 (이 .desktop 파일을 저장하도록 시도)
  2. exo-open /usr/share/applications/eclipse_for_cpp.desktop # 작품
  3. gtk-launch /usr/share/applications/eclipse_for_cpp.desktop # "gtk-launch : 해당 응용 프로그램 없음"으로 실패
  4. kioclient exec /usr/share/applications/eclipse_for_cpp.desktop # 작품
  5. dex /usr/share/applications/eclipse_for_cpp.desktop# 실패하고 sudo apt install dex패키지 덱스를 찾을 수 없습니다

0

데스크탑 파일이 가리키는 스크립트도 실행 가능해야합니다.

여전히 작동하지 않는 경우. 를 변경하여 터미널에서 데스크탑 파일을 실행 가능하게 만들고 Terminal=truebash 스크립트 안에 넣습니다. 스크립트를 실행하여 오류 출력을 포착하십시오. 오류가 수정되면 다시 변경하십시오.


0

Hamish의 대답은 훌륭하지만 배관이 덜 포함 된 간단한 대안을 제안하고 싶습니다.

$(awk -F= '/^Exec/||/^TryExec/ {print $2;exit}' /usr/share/applications/firefox.desktop)

이 경우,로 awk시작하는 행을 검색 Exec한 다음 for 루프를 사용하여 해당 행 다음에 필드 =를 인쇄하고 필드 2, 즉 해당 필드 뒤에 오는 모든 것을 인쇄합니다. 명령 끝의 중괄호 $(...)는 매개 변수 대체이므로 쉘은 awk 명령이 리턴하는 모든 것을 실행합니다. 이 경우 뒤에 오는 실제 명령을 반환합니다 Exec=.

드문 경우이지만 둘 이상의 =부호 가있을 수 있으며 여전히 가능성이 있습니다. 이를 위해 나는 제안한다

$(awk -F= '/^Exec/||/^TryExec/ {for(i=2;i<=NF;i++) print $i;exit}' /usr/share/applications/firefox.desktop)

니스, awk그리고 Serg =)
AB

때로는, TryExec어쩌면 두 번째 명령을 확인해야합니다 =)
AB

@AB Hehe awk는 텍스트 처리와 관련하여 제가 선택한 무기입니다. 게다가, 그것은 구문에 가깝습니다 C. 아, 그리고 이미 TryExec^ _ ^ 부분을 추가
Sergiy Kolodyazhnyy

내 +1 =)
AB 2

그러나 무슨에 관하여 %f, %u, %U또는 명령 뒤에 이런 식으로 뭔가?
AB
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.