टर्मिनल में .desktop फ़ाइल चला रहा है


140

मैं क्या इकट्ठा कर सकता हूं, .desktopफाइलें शॉर्टकट हैं जो एप्लिकेशन की सेटिंग्स को अनुकूलित करने की अनुमति देती हैं। उदाहरण के लिए, मेरे पास उनके /usr/share/applications/फ़ोल्डर में बहुत सारे हैं ।

अगर मैं उस फ़ोल्डर को खोलता हूं nautilus, तो मैं इन एप्लिकेशन को इसकी संबंधित फ़ाइल को डबल क्लिक करके चला सकता हूं, जैसे कि firefox.desktopफ़ायरफ़ॉक्स पर डबल-क्लिक करना । हालाँकि, मुझे टर्मिनल के माध्यम से एक ही काम करने का तरीका नहीं मिल रहा है।

अगर मैं gnome-open foo.desktopइसे बस foo.desktopएक पाठ फ़ाइल के रूप में खोलता है । अगर मैं इसे निष्पादन योग्य बनाता हूं और फिर इसे बैश में चलाता हूं तो यह बस विफल हो जाता है (जिसकी उम्मीद है, यह स्पष्ट रूप से स्क्रिप्ट को नहीं हरा सकता है)।
EDIT: कर exec /fullpath/foo.desktopमुझे एक Permission deniedसंदेश देता है , भले ही मैं खुद को स्वामित्व बदल दूं । यदि मैं निष्पादन योग्य बनाता हूं और समान कमांड करता हूं, तो मैं जिस टर्मिनल टैब का उपयोग कर रहा हूं वह बस बंद हो रहा है (मैं अनुमान लगा रहा हूं कि यह दुर्घटनाग्रस्त हो गया है)। अंत में, यदि मैं करता हूं, तो मुझे sudo exec /fullpath/foo.desktopएक त्रुटि रिपोर्टिंग मिलती है sudo: exec: command not found

यह मेरा सवाल है, मैं foo.desktopटर्मिनल से एक फ़ाइल कैसे चला सकता हूं ?


5
NB: आपके execअसफल होने का कारण यह है कि निष्पादन आपकी वर्तमान में चल रही प्रक्रिया को आपके द्वारा निर्दिष्ट प्रक्रिया के साथ बदल देता है, इसलिए आपने जो किया वह आपके डेस्कटॉप को संकलित बाइनरी के रूप में चलाने के साथ बदलने का प्रयास किया गया था। कारण आप नहीं कर सकते sudo execक्योंकि यह एक शेल बिल्डिन है और बाइनरी कमांड नहीं है।
डेनिथ

दिलचस्प है, मैं सोच रहा था कि इसने टैब को क्यों बंद कर दिया।
मलबारबा


मैं देख रहा हूँ, वे .desktop फ़ाइल पार्स कर रहे हैं। वैसे भी लिंक के लिए धन्यवाद।
एनज़ोटिब

मध्यस्थ: उफ़, लगता है कि मैंने इस गलती से झंडे गाड़ दिए होंगे, अगर ऐसा है तो क्षमा करें
क्रोड लैंगशान

जवाबों:


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 जैसा तर्क होता है। बैश उस स्ट्रिंग को एक नियमित तर्क के रूप में पारित करने की कोशिश करता है। उदाहरण के लिए, grep '^Exec' firefox.desktop | sed 's/^Exec=//'फ़ायरफ़ॉक्स एक टैब के साथ खोलता है जो www।% U.com को लोड करता है
मालाबार

फिलहाल मैंने sedकोई तर्क निकालने के लिए दूसरा जोड़ा है । लेकिन मुझे लगता है कि इसे चलाने का एक और "प्राकृतिक" तरीका हो सकता है।
मालाबार

मैंने अपने जवाब को अतिरिक्त सेड के साथ अपडेट किया है - मैं भूल गया कि डेस्कटॉप फ़ाइलों में तर्क हो सकते हैं।
हामिश डाउनर

