Terminalde bir .desktop dosyasının çalıştırılması

116

Toplayabildiğim kadarıyla, .desktop dosyaları uygulamanın ayarlarının özelleştirilmesine izin veren kısayollardır. Örneğin, /usr/share/applications/ klasörümde çok sayıda dosya var.

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

gnome-open foo.desktop yaparsam, bir metin dosyası olarak foo.desktop dosyasını açar. Eğer çalıştırılabilir yaparsam ve bash içinde çalıştırırsam başarısız olur (ki bu beklenen bir şeydir, bash betiği değildir).
DÜZENLEME: Sahipliği kendim değiştirsem bile exec /fullpath/foo.desktop değeri bana Permission denied mesaj verir. Yürütülebilir ve aynı komutu yaparsam kullanıyorum terminal sekmesi kapatır (sanırım çöküyor sanırım). Son olarak, sudo exec /fullpath/foo.desktop yaparsam sudo: exec: command not found raporlama bildiren bir hata alırım.

Bu benim sorum, terminalden foo.desktop dosyasını nasıl çalıştırabilirim?

    
sordu Malabarba 04.10.2010 15:58

16 cevap

47

Çalıştırılan komut, Exec= ile önceleri önce masaüstü dosyasında bulunur, böylece bunu ayıklayıp çalıştırabilirsiniz:

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

Bunu kırmak 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 koyabilirsiniz, ~/bin/deskopen içeriği ile birlikte söyleyin

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

Daha sonra yürütülebilir hale getirin

chmod +x ~/bin/deskopen

Ve sonra yapabilirsin, örneğin

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

Bağımsız değişkenler ( %u , %F vb.) İşte - bunların hiçbiri komut satırında başlatmaya uygun değil.

    
verilen cevap Hamish Downer 04.10.2010 16:52
63

Cevap

olmalıdır
xdg-open program_name.desktop

Ancak, bir hata nedeniyle artık çalışmıyor.

    
verilen cevap Richard Holloway 04.10.2010 17:28
52

gtk-launch 'i destekleyen herhangi bir yeni ubuntu ile, yalnızca basitçe

gtk-launch <file> , .desktop bölümü olmayan .desktop dosyasının adıdır

Yani gtk-launch foo foo.desktop

dosyasını açıyor

<file> , /usr/share/application veya gtk-launch yürütme yerindeyse, gtk-launch <file> <uri> komuttur. ( gtk-launch dokümantasyon )

Terminal veya alt + F2'den kullanılabilir (alt + F2, tarihe kolayca erişilebilen komutlar depolar)

    
verilen cevap doug 02.12.2013 23:32
37

Bugün itibarıyla (12.10) hata hala mevcut. Aslında, gvfs-open 'sinin ( xdg-open tarafından çağrılan) nasıl çalıştığına bağlı.

Yine de, hızlı bir çözüm (nautilus kaynak kodundan ilham alarak) yaptım. Biraz kıvrık, ama Ubuntu 12.10 üzerinde kusursuz bir şekilde çalışıyor, Unity başlatıcısı üzerinde anlamlı bir simge (daha fazla ? yok) ekliyor.

Öncelikle, Gio'yı kullanarak bir python komut dosyası yazdım ve bunu ~/bin/run-desktop olarak kaydettim:

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

Komut dosyasının yürütülebilir izne sahip olması gerekiyor, bu yüzden bunu bir terminalde çalıştırdım:

chmod +x ~/bin/run-desktop

Ardından, .desktop bağlantısında ~/.local/share/applications/run-desktop.desktop girdisini oluşturdum:

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

Son olarak, girdiyi ~/.local/share/applications/mimeapps.list bölümünün altında [Default Applications] olarak varsayılan işleyici olarak ilişkilendirdim:

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

Şimdi:

  • xdg-open something.desktop beklendiği gibi çalışıyor
  • % Co_de% Yürütülebilir bir masaüstü girişinin üstünde hashbang çok çalışıyor

