Terminalde bir .desktop dosyası çalıştırma


141

Toplayabildiğim kadarıyla .desktopdosyalar, uygulama ayarlarının özelleştirilmesine izin veren kısayollar. Mesela, /usr/share/applications/klasörümde bir sürü var .

Bu klasörü açarsam nautilus, bu uygulamaları yalnızca ilişkili dosyayı çift tıklatarak firefox.desktopçalıştırabilirim , örn . Firefox'u çift ​​tıklatarak çalışır. Ancak aynı şeyi terminal üzerinden yapmanın bir yolunu bulamıyorum.

Bunu yaparsam gnome-open foo.desktopbasitçe foo.desktopbir metin dosyası olarak açılır . Çalıştırılabilir hale getirir ve sonra bash'de çalıştırırsam basitçe başarısız olur (beklenen, açıkça bash betiği değil).
EDIT: Sahipliği kendime değiştirsem bile exec /fullpath/foo.desktop, bana Permission deniedmesaj atıyor. Çalıştırılabilir hale getirip aynı komutu uygularsam, kullandığım terminal sekmesi kapanır (sanırım çöküyor). Sonunda yaparsam sudo exec /fullpath/foo.desktophata bildirimi alıyorum sudo: exec: command not found.

Bu benim sorum, foo.desktopterminalden bir dosyayı nasıl çalıştırabilirim ?


5
Not: execBaşarısız olmanızın nedeni, yürütmenin şu anda çalışan işleminizi belirttiğiniz işlemle değiştirmesidir, bu nedenle yaptığınız işlem, kabuğunuzu derlenmiş bir ikili olarak çalıştırarak masaüstünü değiştirmeye çalışmaktı. Yapamamanın nedeni sudo exec, bir kabuğun yerleşik olduğu ve ikili bir komut olmadığıdır.
Daenyth

İlginç, neden sekmenin kapanmasına neden olduğunu merak ediyordum.
Malabarba


Anladığım kadarıyla .desktop dosyasını ayrıştırıyorlar. Bağlantı için yine de teşekkür ederim.
enzotib

moderatörler: oops, yanlışlıkla işaretledim sanırım, öyleyse üzgünüm
Croad Langshan

Yanıtlar:


54

Çalıştırılan komut, önce aşağıdakileri Exec=ayıklayıp çalıştırabilmeniz için önce masaüstü dosyasının içinde bulunur :

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

Bunu yıkmak için

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

Bunu bir dosyaya koyabilir ~/bin/deskopen, içeriğini söyleyebilirsiniz.

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

O zaman çalıştırılabilir yap

chmod +x ~/bin/deskopen

Ve sonra yapabilirsin, örneğin

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

Argümanlar ( %u, %Fvb.) Http://standards.freedesktop.org/desktop-entry-spec/desktop-entry-spec-1.0.html#exec-variables adresinde ayrıntılı olarak açıklanmıştır - bunların hiçbiri komut satırında başlatmayla ilgili değildir. .


Bu, şu ana kadarki en iyi sonucu verir, ancak bazen istenmeyen davranışlar yaratır. "Exec =" satırı% u veya% i gibi bir argümana sahip olduğunda olur. Bash bu dizgiyi normal bir argüman olarak iletmeye çalışır. Örneğin, grep '^Exec' firefox.desktop | sed 's/^Exec=//'Firefox'u www.% U.com yükleyen bir sekme ile açar .
Malabarba

Şimdilik sedherhangi bir argümanı kaldırmak için bir saniye ekledim . Ancak, onu çalıştırmanın daha "doğal" bir yolu olabileceğini düşünüyorum.
Malabarba

Cevabımı fazladan sed ile güncelledim - masaüstü dosyalarının argümanları olabileceğini unuttum.
Hamish Downer,

"Exec =" çoklu zaman görünmesi olabilir beri, "grep" sonra boruya "-1 kuyruk" a eklemek gerekir ve bundan sonra, sadece son görünüm yürütülmelidir ..
papatya

13
-1: Bu basit .desktopdosyalar için işe yarayabilir , ancak bu gibi Path=ve TryExec=yürütmeyi etkileyebilecek girişleri yok sayar . Ayrıca Exec=, dosya Masaüstü Eylemleri içeriyorsa ("quicklists") yanlış yapar
MestreLion

85

Cevap olmalı

xdg-open program_name.desktop

Ancak bir hata nedeniyle bu artık işe yaramaz.