आपको "grep" के बाद पाइप में "टेल -1" जोड़ना चाहिए, क्योंकि "Exec =" कई बार दिखाई दे सकता है, और उसके बाद, केवल अंतिम उपस्थिति को निष्पादित किया जाना चाहिए ..
daisy

13
-1: यह साधारण .desktopफ़ाइलों के लिए काम कर सकता है , लेकिन यह प्रविष्टियों की तरह अनदेखी करता है Path=और TryExec=जो निष्पादन को प्रभावित कर सकता है। यह गलत भी निष्पादित करता है Exec=यदि फ़ाइल में डेस्कटॉप क्रियाएं ("
क्विकलिस्ट

85

उत्तर होना चाहिए

xdg-open program_name.desktop

लेकिन बग के कारण अब यह काम नहीं करता है।


7
वाह यह अभी भी एक बग है, Xdg में बहुत प्रगति हुई है। exo-openको वर्कअराउंड के रूप में सूचीबद्ध किया गया है और यह gedit भी खोलता है। :(
आकर्षित किया

1
@ रिचर्डहॉलो: कॉल नहींgnome-open करता , यह दूसरा तरीका है! इसलिए यह मुद्दा (उत्तराधिकारी या ) में निहित हैxdg-opengvfs-opengnome-open
MestreLion

13
"अब काम नहीं करता है"? यह कभी नहीं किया! xdg-openmimetype एसोसिएशन द्वारा काम करता है, और .desktopफ़ाइलें पाठ संपादकों के साथ जुड़ी हुई हैं, क्योंकि वे पाठ का एक उपवर्ग हैं
MestreLion

13
यह बहुत बेवकूफी है (कि टर्मिनल से डेस्कटॉप फ़ाइल चलाने का कोई समझदार तरीका नहीं है)
सैम वॉटकिंस

2
आर्क लिनक्स पर मेरे लिए काम करता है, लेकिन शायद यह एक उबंटू-विशिष्ट बग है।
विक्टर

75

किसी भी हाल के उबंटु के साथ जो gtk-launchबस का समर्थन करता है

gtk-launch <file>.desktopभाग के साथ या उसके बिना .desktop फ़ाइल का नाम कहां है

तो gtk-launch fooखुल जाता हैfoo.desktop

( gtk-launchप्रलेखन )

.Desktop / usr / शेयर / एप्लिकेशन, / usr / लोकल / शेयर / एप्लिकेशन या ~ / .Local / शेयर / एप्लिकेशन में होना चाहिए।

टर्मिनल या alt + F2 (इतिहास में इतनी आसानी से उपलब्ध होने वाली alt + F2 स्टोर्स कमांड) से उपयोग करने योग्य


यह तरीका है, डेबियन में भी काम करता है।

gtk-launch firefox.desktop ~ / .local / share / Applications / मेरे लिए निर्देशिका ~ / .local / share / Applications / देखने वाले फ़ायरफ़ॉक्स लॉन्च करता है। अगर आप सही थे, तो लगता है कि फ़ायरफ़ॉक्स को एक तर्क के रूप में .desktop फ़ाइल की निर्देशिका को पारित नहीं करना चाहिए था। वास्तव में निर्देशिका जीटीके लॉन्च होने के लिए पारित कर दिया .desktop फ़ाइल युक्त dir पता लगाने के लिए इस्तेमाल किया जा माना जाता है नहीं है (और वास्तव में, नहीं है)
Croad Langshan

वाह! एक जवाब जो काम करता है!
एलिसिया

यह मेरे लिए आर्क लिनक्स में भी काम करता है। अन्य कोई भी उत्तर संतोषजनक नहीं था, लेकिन यह अच्छा है। :-) यह काम करता है भले ही मैं केडीई चला रहा हूं।
MountainX

2
इसका कोई भी संस्करण मेरे लिए उबंटू 18.10 पर काम नहीं करता है। हर बार यह शिकायत करता है कि एप्लिकेशन मौजूद नहीं है, चाहे मैं डेस्कटॉप फ़ाइल के साथ फ़ोल्डर में हूं या नहीं, मैं .desktop एक्सटेंशन शामिल करता हूं या नहीं, और मैं अलग से निर्देशिका का नाम रखता हूं या नहीं।
जोसेफ गार्विन

38

आज तक (12.10) बग अभी भी मौजूद है। यह वास्तव में कैसे gvfs-open(कहा जाता है xdg-open) काम करता है पर निर्भर करता है।

फिर भी, मैंने एक त्वरित समाधान (नौटिलस स्रोत कोड से प्रेरणा चोरी) का प्रबंधन किया। यह थोड़ा जटिल है, लेकिन उबंटू 12.10 पर दोषपूर्ण रूप से काम करता है, ?एकता लांचर पर एक सार्थक आइकन (अधिक नहीं ) जोड़ रहा है ।

सबसे पहले, मैंने जियो का उपयोग करते हुए एक पायथन स्क्रिप्ट लिखी और इसे इस प्रकार सहेजा ~/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 some.desktop उम्मीद के मुताबिक काम करता है
  • #!/usr/bin/xdg-open एक निष्पादन योग्य डेस्कटॉप प्रविष्टि के शीर्ष पर हैशबैंग भी काम करता है

gvfs-openबग को हल करने के लिए यह बेकार काम होगा, लेकिन इस बीच ...


1
यह हामिश डाउनर के उत्तर से बेहतर काम करता है क्योंकि यह कमांड में कई Exec=लाइनों और %मापदंडों से सही तरीके से निपटेगा।
फ्लिम

4
कोड के लिए धन्यवाद - मैं ल्यूसिड पर हूं, और मैंने इसे बस के रूप में सहेजा है /usr/bin/xdg-openpy, और इसे दिया है chmod +x- और launcher.launch([],context)इसके बजाय इसका इस्तेमाल किया है ...None,context)(क्योंकि " टाइपराइटर: तर्क 1: अनुक्रम होना चाहिए, नॉट टू टाइप ")। अब xdg-openpy app.desktopकमांड लाइन से काम करता है (और डबल-क्लिक करने पर सभी सामान्य app.desktop), और यह मुझे याद दिला सकता है कि क्या मैं टर्मिनल xdg-openऔर प्रेस टैब में कॉल करने का प्रयास करता हूं । चीयर्स!
सादाऊ