#!/usr/bin/xdg-open hatayı çözeceği zaman işe yaramaz, ancak bu arada ...

    
verilen cevap Carlo Pellegrini 11.01.2013 10:06
21

Doğru Yol

Kullanılabilirse gtk-launch değerini kullanmalısınız. Genellikle libgtk-3-bin paketinin bir parçasıdır (bu, dağıtımdan farklı olabilir).

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

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

Lütfen gtk-launch dosyasının .desktop dosyasının yüklenmesini gerektirdiğini unutmayın (örn. /usr/share/applications veya ~/.local/share/applications dizininde bulunur).

Bunun için, önce .desktop dosyasını başlatmadan önce geçici olarak yükleyen küçük bir Bash işlevini kullanabiliriz. Bir .desktop dosyasını "doğru" yükleme yolu desktop-file-install aracılığıyladır, ancak 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  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 "" 2>/dev/null || {
    [[  = *.desktop && -f  && -r  && -s  ]] || {
        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 "" "$launcherfile" &>/dev/null; then
        gtk-launch "$launchername" "${@:2}"
    else
        echo "ERROR: failed to copy launcher to applications directory" >&2
        return 1
    fi

    )

}

Bunu böyle kullanabilirsiniz (ve isterseniz ek argümanları veya URI'ları da iletebilirsiniz):

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

Manuel Alternatif

.desktop dosyasını manuel olarak ayrıştırmak ve yürütmek istiyorsanız, aşağıdaki awk komutunu kullanarak yapabilirsiniz:

awk '/^Exec=/ {sub("^Exec=", ""); gsub(" ?%[cDdFfikmNnUuv]", ""); exit system(
awk 'BEGIN {command=""} /^Exec=/ {sub("^Exec=", ""); gsub(" ?%[cDdFfikmNnUuv]", ""); command=
launch(){

# Usage: launch PATH [URI...]

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

}
; 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 7%s7\n", FILENAME > "/dev/stderr"} close("/dev/stderr"); exit 1}}'
)}' app-name.desktop

Hepsi bir arada komut dosyası gibi awk komutunu kullanmak isterseniz; Bir hata mesajı gösterebiliriz ve Exec komutunun bulunmaması durumunda 1'in bir dönüş kodu ile çıkabilirsiniz:

launch ./path/to/shortcut.desktop

Yukarıda belirtilen komutlar:

  1. Exec = ile başlayan satırı bulun
  2. Kaldır Exec =
  3. Herhangi bir Exec değişkenini kaldırın (ör. %f , %u , %U ). Bunları, şartname niyetinde olduğu gibi konumsal argümanlarla değiştirmek mümkündür, ancak bunu yapmak problem için önemli bir karmaşıklık katar. En son Masaüstü Giriş Belirtimi 'ni inceleyin.
  4. Komutu çalıştır
  5. Hemen uygun çıkış kodundan çıkın (çoklu Yürüt satırları yürütmemek için)

Not, bu AWK komut dosyası, diğer yanıtların bazıları tarafından düzgün bir şekilde ele alınabilecek veya edilmeyebilecek bazı kenar durumlarını ele almaktadır. Özellikle, bu komut birden çok Çalıştır değişkenini kaldırır (% sembolünü kaldırmaya özen göstermeden), yalnızca bir Exec komut satırı yürütür ve beklendiği gibi beklendiği gibi davranır. Yürüt satırı komutu bir veya daha fazla eşittir işareti içerir (ör. script.py --profile=name ).

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

  

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

Bununla akılda tutularak, onun değerini yerine getirmek mantıklı değil.