7
WoW bu hala bir hata, xdg'de ilerleme var. exo-openGeçici çözüm olarak listelenir ve ayrıca gedit'i açar. :(
Drew

1
@RichardHolloway: arama gnome-openyapmaz, tam tersidir xdg-open! Bu yüzden mesele, gvfs-open(halefi veya gnome-open) yatıyor
MestreLion

13
"Artık çalışmıyor"? Asla yapmadı! xdg-openmimetype derneği ile çalışır ve .desktopdosyalar metin editörleriyle ilişkilendirilir, çünkü bunlar metnin bir alt sınıfıdır
MestreLion

13
bu çok aptalca (Terminalden bir Masaüstü dosyasını çalıştırmak için mantıklı bir yol yoktur)
Sam Watkins

2
Arch Linux'ta benim için çalışıyor, ama belki de Ubuntu'ya özgü bir hata.
Victor

75

gtk-launchSadece basitçe gitmek destekleyen herhangi bir ubuntu ile

gtk-launch <file>.desktopparçası olan veya olmayan .desktop dosyasının adı

Yani gtk-launch fooaçılırfoo.desktop

( gtk-launchbelgeler )

.Desktop / usr / share / uygulamalar, / usr / yerel / paylaşım / uygulamalar veya ~ / .local / paylaşım / uygulamalarda olmalıdır.

Terminal veya alt + F2'den kullanılabilir (alt + F2 komutu tarihteki çok kolay erişilebilir)


Bu şekilde, debian da çalışıyor.

gtk-launch firefox.desktop ~ / .local / share / applications / benim için ~ / .local / share / applications / dizinini görüntüleyerek firefox'u başlattı . Doğru görünüyorsa, firefox, .desktop dosyasının dizinini argüman olarak geçirmemeliydi. Aslında, gtk-
launch'a geçirilen dizinin

Yuppi! İşe yarayan bir cevap!
Alicia,

Bu da benim için Arch Linux'ta çalışıyor. Diğer cevapların hiçbiri tatmin edici değildi, ancak bu iyi. :-) Ben KDE çalıştırıyor olmama rağmen çalışıyor.
MountainX

2
Bunun hiçbir sürümü benim için Ubuntu 18.10'da çalışmıyor. Masaüstü şikayetli klasörde olup olmadığımı, .desktop uzantısını dahil edip etmediğimi veya dizini ayrı ayrı adlandırıp adlandırmamamı, uygulamanın mevcut olmadığından şikayet ediyor.
Joseph Garvin

38

Bugün (12.10) itibariyle hata hala mevcut. Aslında nasıl çalıştığı gvfs-open(denir xdg-open) bağlı olarak .

Yine de hızlı bir çözüm buldum (nautilus kaynak kodundan ilham aldım). Biraz sarsılmış durumdadır, ancak Ubuntu 12.10'da kusursuz çalışır ?, Unity başlatıcısına anlamlı bir simge (daha fazla değil ) ekler .

İlk önce, Gio kullanarak bir python betiği yazdım ve kaydettim ~/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)

Betik çalıştırılabilir izne sahip olmalı, bu yüzden bunu bir terminalde çalıştırdım:

chmod +x ~/bin/run-desktop

Sonra göreceli .desktopgirişi şurada oluşturdum ~/.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

Sonunda girişi ~/.local/share/applications/mimeapps.listaşağıdaki [Default Applications]bölümün altındaki varsayılan işleyici olarak ilişkilendirdim:

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

Şimdi:

  • xdg-open bir şey.desktop beklendiği gibi çalışıyor
  • #!/usr/bin/xdg-open Çalıştırılabilir bir masaüstü girişinin üstüne hashbang da çalışıyor

Hatayı ne gvfs-openzaman çözecek işe yaramaz bir iş olacak, ama bu arada ...


1
Bu, Hamish Downer'ın cevabından daha iyi çalışır , çünkü komutta doğru olarak birçok Exec=satır ve %parametre ile ilgilenecektir .
Flimm

4
Kod için teşekkürler - Lucid'deyim ve bunu basitçe kaydettim /usr/bin/xdg-openpyve a chmod +x- kullandım ve launcher.launch([],context)yerine kullandım ...None,context)(" TypeError: argüman 1: dizi olmalı, NoneType değil "). Şimdi xdg-openpy app.desktopkomut satırından çalışır (ve çift tıklandığında hepsi normaldir app.desktop) ve terminalde arayarak xdg-opensekme basmaya çalışırsam bana hatırlatabilir . Şerefe!
sdaau