3
+1। यह एकमात्र उत्तर है जिसे .desktopफ़ाइल को मैन्युअल रूप से पार्स करने की आवश्यकता नहीं है , इसलिए यह सबसे अधिक संवेदनशील (और सुरक्षित) दृष्टिकोण है। इसके अलावा gi.repositoryपदावनत के बजाय आधुनिक का उपयोग करता है pygtk, इसलिए महान! :)
MestreLion

2
वास्तव में, यह एक सवाल है जो कार्लो पेलेग्रिनी के जवाब से संबंधित है। मैं एक नौसिखिया हूं, कृपया मुझे सही करें अगर इसे लगाने का एक बेहतर तरीका था। स्क्रिप्ट वास्तव में ठीक काम करती है, लेकिन मुझे एकता लांचर पर जो आइकन मिलता है, वह .desktop फ़ाइल में परिभाषित आइकन नहीं है, लेकिन 'Exec'ed कमांड का डिफ़ॉल्ट आइकन है। उस बारे में कोई विचार?
इंगो लियोनहार्ट

1
@Noitidart पिछले जवाब लिखना कुछ गूगल करने के लिए मो का नेतृत्व किया और मैंने पाया कि । इसकी जाँच नहीं की गई, लेकिन शायद यह मदद करता है
इंगो लियोनहार्ट

31

सही तरीका

gtk-launchयदि यह उपलब्ध है तो आपको वास्तव में उपयोग करना चाहिए । यह आमतौर पर पैकेज libgtk-3-bin का हिस्सा है (यह डिस्ट्रो द्वारा भिन्न हो सकता है)।

gtk-launch निम्नानुसार उपयोग किया जाता है:

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