Diğer bazı endişeler Yol ve Terminal . Yol , programı çalıştırmak için çalışma dizininden oluşur. Terminal , programın bir terminal penceresinde çalışıp çalışmadığını gösteren bir booledir. Bunların hepsi ele alınabilir, ancak zaten spekülasyonların uygulamaları olduğu için tekerleği yeniden icat etmenin bir anlamı yoktur. Yol 'u uygulamak istiyorsanız, system() öğesinin bir alt işlemi oluşturduğunu unutmayın. Bu nedenle, çalışma dizinini system("cd 7" working_directory "7"); system(command) gibi bir şey yaparak değiştiremezsiniz. Ancak muhtemelen system("cd 7" working_directory "7 && " command) gibi bir şey yapabilirsiniz. Not \ 047 tek tırnak işaretleridir (bu nedenle komut boşluklu yollarda kırılmaz).

Python Alternatifi

burada bir sayfa çalıyorum. > gi modülü. Burada, bir dosya oluşturmaya ve G / Ç hakkında endişelenmenize gerek kalmadan aynı kodu kabuktan yürütmenin en az yolu.

%pre%

Ardından başlatıcı işlevini aşağıdaki gibi çalıştırın:

%pre%

URI'lerin kullanımı isteğe bağlıdır. Ayrıca, herhangi bir hata denetimi gerçekleştirilmez, böylece betiğin mevcut olmasını ve komut dosyanızın dayanıklı olmasını istiyorsanız (kullanmadan önce) okunabilir olmasını istersiniz.

    
verilen cevap Six 21.08.2015 21:33
19

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

kioclient exec <path-to-desktop-file>

    
verilen cevap Raman 23.02.2014 19:09
10
exo-open [[path-to-a-desktop-file]...]