3
+1. .desktopDosyayı elle ayrıştırma gerektirmeyen tek cevap budur , bu yüzden en akıllıca (ve güvenli) bir yaklaşımdır. Ayrıca kullanımdan gi.repositorykaldırılmış yerine modern kullanır pygtk, çok harika! :)
MestreLion

2
Aslında, bu Carlo Pellegrini'nin cevabı ile ilgili bir soru. Ben bir yeniyim, yerleştirmenin daha iyi bir yolu varsa lütfen beni düzeltin. Komut dosyası gerçekten iyi çalışıyor, ancak Birlik başlatıcısı üzerinde kullandığım simge .desktop dosyasında tanımlanan simge değil, 'Exec'ed komutunun varsayılan simgesi. Bununla ilgili bir fikrin var mı?
Ingo Leonhardt

1
Geçen cevap yazmak @Noitidart bazı google yapmak mo açtı ve ben buldum o . Kontrol
Ingo Leonhardt

31

Doğru yol

gtk-launchMümkünse , gerçekten kullanıyor olmalısınız . Genellikle libgtk-3-bin paketinin bir parçasıdır ( dağıtımdan farklılık gösterebilir).

gtk-launch aşağıdaki gibi kullanılır:

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

Lütfen .desktop dosyasının yüklenmesini gtk-launchgerektirir (örn. Veya içinde bulunur )./usr/share/applications~/.local/share/applications

Bu yüzden, bunun üstesinden gelmek için, başlatılmadan önce istenen .desktop dosyasını geçici olarak yükleyen, küçük bir Bash işlevini kullanabiliriz . Bir .desktop dosyasını kurmanın "doğru" yolu bittidesktop-file-install ama bunu görmezden geleceğim.

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

    )

}

Bunun gibi kullanabilirsiniz (ve isterseniz ek argümanlar veya URI'ler boyunca da iletin):

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

Manuel Alternatif

Bir .desktop dosyasını el ile çözümlemek ve yürütmek istiyorsanız, aşağıdaki awkkomutu kullanarak yapabilirsiniz :

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

awkKomutu hepsi bir arada bir komut dosyası gibi ele almak istiyorsanız ; Bir Exec komutunun bulunamaması durumunda bir hata mesajı gösterebilir ve 1 dönüş kodu ile çıkabiliriz :

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}}'

Yukarıda belirtilen komutlar:

  1. Exec ile başlayan satırı bul =
  2. Exec Kaldır =
  3. Herhangi Exec değişkenleri çıkarın (örneğin %f, %u, %U). Şartnamenin öngördüğü şekilde bunları konumsal argümanlarla değiştirmek mümkündür, ancak bunu yapmak soruna önemli bir karmaşıklık katacaktır. En son Masaüstü Giriş Belirtimi bölümüne bakın .
  4. Komutu yürütün
  5. Hemen uygun çıkış koduyla çıkın (birden fazla Exec satırı çalıştırmamak için )

Not, bu AWK betiğinin, diğer cevapların bir kısmı tarafından düzgün bir şekilde ele alınabilecek veya cevaplanamayacağı birkaç son durumu ele aldığını unutmayın. Özellikle, bu komut birden fazla Exec değişkenini kaldırır (% sembolünü başka şekilde kaldırmamaya dikkat ederek), yalnızca tek bir Exec line komutu yürütür ve Exec line komutu bir veya daha fazla eşittir işareti (örn. script.py --profile=name) İçeriyorsa bile beklendiği gibi davranır .

Sadece birkaç diğer uyarılar ... Şartnameye göre, TryExec :

Programın gerçekten yüklü olup olmadığını belirlemek için kullanılan diskteki yürütülebilir bir dosyanın yolu. Yol mutlak bir yol değilse, dosya $ PATH ortam değişkeninde aranır. Dosya yoksa veya çalıştırılabilir değilse, giriş göz ardı edilebilir (örneğin menülerde kullanılmaz).

Bunu akılda tutarak, değerini uygulamak mantıklı değil.