कृपया ध्यान दें कि .desktop फ़ाइल को स्थापित करने की gtk-launchआवश्यकता है (यानी में स्थित है या )।/usr/share/applications~/.local/share/applications

तो इसके आस-पास जाने के लिए, हम एक हैकिश लिटिल बैश फ़ंक्शन का उपयोग कर सकते हैं जो इसे लॉन्च करने से पहले वांछित .desktop फ़ाइल को अस्थायी रूप से स्थापित करता है। एक .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एक सभी में एक स्क्रिप्ट की तरह कमांड का इलाज करना चाहते हैं ; हम एक त्रुटि संदेश भी दिखा सकते हैं और उस घटना में 1 के रिटर्न कोड के साथ बाहर निकल सकते हैं जो एक Exec कमांड नहीं मिली है:

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. उचित निकास कोड के साथ तुरंत बाहर निकलें (ताकि कई एक्ज़ेक लाइनों को निष्पादित न करें )

ध्यान दें, यह AWK स्क्रिप्ट कुछ किनारे के मामलों को संबोधित करती है जो कुछ अन्य उत्तरों द्वारा ठीक से संबोधित नहीं हो सकती है या नहीं हो सकती है। विशेष रूप से, यह आदेश एकाधिक Exec चर निकालता है (ध्यान रखें कि अन्यथा% प्रतीक को हटाने के लिए नहीं), केवल एक Exec लाइन कमांड निष्पादित करेगा, और Exec लाइन कमांड में एक या अधिक समान चिह्न (जैसे script.py --profile=name) होने पर भी अपेक्षित व्यवहार करेगा ।

बस कुछ अन्य caveats ... विनिर्देश के अनुसार, TryExec है:

प्रोग्राम वास्तव में स्थापित है या नहीं यह निर्धारित करने के लिए उपयोग की गई डिस्क पर एक निष्पादन योग्य फ़ाइल का पथ। यदि पथ कोई पूर्ण पथ नहीं है, तो फ़ाइल को $ 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कमांड अच्छी है। इसलिए
एबी

इस संदर्भ में एक URI क्या है? मेरे पास एक मनमाने फ़ोल्डर में एक डेस्कटॉप फ़ाइल है। बिना किसी अन्य स्क्रिप्ट में लिपटे बिना मैं उस पर केवल gtk-launch कैसे चलाता हूं? यह पागलपन है।
जोसेफ गार्विन

awkयदि कमांड डबल व्हाट्सएप या बैकस्लैश से बच गया है तो यह समाधान ठीक से काम नहीं करेगा। यह इस पर टूट जाता है: Exec=env WINEPREFIX="/path/to/.wine" wine c:\\\\windows\\\\command\\\\start.exe /Unix /path/to/.wine/dosdevices/c:/users/Public/Рабочий\\ стол/appname.lnkऔर dexसमाधान ठीक काम करता है।
मारसॉफ्ट

27

जबकि ओपी केडीई के बारे में नहीं पूछ रहा था, केडीई चलाने वाले किसी भी व्यक्ति के लिए निम्नलिखित कमांड का उपयोग किया जा सकता है:

kioclient exec <path-to-desktop-file>

फेडोरा पर, यह kde-runtimeआरपीएम में शामिल है ।


5
काम किया क्योंकि यह काम किया है। जब तक आपके पास यह प्रोग्राम स्थापित है, तब तक केडीई को चलाने की आवश्यकता नहीं है।
बेसिक 6

क्या इसमें से कोई रास्ता नहीं है? मैंने क्लेमेंटाइन प्लेयर संकलित किया है, जिसमें एक बग है जो केवल .desktop फ़ाइल (प्लाज्मा-शेल के साथ) के माध्यम से लॉन्च होता है। और मैं यह पता नहीं लगा सकता, कि किसी भी तरह से लॉग लॉग आउटपुट कैसे होता है।
क्वाडपेपर