eğer exo-utils kurulursa (Xubuntu'da olduğu gibi) 13.10 sürümünde çalışır.

    
verilen cevap jarno 22.12.2013 16:45
10

dex 'i kullanabilirsiniz.

dex foo.desktop
    
verilen cevap couac 26.01.2015 00:17
8

Hamish’in cevabına ek.

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

#!/usr/bin/env deskopen

Sonra .desktop dosyasını yürütülebilir olarak (ör. chmod +x whatever.desktop ile) işaretleyin ve sonra

yapabilirsiniz.
path/to/whatever.desktop

ve voilà - Uygulama açılacak! (Belirttiğim simge dosyasıyla tamamlanmış olsa da nasıl bir fikrim yok.)

Şimdi, eğer masaüstünün herhangi bir komut satırı parametresinden geçmesini isterseniz, bunun yerine bu biraz değiştirilmiş sürümü kullanabilirsiniz:

#!/bin/sh
desktop_file=
shift
'grep '^Exec' "${desktop_file}" | sed 's/^Exec=//' | sed 's/%.//'' "[email protected]" &

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

    
verilen cevap pabst 09.02.2012 21:12
6

Şu anda Ubuntu arşivlerinde açıkladığınız şeyi 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 harcanıyor.

Arch Linux, python-xdg kitaplıklarına dayanan xdg-autostart uygulamasının üzerinde çalışıyor. Bulabildiğim kadarıyla, bu henüz tamamen tamamlanmış gibi görünmüyor, ancak bazı başarı raporları var.

Ayrıca, xdg-autostart'ın, geniĢletilmiĢ (http://gitorious.org/xdg-autostart/) üzerinde daha genis kullanımdan yararlanan bir C ++ uygulaması da vardır.

Her iki çözüm de sizin için çalışıyorsa, lütfen Debian veya Ubuntu'ya dahil edilmek için gerekli çalışmayı göndermeyi düşünün.

Herhangi bir aracı, starttart ile kullanmak için, /etc/xdg/openbox/autostart.sh dosyasında (openbox belgelerini doğru okuyorsam) çağırabilirsiniz. Bu işe yaramazsa, büyük olasılıkla, openbox oturum başlatma komut dosyalarından herhangi birinde bunu çağırabilirsiniz.

    
verilen cevap Emmet Hikory 05.07.2011 07:08
6

"standart bir komut kullanarak" gereksinimini karşılayan bir acil çözümüm yok ", ancak .desktop dosyalarını ayrıştırmak veya bir Bash takma adı oluşturmak istediğinizde, sonra aşağıdakiler çalışmalıdır:

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

İlginç olabilecek başka bir yaklaşım, binfmt-misc dosyasındaki eşleşmelerden% çekirdek_adı .desktop yöntemi oluşturmak olacaktır (şu anda etkinleştirdiğiniz desenler için grep -r . /proc/sys/fs/binfmt_misc/ bölümüne bakın).

Günün sonunda, bir şeyler bir yerdeki .desktop dosyalarını ayrıştırmak zorunda kalacak, bu sadece "standart / varsayılan" şeklindeki bir sorudur.

    
verilen cevap sladen 09.07.2011 23:22
1

Bu dosyaları test etmeye çalışırken, DM veya oturum yöneticisinin beklediklerimi bir kullanıcı arayüzü klasörü tarayıcısında açmak ve sonra açmak için çift tıklamak olduğunu kontrol etmenin en kolay yolunu buldum.

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

Çöken şey, DM'nin davranışını yansıtmayacak, kaçaklar gibi korkunç şeyler de dahil olmak üzere ve alternatif davranışı gerçekten istemeyeceğiniz alıntılar. Bu komut satırı değil, ama bazı şeyleri doğruladı. Ayrıca, Terminal=true öğesinin hata ayıklama için yararlı olduğunu belirledim.

    
verilen cevap Danny Staple 19.05.2014 17:20
1

Bu SO cevabı benim için neyi açıkça gösterdi: masaüstü dosyasını çalıştırmayı denemeyin, dosya, masaüstü dosyasında işaretlenmiş.

Örneğin, /home/jsmith/Desktop/x11vnc.sh dosyasını çalıştırın

Exec=/home/jsmith/Desktop/x11vnc.sh
    
verilen cevap user119824 27.06.2014 19:45
1

Komut dosyasını Carlo’dan aldım yanıtı" yanıtlayın ve kendi masaüstü kullanımım için bunu geliştirmeye çalışın.

Komut dosyasının bu sürümü, herhangi bir uygulamayı, ilk sonuç olması muhtemel olduğu sürece HUD’a girmiş gibi çalıştırabilmenizi sağlayacaktır. Ayrıca, URI'leri desteklemeyen .desktop dosyaları için dosya bağımsız değişkenleri iletmenize de izin verir.

#!/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)
    
verilen cevap Fordi 18.09.2015 19:20
0

çok çalıştırılabilir olduğundan emin komut masaüstü dosya noktaları olun.

Hala çalışmıyorsa. % Co_de% değerini değiştirerek masaüstü dosyasını terminalde çalışır duruma getirin ve bir bash komut dosyasına yerleştirin. Hata çıkışını yakalamak için betiği çalıştırın. Hataların düzeltilmesi zaman geri değiştirin.

    
verilen cevap hakunami 26.03.2015 09:33
0

Hamish'in cevabı harika, ama daha az boru ile daha basit bir alternatif önermek istiyorum:

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

Bu durumda, awk , Exec ile başlayan satır aramayı arar ve daha sonra, bu satırdan sonra, for döngüsünü ve = alanını, alan 2'yi, yani o alandan sonra ne gelirse yazdığımızı kullanarak yazdırırız. Komutların uçlarındaki küme parantezleri, $(...) , parametre ikamesidir, bu nedenle kabuk, awk komutu geri dönüşleri ne olursa olsun yürütür; bu durumda, Exec= sonra gelen gerçek komutu döndürür.

Bazı nadir durumlarda hala bir olasılık olan = işaretinden daha fazlası olabilir. Bunun için önerim

$(awk -F= '/^Exec/||/^TryExec/ {for(i=2;i<=NF;i++) print $i;exit}' /usr/share/applications/firefox.desktop)
    
verilen cevap Sergiy Kolodyazhnyy 21.08.2015 21:55

Etiketlerdeki diğer soruları oku