Z tego, co mogę zebrać, .desktop
pliki są skrótami, które pozwalają dostosować ustawienia aplikacji. Na przykład mam ich wiele w swoim /usr/share/applications/
folderze.
Jeśli otworzę ten folder nautilus
, mogę uruchomić te aplikacje, klikając dwukrotnie powiązany plik, np. Dwukrotne kliknięcie firefox.desktop
uruchamia Firefoksa. Nie mogę jednak znaleźć sposobu na zrobienie tego samego przez terminal.
Jeśli to zrobię gnome-open foo.desktop
, po prostu otworzy się foo.desktop
jako plik tekstowy. Jeśli sprawię, że będzie wykonywalny, a następnie uruchomię go w wersji bash, po prostu się nie powiedzie (co jest oczekiwane, to oczywiście nie jest skrypt bash).
EDYCJA: Doing exec /fullpath/foo.desktop
daje mi Permission denied
wiadomość, nawet jeśli zmienię własność na siebie. Jeśli utworzę plik wykonywalny i wykonam to samo polecenie, karta terminalu, której używam, po prostu zamyka się (domyślam się, że ulega awarii). Wreszcie, jeśli to zrobię sudo exec /fullpath/foo.desktop
, otrzymam raport o błędzie sudo: exec: command not found
.
To moje pytanie, jak mogę uruchomić foo.desktop
plik z terminala?
źródło
exec
niepowodzenia jest to, że exec zastępuje aktualnie uruchomiony proces określonym przez Ciebie procesem, więc próbujesz zastąpić powłokę uruchomionym pulpitem jako skompilowanym plikiem binarnym. Powodem, dla którego nie możesz tego zrobić,sudo exec
jest to, że jest to wbudowana powłoka, a nie polecenie binarne.Odpowiedzi:
Polecenie, które jest uruchamiane, jest zawarte w pliku pulpitu, poprzedzone przez
Exec=
, abyś mógł go wyodrębnić i uruchomić:Aby to rozbić
Możesz umieścić to w pliku, powiedzmy
~/bin/deskopen
z zawartościąNastępnie uczyń go wykonywalnym
A potem możesz zrobić np
Argumenty (
%u
,%F
etc) są wyszczególnione w http://standards.freedesktop.org/desktop-entry-spec/desktop-entry-spec-1.0.html#exec-variables - żaden z nich nie są odpowiednie do uruchomienia w linii poleceń .źródło
grep '^Exec' firefox.desktop | sed 's/^Exec=//'
otwiera Firefox z zakładką ładującą www.% U.com .sed
aby usunąć wszelkie argumenty. Ale myślę, że może istnieć bardziej „naturalny” sposób na uruchomienie tego..desktop
plików, ale ignoruje wpisy podobnePath=
iTryExec=
mogące wpływać na wykonanie. Wykonuje również źleExec=
, jeśli plik zawiera działania na pulpicie ( „quicklists”)Odpowiedź powinna być
Ale z powodu błędu to już nie działa.
źródło
exo-open
jest wymieniony jako obejście i otwiera także gedit. :(gnome-open
czy nie nazwaćxdg-open
, to jest na odwrót! Tak więc problem leży wgvfs-open
(następcy lubgnome-open
)xdg-open
działa według skojarzenia typu mimetype, a.desktop
pliki są powiązane z edytorami tekstu, ponieważ są podklasą tekstuZ każdym najnowszym ubuntu, które obsługuje
gtk-launch
po prostu gogtk-launch <file>
gdzie jest nazwa pliku .desktop z.desktop
częścią lub bez niejTak się
gtk-launch foo
otwierafoo.desktop
(
gtk-launch
dokumentacja ).Desktop powinien znajdować się w / usr / share / applications, / usr / local / share / applications lub ~ / .local / share / applications
Można używać z terminala lub alt + F2 (alt + F2 przechowuje polecenia w historii, więc łatwo dostępne)
źródło
Na dzień dzisiejszy (12.10) błąd jest nadal obecny. W rzeczywistości zależy to od tego, jak działa
gvfs-open
(nazywany przezxdg-open
).Mimo to udało mi się szybko obejść (kradzież inspiracji z kodu źródłowego nautilus). Jest nieco skomplikowany, ale działa bezbłędnie na Ubuntu 12.10, dodając znaczącą ikonę (nie więcej
?
) w programie uruchamiającym Unity.Najpierw napisałem skrypt Pythona za pomocą Gio i umieściłem go jako
~/bin/run-desktop
:Skrypt musi mieć uprawnienia do wykonywania, więc uruchomiłem to w terminalu:
Następnie utworzyłem względny
.desktop
wpis na~/.local/share/applications/run-desktop.desktop
:Wreszcie związana wpis jako domyślnej obsługi w
~/.local/share/applications/mimeapps.list
ramach[Default Applications]
sekcji jako:Teraz:
xdg-open
coś.desktop działa zgodnie z oczekiwaniami#!/usr/bin/xdg-open
Działa również hashbang nad plikiem wykonywalnym na pulpicieRozwiązanie
gvfs-open
problemu będzie bezużyteczne , ale w międzyczasie ...źródło
Exec=
wierszami i%
parametrami./usr/bin/xdg-openpy
i nadałem muchmod +x
- i użyłemlauncher.launch([],context)
zamiast...None,context)
(z powodu „ TypeError: argument 1: Musi być sekwencją, a nie NoneType ”). Terazxdg-openpy app.desktop
działa z wiersza poleceń (i wszystko normalnie po dwukrotnym kliknięciuapp.desktop
) i może mi przypominać, jeśli spróbuję zadzwonić do terminaluxdg-open
i nacisnąć klawisz Tab. Twoje zdrowie!.desktop
pliku, więc jest to najbardziej rozsądne (i bezpieczne) podejście. Używa również nowoczesnychgi.repository
zamiast przestarzałychpygtk
, więc świetnie! :)Właściwy sposób
Naprawdę powinieneś używać,
gtk-launch
jeśli jest dostępny. Zwykle jest to część pakietu libgtk-3-bin (może to różnić się w zależności od dystrybucji).gtk-launch
jest używany w następujący sposób:Uwaga:
gtk-launch
wymaga zainstalowania pliku .desktop (tj. Umieszczonego w/usr/share/applications
lub~/.local/share/applications
).Aby obejść ten problem, możemy użyć chwiejnej funkcji Bash, która tymczasowo instaluje żądany plik .desktop przed jego uruchomieniem. „Prawidłowy” sposób instalacji pliku .desktop polega na tym,
desktop-file-install
ale zignoruję to.Możesz użyć go w ten sposób (a także przekazać dodatkowe argumenty lub identyfikatory URI, jeśli chcesz):
Manualna alternatywa
Jeśli chcesz ręcznie przeanalizować i wykonać plik .desktop , możesz to zrobić za pomocą następującego
awk
polecenia:Jeśli chcesz traktować
awk
polecenie jak skrypt typu „wszystko w jednym”; możemy nawet wyświetlić komunikat o błędzie i wyjść z kodem powrotu 1, jeśli nie zostanie znalezione polecenie Exec :Wyżej wymienione polecenia będą:
%f
,%u
,%U
). Możliwe jest zastąpienie ich argumentami pozycyjnymi zgodnie z zamierzeniami specyfikacji, ale spowodowałoby to znaczną złożoność problemu. Zobacz najnowszą specyfikację wpisu na pulpicie .Uwaga: ten skrypt AWK rozwiązuje kilka przypadków skrajnych, które mogą, ale nie muszą być poprawnie rozwiązane przez niektóre inne odpowiedzi. W szczególności to polecenie usuwa wiele zmiennych Exec (uważając, aby w przeciwnym razie nie usunąć symbolu%), wykona tylko jedno polecenie wiersza Exec i zachowa się zgodnie z oczekiwaniami, nawet jeśli polecenie wiersza Exec zawiera jeden lub więcej znaków równości (np
script.py --profile=name
.).Tylko kilka innych zastrzeżeń ... Zgodnie ze specyfikacją TryExec to:
Mając to na uwadze, nie ma sensu wykonywać jego wartości.
Inne obawy dotyczą ścieżki i terminala . Ścieżka składa się z katalogu roboczego do uruchomienia programu. Terminal to wartość logiczna, która wskazuje, czy program jest uruchamiany w oknie terminala. Można to wszystko rozwiązać, ale nie ma sensu wymyślać koła, ponieważ istnieją już implementacje specyfikacji. Jeśli chcesz wdrożyć ścieżkę , pamiętaj, że
system()
spawnuje podproces, więc nie możesz zmienić katalogu roboczego, wykonując coś takiegosystem("cd \047" working_directory "\047"); system(command)
. Można jednak przypuszczalnie zrobić coś takiegosystem("cd \047" working_directory "\047 && " command)
. Uwaga \ 047 to pojedyncze cudzysłowy (więc polecenie nie pęka na ścieżkach ze spacjami).Python Alternative
Jestem kradzież stronę z Carlo tutaj , który zasugerował stworzenie skryptu Pythona aby skorzystać z gi modułu. Oto minimalny sposób wykonania tego samego kodu z powłoki bez konieczności tworzenia pliku i martwienia się o operacje we / wy.
Następnie uruchom funkcję uruchamiania w następujący sposób:
Uwaga: użycie identyfikatorów URI jest opcjonalne. Ponadto nie jest przeprowadzane sprawdzanie błędów, więc upewnij się, że program uruchamiający istnieje i jest czytelny (przed użyciem), jeśli chcesz, aby skrypt był trwały.
źródło
awk
polecenie jest miłe. Dlatego +1awk
rozwiązanie nie będzie działać poprawnie, jeśli polecenie ma podwójne znaki spacji lub ukośniki odwrotne. Łamie na to:Exec=env WINEPREFIX="/path/to/.wine" wine c:\\\\windows\\\\command\\\\start.exe /Unix /path/to/.wine/dosdevices/c:/users/Public/Рабочий\\ стол/appname.lnk
Adex
rozwiązanie działa dobrze.Podczas gdy OP nie pytał o KDE, dla każdego, kto korzysta z KDE, można użyć następującego polecenia:
kioclient exec <path-to-desktop-file>
W Fedorze jest to uwzględnione w
kde-runtime
rpm.źródło
Możesz użyć dex .
źródło
.desktop
pliki. I może też tworzyć.desktop
pliki, tak! :-)wydaje się działać w wersji 13.10, jeśli zainstalowano exo-utils (podobnie jak w przypadku Xubuntu).
źródło
Dodatek do odpowiedzi Hamisha.
Biorąc pod uwagę skrypt deskopen, możesz użyć odwołania do niego jako linii shebang w pliku .desktop , ponieważ znak komentarza jest nadal
#
. To znaczy, umieść to jako pierwszy wiersz pliku .desktop :Następnie oznacz plik .desktop jako wykonywalny (np. Za pomocą a
chmod +x whatever.desktop
), a następnie możeszi voilà - Aplikacja zostanie otwarta! (W komplecie z podanym plikiem ikon, choć nie mam pojęcia jak.)
Teraz, jeśli chcesz, aby deskopen przechodził przez dowolne parametry wiersza poleceń, możesz zamiast tego użyć tej lekko zmodyfikowanej wersji:
Nawiasem mówiąc, próbowałem użyć
"#{@:2}"
zamiastshift
ing, ale wciąż dawało mi to „złe zastąpienie” ...źródło
"${@:1}"
zamiastshift
, ale to wymagabash
zamiastsh
w#!
shebang. IMHO twoje oryginalne podejście do zmiany jest prostsze i lepszeObecnie nie ma aplikacji, która robi to, co opisujesz w archiwach Ubuntu. Trwają prace nad stworzeniem ogólnego rozwiązania zapewniającego integrację środowisk pulpitu (takich jak Openbox), które nie są zgodne ze specyfikacjami XDG.
Arch Linux pracuje nad implementacją xdg-autostart opartą na bibliotekach python-xdg. Z tego, co mogę znaleźć, wydaje się, że nie jest to jeszcze całkowicie kompletne, ale ma kilka raportów o sukcesie.
Istnieje także implementacja C ++ xdg-autostart na gitorious (http://gitorious.org/xdg-autostart/), która prawdopodobnie skorzystałaby z szerszego zastosowania.
Jeśli którekolwiek z tych rozwiązań będzie dla Ciebie odpowiednie, rozważ przesłanie niezbędnych prac w celu włączenia ich do Debiana lub Ubuntu.
Aby użyć dowolnego narzędzia z openstart, nazwałbyś go w /etc/xdg/openbox/autostart.sh (jeśli poprawnie czytam dokumentację openbox). Jeśli to nie zadziała, prawdopodobnie możesz to wywołać w dowolnym skrypcie inicjującym sesję openbox.
źródło
Nie mam natychmiastowego rozwiązania spełniającego wymóg „używania standardowego polecenia” , ale jeśli chcesz minimalnie parsować
.desktop
pliki lub chcesz utworzyć alias Bash, to powinny działać:awk -F= '/Exec=/{system($2); exit}' foo.desktop
innym podejściem, które może być interesujące, byłoby utworzenie
binfmt-misc
metody na poziomie jądra niż dopasowywania w.desktop
plikach (sprawdźgrep -r . /proc/sys/fs/binfmt_misc/
te wzorce, które obecnie włączasz).Pod koniec dnia coś gdzieś będzie musiało przeanalizować
.desktop
pliki, to tylko pytanie, jak to jest „standardowe / domyślne”.źródło
awk
zamiast łańcuchagrep
s ised
s.Exec=
linii: /Wziąłem skrypt z powyższej odpowiedzi Carlo i podjąłem próbę ulepszenia go na własny komputer.
Ta wersja skryptu pozwoli Ci uruchomić dowolną aplikację tak, jakbyś wprowadził ją na HUD, o ile prawdopodobnie będzie to pierwszy wynik. Pozwala także przekazywać argumenty plików dla plików .desktop, które nie obsługują identyfikatorów URI.
źródło
Próbując przetestować te pliki, znalazłem najprostszy sposób, aby sprawdzić, czy DM lub menedżer sesji zrobi to, czego się spodziewałem, aby otworzyć otaczający katalog w przeglądarce folderów interfejsu użytkownika, a następnie kliknąć dwukrotnie, aby je otworzyć.
Jeśli znajdujesz się w wierszu poleceń:
gvfs-open .
lubgnome-open .
otworzy go w skonfigurowanej przeglądarce folderów.Sed nie będzie odzwierciedlał zachowania DM, w tym kłopotliwych rzeczy, takich jak ucieczki i cytowanie tam, gdzie naprawdę nie chciałbyś alternatywnego zachowania. To nie jest wiersz poleceń, ale sprawdził poprawność rzeczy. Uznałem również, że ustawienie jest
Terminal=true
przydatne do debugowania.źródło
Ta SO odpowiedź była dla mnie jasna: nie próbuj uruchomić pliku pulpitu, wykonaj plik wskazany w pliku pulpitu.
Na przykład uruchom /home/jsmith/Desktop/x11vnc.sh
źródło
(Opracowano na podstawie różnych innych odpowiedzi tutaj)
W zależności od systemu i różnych błędów, które mogą, ale nie muszą istnieć w systemie, wypróbuj następujące rozwiązania, aż jeden z nich zadziała:
xdg-open program_name.desktop
exo-open program_name.desktop
gtk-launch program_name.desktop
kioclient exec program_name.desktop
dex program_name.desktop
Należy pamiętać, że w systemach Ubuntu programy uruchamiające pulpity z „menu Start” są dostępne w
/usr/share/applications/
.Na przykład, aby pokazać, które z powyższych poleceń działają lub nie działają w moim systemie Ubuntu 14.04, oto wyniki następujących wywołań dla mnie:
xdg-open /usr/share/applications/eclipse_for_cpp.desktop
# Nie działa z powodu błędu (próbuje zmusić mnie do zapisania tego pliku .desktop)exo-open /usr/share/applications/eclipse_for_cpp.desktop
# Pracujegtk-launch /usr/share/applications/eclipse_for_cpp.desktop
# Nie działa z „GTk-launch: brak takiej aplikacji”kioclient exec /usr/share/applications/eclipse_for_cpp.desktop
# Pracujedex /usr/share/applications/eclipse_for_cpp.desktop
# Nie działa isudo apt install dex
nie można zlokalizować pakietu dexźródło
Upewnij się, że skrypt, na który wskazuje plik pulpitu, jest wykonywalny.
Jeśli nadal nie działa. Zmień plik pulpitu na uruchamialny przez zmianę
Terminal=true
i umieść go w skrypcie bash. Uruchom skrypt, aby złapać wyjście błędu. Wróć po poprawieniu błędów.źródło
Odpowiedź Hamisha jest świetna, ale chciałbym zasugerować prostszą alternatywę, z mniejszym zaangażowaniem:
$(awk -F= '/^Exec/||/^TryExec/ {print $2;exit}' /usr/share/applications/firefox.desktop)
W tym przypadku
awk
szuka linii zaczynającej się odExec
, a następnie po prostu wypisujemy pola po tej linii, używając pętli i=
wypisujemy pole 2, tj. Cokolwiek następuje po tym polu. Nawiasy klamrowe na końcach poleceń,$(...)
są podstawieniem parametrów, dlatego powłoka wykona wszystkie zwrócone polecenia awk; w tym przypadku zwraca rzeczywiste polecenie, które następuje poExec=
.W niektórych rzadkich przypadkach może występować więcej niż jeden
=
znak, co wciąż jest możliwe. W tym celu sugerujęźródło
awk
i Serg =)TryExec
, może powinieneś sprawdzić swoje drugie polecenie =)awk
jest moją bronią z wyboru, jeśli chodzi o przetwarzanie tekstu. Poza tym jego składnia jest bliskaC
. Aha, i już dodałemTryExec
część ^ _ ^%f
,%u
,%U
lub coś w tym za pomocą polecenia?