@Kwaadpepper आप एक शेल स्क्रिप्ट को लॉन्च करने के लिए अपनी .desktop फ़ाइल का उपयोग कर सकते हैं, जो आंतरिक रूप से आपकी कमांड चलाता है और आउटपुट को फ़ाइल में रीडायरेक्ट करता है।
रमन

मुझे इस समय आर्क लिनक्स के लिए केडीई के किसी भी पैकेज में kioclient नहीं मिलता है। हालाँकि, मेरे लिए KDE के तहत gtk-launch काम करता है।
MountainX

15

आप डेक्स का उपयोग कर सकते हैं ।

dex foo.desktop

2
IMHO यह बिल्कुल सही उत्तर है: एक उपकरण, एक फ़ाइल जिसे केवल पैरामीटर के रूप में फाइल किया जाता है। यही कारण है कि मैं भी हाथ से लिखी गई .desktopफाइलों का परीक्षण करने के लिए देख रहा था । और यह .desktopफ़ाइलें भी बना सकता है, याय! :-)
एक्सल बेकर्ट

उत्तम! यदि आप एक .desktop फ़ाइल जोड़ते हैं जो dex gist.github.com/stuaxo/4169fc1342c496b7c8f7999188f2f242 / usr / शेयर / एप्लिकेशन का उपयोग करता है / तो आप डिफ़ॉल्ट रूप से gedit में खुलने के बिना उनके बिना फ़ाइल नाम से डेस्कटॉप फ़ाइल लॉन्च कर पाएंगे।
स्टुअर्ट एक्सॉन

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

13.10 रिलीज में काम करने लगता है, अगर एक्सो-बर्तन स्थापित किया गया है (जैसे कि एक्सूबंटू के साथ मामला है)।


हां, बस इसे Ubuntu Studio 14.04 में परीक्षण किया गया। Btw। xdg- खुला और gvfs- खुला कार्य वहाँ भी।
जर्नो

15 के रूप में अच्छी तरह से काम करता है
जोनाथन

डेबियन का उपयोग xfce के साथ करें। बहुत अच्छा काम करता है!
राजा_जुलियन

मेरे लिए Ubuntu 14.04 में काम करता है
Tyler Collier

8

हामिश के उत्तर के लिए परिशिष्ट।

डेस्कोपेन स्क्रिप्ट को देखते हुए, आप इसे एक .desktop फ़ाइल में शेलंग लाइन के रूप में एक संदर्भ का उपयोग कर सकते हैं , क्योंकि टिप्पणी चरित्र अभी भी है #। यह कहना है कि, .desktop फ़ाइल की पहली पंक्ति के रूप में इसे रखें :

#!/usr/bin/env deskopen

फिर .desktop फ़ाइल को निष्पादन योग्य के रूप में चिह्नित करें (जैसे a chmod +x whatever.desktop), और फिर आप कर सकते हैं

path/to/whatever.desktop

और voilà - ऐप खुल जाएगा! (मेरे द्वारा निर्दिष्ट आइकन फ़ाइल के साथ पूर्ण, हालांकि मुझे नहीं पता कि कैसे।)

अब, यदि आप चाहते हैं कि डेस्कटॉप किसी भी कमांड-लाइन मापदंडों से होकर गुजरे, तो आप इसके बजाय थोड़ा संशोधित संस्करण का उपयोग कर सकते हैं:

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

एक तरफ के रूप में, मैं आईएनजी के "#{@:2}"बजाय का उपयोग करने की कोशिश की shift, लेकिन यह मुझे 'खराब प्रतिस्थापन' देता रहा ...


मुझे पता है कि यह हामिश के उत्तर के लिए उचित रूप से एक टिप्पणी है, लेकिन मैं एक नया उपयोगकर्ता हूं और टिप्पणी करने की अनुमति नहीं है। ओह अच्छा!
प्रशस्त

यदि आपके पास प्रतिष्ठा है, तो उस उत्तर को संपादित करने के लिए सबसे उपयुक्त कार्रवाई वास्तव में होगी।
फ्लिम्ड