Diğer bazı endişeler Yol ve Terminal'dir . Yol , programı çalıştırmak için kullanılan çalışma dizininden oluşur. Terminal , programın bir terminal penceresinde çalıştırılıp çalıştırılmadığını gösteren bir booleandır. Bunların hepsi ele alınabilir, ancak spesifikasyonun hali hazırda uygulamaları olduğu için tekerleği yeniden icat etmenin bir anlamı yoktur. Path uygulamasını uygulamak istiyorsanız , system()bir alt işlemi başlatacağını unutmayın , böylece çalışma dizinini benzer bir şey yaparak değiştiremezsiniz system("cd \047" working_directory "\047"); system(command). Ancak, muhtemelen bir şeyler yapabilirsin system("cd \047" working_directory "\047 && " command). Not \ 047 tek tırnak işaretidir (bu nedenle komut boşluk içeren yollarda kesilmez).

Python Alternatif

Burada Carlo’dan bir sayfa çalıyorum , ki gi modülünü kullanmak için bir Python betiği yaratmayı önerdi . İşte aynı kodu kabuktan bir dosya oluşturmadan ve G / Ç hakkında endişelenmenize gerek kalmadan yürütmek için minimal bir yol.

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

}

Sonra başlatıcı işlevini aşağıdaki gibi yürütün:

launch ./path/to/shortcut.desktop

URI kullanımının isteğe bağlı olduğunu unutmayın. Ayrıca, hiçbir hata kontrolü yapılmaz, bu nedenle, başlatıcınızın var olduğundan ve komut dosyanızın dayanıklı olmasını istiyorsanız okunabilir olmasını sağlamak isteyebilirsiniz.


Ama awkemir güzel. Bu nedenle, bir +1
AB

Bu bağlamda URI nedir? Keyfi bir klasörde bir masaüstü dosyam var. Ne halt edersem, gtk-launch'ı başka bir betiğe sarmaya gerek kalmadan üzerinde nasıl çalıştırırım? Bu çıldırtıcı.
Joseph Garvin

awkKomutta çift çıkışlı beyaz boşluklar veya ters eğik çizgiler varsa, bu çözüm düzgün çalışmayacaktır. O bu konuda kırar: Exec=env WINEPREFIX="/path/to/.wine" wine c:\\\\windows\\\\command\\\\start.exe /Unix /path/to/.wine/dosdevices/c:/users/Public/Рабочий\\ стол/appname.lnkVe dexçözüm çalışıyor.
MarSoft

27

OP KDE hakkında soru sormazken, KDE çalıştıran herkes için aşağıdaki komut kullanılabilir:

kioclient exec <path-to-desktop-file>

Fedora'da bu, kde-runtimerpm'ye dahil edilir .


5
Geliştirildi çünkü çalışıyor. Bu programı yüklediğiniz sürece KDE kullanmaya gerek yok.
temel6

Bundan kurtulmanın bir yolu var mı? Sadece .desktop dosyasında (plazma kabuğu ile) başlatılan bir hataya sahip olan clementine oynatıcısını derledim. Ve nasıl bir çıktı günlüğü günlüğünün olması gerektiğini çözemiyorum.
Kwaadpepper 16:15

@Kwaadpepper, .desktop dosyanızı kullanarak komutunuzu dahili olarak çalıştıran ve çıktıyı bir dosyaya yönlendiren bir kabuk komut dosyası başlatmak için kullanabilirsiniz.
Raman

Şu anda kioclient'i Arch Linux for KDE paketlerinde bulamıyorum. Ancak, gtk-launch KDE altında benim için çalışıyor.
MountainX

15

Dex'i kullanabilirsiniz .

dex foo.desktop

2
IMHO bu tam olarak doğru cevap: Bir araç, sadece dosya olarak parametre olarak yapılan tek bir çağrı. El yazısıyla yazılmış .desktopdosyaları test etmek için de onu aradım . Ve .desktopyay da dosyalar yaratabilir ! :-)
Axel Beckert

Mükemmel! Dex gist.github.com/stuaxo/4169fc1342c496b7c8f7999188f2f242 / usr / share / applications / komutunu kullanan bir .desktop dosyası eklerseniz , / usr / share / applications / dizinine masaüstü dosyalarını başlatamazsınız.
Stuart Axon

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