स्ट्राइक करें कि, कोई भी व्यक्ति जो लॉग इन नहीं किया है, यहां तक ​​कि संपादन का सुझाव दे सकता है! यह कोई रास्ता नहीं है।
फ्लिम

1
यह अपने आप में एक जवाब है, ठीक है।
ब्रूनो परेरा

आप "${@:1}"इसके बजाय का उपयोग कर सकते हैं shift, लेकिन bashइसके लिए shआपके #!शेबंग के बजाय की आवश्यकता होती है । IMHO आपका मूल बदलाव दृष्टिकोण सरल और बेहतर है
MestreLion

6

वर्तमान में ऐसा कोई एप्लिकेशन नहीं है जो उबंटू अभिलेखागार में आपके द्वारा वर्णित किया गया हो। डेस्कटॉप वातावरण (जैसे ओपनबॉक्स) के लिए एकीकरण प्रदान करने के लिए एक सामान्य समाधान बनाने के लिए प्रगति में कुछ प्रयास हैं जो इन XDG विनिर्देशों के अनुरूप नहीं हैं।

आर्क लिनक्स python-xdg पुस्तकालयों के आधार पर xdg-autostart के कार्यान्वयन पर काम कर रहा है। मुझे जो मिल रहा है, उससे यह अभी पूरी तरह से पूरा नहीं हुआ है, लेकिन इसमें सफलता की कुछ रिपोर्ट है।

Xdg-autostart पर gitorious (http://gitorious.org/xdg-autostart/) पर C ++ का कार्यान्वयन भी है, जिसके व्यापक उपयोग से लाभ होगा।

यदि या तो समाधान आपके लिए काम करता है, तो कृपया डेबियन या उबंटू में शामिल करने के लिए आवश्यक कार्य प्रस्तुत करने पर विचार करें।

ओपनस्टार्ट के साथ या तो टूल का उपयोग करने के लिए, आप इसे /etc/xdg/openbox/autostart.sh में कॉल करेंगे (यदि मैं ओपनबॉक्स डॉक्यूमेंट को सही तरीके से पढ़ रहा हूं)। यदि यह काम नहीं करता है, तो आप संभवतः इसे किसी भी ओपनबॉक्स सत्र आरंभीकरण स्क्रिप्ट में कह सकते हैं।


नहीं मैं क्या सुनना है, वैसे भी जानकारी के लिए धन्यवाद
enzotib

6

मेरे पास "एक मानक कमांड का उपयोग करने" की आवश्यकता को पूरा करने के लिए एक तत्काल समाधान नहीं है , लेकिन यदि आप .desktopफ़ाइलों को न्यूनतम पार्स करना चाहते हैं या बैश उपनाम बनाना चाहते हैं, तो निम्नलिखित काम करना चाहिए:

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

एक और दृष्टिकोण जो दिलचस्प हो सकता है, वह होगा फाइलों binfmt-miscपर मैचों की तुलना में एक कर्नेल-स्तरीय विधि बनाना। .desktop( grep -r . /proc/sys/fs/binfmt_misc/उन पैटर्नों के लिए देखें , जिन्हें आपने वर्तमान में सक्षम किया है)।

दिन के अंत में, कहीं न कहीं कुछ.desktop फाइलों को पार्स करना होगा , यह सिर्फ एक सवाल है कि "मानक / डिफ़ॉल्ट" कैसे है।


धन्यवाद, दिलचस्प है। "मानक" के रूप में मेरा मतलब है कि डीई द्वारा प्रदान किया गया कुछ और freedesktop.org के अनुरूप है।
enzotib

एस और एस awkकी एक श्रृंखला के बजाय अपवोट करें । grepsed
jmtd

अपवोट, हालांकि यह काम नहीं करता है (या बेहतर पुट - बहुत ज्यादा काम करता है) यदि आपके पास अल्ट्रस Exec=लाइन्स हैं: /
बोरिस चुर्जिन

2

मैंने ऊपर कार्लो के उत्तर से स्क्रिप्ट ली , और अपने डेस्कटॉप उपयोग के लिए उस पर सुधार करने का प्रयास किया।

स्क्रिप्ट का यह संस्करण आपको किसी भी ऐप को चलाने की अनुमति देगा जैसे कि आपने इसे HUD पर दर्ज किया है, इसलिए जब तक कि यह पहला परिणाम नहीं हो जाता। यह आपको .desktop फ़ाइलों के लिए फ़ाइल तर्क पास करने देता है जो URI का समर्थन नहीं करते हैं।

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

जब मैं इन फ़ाइलों का परीक्षण करने की कोशिश कर रहा था, तो मुझे यह जांचने का सबसे सरल तरीका मिला कि डीएम या सत्र प्रबंधक वही करेगा जो मुझे उम्मीद थी कि यूआई फ़ोल्डर ब्राउज़र में आसपास की डायर को खोलना है और फिर उन्हें खोलने के लिए डबल-क्लिक करें।

यदि आप एक कमांड लाइन में हैं: gvfs-open .या gnome-open .इसे कॉन्फ़िगर किए गए फ़ोल्डर ब्राउज़र में खोलेंगे।

सीड चीज़ डीएम के व्यवहार को नहीं दर्शाएगी, जिसमें फ़िडली जैसे सामान शामिल हैं और जहां आप वास्तव में वैकल्पिक व्यवहार नहीं चाहते हैं, उद्धृत करना। यह कमांड लाइन नहीं है, लेकिन इसने चीजों को मान्य किया है। मैंने Terminal=trueडिबगिंग के लिए उपयोगी सेटिंग भी पाया ।


टर्मिनल तुरंत गायब हो जाता है, मेरे पास टर्मिनल का उपयोग करते समय संदेश देखने का समय नहीं है = सही: s
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

ध्यान दें कि उबंटू सिस्टम पर, आपके "स्टार्ट मेनू" डेस्कटॉप लॉन्चर उपलब्ध हैं /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-लॉन्च: ऐसा कोई अनुप्रयोग नहीं"
  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=true, और इसे बैश स्क्रिप्ट के अंदर डालें। त्रुटि आउटपुट को पकड़ने के लिए स्क्रिप्ट चलाएँ। त्रुटियों को सुधारने पर वापस बदलें।


0

हामिश का जवाब बहुत अच्छा है, लेकिन मैं एक आसान विकल्प सुझाता हूँ, जिसमें कम पाइपिंग शामिल है:

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

इस स्थिति में, awkलाइन के साथ शुरू होने वाली खोजों की खोज की जाती है Exec, और फिर हम बस उस लाइन के बाद फ़ील्ड्स को प्रिंट करते हैं, लूप का उपयोग करते हैं और =हम फ़ील्ड 2 को प्रिंट करते हैं, अर्थात, उस फ़ील्ड के बाद जो भी आता है। आदेशों के सिरों पर घुंघराले कोष्ठक $(...), पैरामीटर प्रतिस्थापन हैं, इस प्रकार शेल जो भी कमांड आदेश देता है उसे निष्पादित करेगा; इस मामले में, यह वास्तविक कमांड देता है जो बाद में आता है Exec=

कुछ दुर्लभ मामलों में एक से अधिक =संकेत हो सकते हैं , जो अभी भी एक संभावना है। उसके लिए, मैं सुझाव देता हूं

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

नाइस, awkऔर सर्ग =)
AB

और कभी-कभी, एक है TryExec, हो सकता है कि आपको अपना दूसरा कमांड =) चेक करना चाहिए
AB

@AB Hehe, awkपाठ प्रसंस्करण के लिए मेरी पसंद का हथियार है। इसके अलावा, यह सिंटैक्स के करीब है C। ओह, और पहले से ही जोड़ा गया TryExecहिस्सा ^ _ ^
Sergiy Kolodyazhnyy

आपके पास मेरा +1 =) है
AB

लेकिन क्या बारे में है %f, %u, %Uया आदेश के पीछे कुछ इस तरह?
एबी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.