eğer exo-utils kurulu ise 13.10 sürümünde çalışıyor gibi görünüyor (Xubuntu'daki gibi).


Evet, sadece Ubuntu Studio 14.04'te test ettim. BTW. Orada da xdg-open ve gvfs-open çalışması var.
jarno

15'te de çalışıyor
Jonathan

Debian'ı xfce ile kullanma. Harika çalışıyor!
king_julien

Ubuntu'da benim için çalışıyor 14.04
Tyler Collier,

8

Hamish'in cevabına Zeyilname.

Deskopen betiği göz önüne alındığında, yorum karakteri hala olduğundan, ona bir .desktop dosyasındaki shebang satırı olarak bir başvuru kullanabilirsiniz #. Yani, bunu .desktop dosyasının ilk satırı olarak koyun :

#!/usr/bin/env deskopen

Sonra .desktop dosyasını çalıştırılabilir olarak işaretleyin (örneğin a ile chmod +x whatever.desktop) ve sonra

path/to/whatever.desktop

ve voilà - Uygulama açılacak! (Belirlediğim simge dosyasıyla tamamlayın, nasıl yapılacağı hakkında hiçbir fikrim yok.)

Şimdi, deskopen'in komut satırı parametrelerinden geçmesini istiyorsanız, bunun yerine hafifçe değiştirilmiş olan bu sürümü kullanabilirsiniz:

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

Bir yana, ing "#{@:2}"yerine kullanmayı denedim shift, ama bana 'kötü ikame' vermeye devam etti ...


Bunun daha uygun bir şekilde Hamish'in cevabına bir yorum olduğunu biliyorum, ancak yeni bir kullanıcıyım ve yorum yapmasına izin verilmiyor. Oh iyi!
pabst

Eğer ününüz varsa, en uygun eylem aslında bu cevabı düzenlemek olacaktır.
Flimm

Grevde, herhangi biri düzenleme önerebilir, hatta giriş yapmamış kullanıcılar bile yapabilir! Hiçbir şekilde biggie değil.
Flimm

1
Bu tek başına bir cevap, sorun değil.
Bruno Pereira

"${@:1}"yerine kullanabilirsiniz shift, ancak bu , shebang'ınızın bashyerine gerektirir . IMHO orijinal vardiya yaklaşımınız daha basit ve daha iyish#!
MestreLion

6

Şu anda Ubuntu arşivlerinde anlattıklarınızı yapan bir uygulama yok. Bu XDG özellikleriyle uyumlu olmayan masaüstü ortamlarına (openbox gibi) entegrasyon sağlamak için genel bir çözüm oluşturmak için birkaç çaba var.

Arch Linux, python-xdg kütüphanelerine dayanan bir xdg-autostart uygulaması üzerinde çalışıyor. Bulabildiğim kadarıyla, bu henüz tam olarak tamamlanmadı, ancak bazı başarı raporları var.

Daha geniş kullanımdan faydalanacak olan bakıcı (xdg-autostart/) C ++ uygulaması da (http://gitorious.org/xdg-autostart/) mevcuttur.

Çözümlerden herhangi biri sizin için işe yararsa, lütfen Debian veya Ubuntu’ya dahil edilmesi için gerekli çalışmaları göndermeyi düşünün.

Openstart ile her iki aracı da kullanmak için, /etc/xdg/openbox/autostart.sh içinde (openbox belgelerini doğru okuyorsam) çağırırsınız. Bu işe yaramazsa, muhtemelen herhangi bir openbox oturumu başlatma komut dosyalarından birini arayabilirsiniz.


Ne duyacağımı değil, yine de bilgi için teşekkürler
enzotib

6

"Standart bir komut kullanma" gerekliliğini karşılayan hemen bir çözümüm yok , ancak .desktopdosyaları en az düzeyde ayrıştırmak veya bir Bash takma adı oluşturmak istiyorsanız, aşağıdakiler çalışmalıdır:

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

ilginç olabilecek başka bir yaklaşım binfmt-misc, .desktopdosyalarda eşleşmekten ziyade çekirdek düzeyinde bir yöntem oluşturmak olacaktır ( grep -r . /proc/sys/fs/binfmt_misc/şu anda etkinleştirdiğiniz kalıplara bakın ).

Günün sonunda, bir yerde bir şey.desktop dosyaları ayrıştırmak zorunda kalacak , bu sadece "standart / varsayılan" sorusu.


Teşekkürler ilginç. "Standart" olarak DE tarafından sağlanan ve freedesktop.org'a uyan bir şey demek istiyorum.
enzotib

İçin upvote awkziyade bir zincir greps ve seds.
jmtd 21:13

Olumlu, her ne kadar işe yaramazsa da (ya da daha iyisi - çok işe yarıyorsa), asıl çizginiz varsa Exec=: /
Boris Churzin 4:17

2

Senaryoyu yukarıdaki Carlo'nun cevabından aldım ve kendi masaüstü kullanımım için geliştirmeye çalıştım.

Komut dizisinin bu sürümü, herhangi bir uygulamayı HUD'a girmiş gibi, ilk sonuç olması muhtemel olduğu sürece çalıştırmanıza izin verir. Ayrıca, URI'leri desteklemeyen .desktop dosyaları için dosya argümanlarını iletmenizi sağlar.

#!/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

Bu dosyaları test etmeye çalışırken, DM veya oturum yöneticisinin beklediğim şeyi yapıp yapmadığını kontrol etmenin en basit yolunu buldum ve UI klasör tarayıcısında çevreleyen klasörü açmak ve ardından açmak için çift tıklayın.

Bir komut satırındaysanız: gvfs-open .veya gnome-open .yapılandırılmış klasör tarayıcısında açacaktır.

Baştan çıkarıcı şey, kaçışlar ve gerçekten alternatif davranış istemeyeceğiniz yerlerden alıntı yapmak gibi fiddly şeyler de dahil olmak üzere DM'nin davranışını yansıtmayacak. Komut satırı değil, ancak bir şeyleri doğruladı. Ayrıca Terminal=truehata ayıklama için yararlı bir ayar buldum .


Terminal hemen kayboluyor, Terminal = true kullanırken mesajı görecek vaktim yok:
15'de saat 11

1

Bu SO cevabı benim için netleştiren şeydi: masaüstü dosyasını yürütmeye çalışmayın, masaüstü dosyasında gösterilen dosyayı yürütün.

Örneğin, /home/jsmith/Desktop/x11vnc.sh dosyasını yürütün

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

1

(Burada çeşitli diğer cevaplardan derlenmiştir)

Sisteminize ve sisteminizde bulunabilecek veya bulunmayabilecek çeşitli hatalara bağlı olarak, bunlardan biri çalışana kadar aşağıdakileri deneyin:

  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 sistemlerinde, "başlat menüsü" masaüstü rampanızın kullanıma sunulduğunu unutmayın /usr/share/applications/.

Örnek olarak, yukarıdaki komutlardan hangisinin Ubuntu 14.04 sistemimde çalıştığını veya çalışmadığını göstermek için, aşağıdaki benim için yapılan çağrıların sonuçları:

  1. xdg-open /usr/share/applications/eclipse_for_cpp.desktop # Hata nedeniyle başarısız oluyor (bu .desktop dosyasını kaydetmem için çalışıyor)
  2. exo-open /usr/share/applications/eclipse_for_cpp.desktop # Eserleri
  3. gtk-launch /usr/share/applications/eclipse_for_cpp.desktop # "Gtk-launch: böyle bir uygulama yok" ile başarısız oluyor
  4. kioclient exec /usr/share/applications/eclipse_for_cpp.desktop # Eserleri
  5. dex /usr/share/applications/eclipse_for_cpp.desktop# Başarısız, & sudo apt install dexdex paketini bulamıyor

0

Masaüstü dosyanızın işaret ettiği komut dosyasının da çalıştırılabilir olduğundan emin olun.

Hala işe yaramazsa. Masaüstü dosyasını değiştirerek terminalde çalıştırılabilir Terminal=trueduruma getirin ve bir bash betiğinin içine koyun. Hata çıktısını yakalamak için betiği çalıştırın. Hatalar düzeltildiğinde geri değiştirin.


0

Hamish'in cevabı harika, ancak daha az boru bağlantısıyla daha basit bir alternatif önermek istiyorum:

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

Bu durumda, awkile başlayan satırı arar Execve sonra döngüden yararlanarak bu satırdan sonra yalnızca alanları yazdırırız ve =alan 2'yi, yani o alandan sonra gelenleri basarız. Komutların uçlarındaki küme parantezleri $(...)parametre yerine geçmiştir, bu nedenle kabuk ne awk komutu döndürürse onu uygular; Bu durumda, sonra gelen gerçek komutu döndürür Exec=.

Bazı nadir durumlarda =, hala mümkün olan birden fazla işaret olabilir . Bunun için öneriyorum

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

Güzel awkve Serg =)
AB

Ve bazen, bir vardır TryExec, belki 2. komutunuzu kontrol etmelisiniz =)
AB

@ AB Hehe, awkmetin işlemeye gelince tercihimdeki silah. Ayrıca, sözdizimi yakındır C. Oh, ve zaten TryExecbölüm eklendi ^ _ ^
Sergiy Kolodyazhnyy

+1 =)
AB

Ama ne hakkında %f, %u, %Uveya komutun arkasına böyle bir şey?
AB
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.