सही तरीका
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}}'
उपरोक्त आदेश होंगे:
- Exec = से शुरू होने वाली रेखा ज्ञात कीजिए
- निकालें Exec =
- किसी भी Exec चर निकालें (जैसे
%f
, %u
, %U
)। इन्हें विनिर्देशन संबंधी दलीलों के साथ बदलना संभव है क्योंकि विनिर्देश का इरादा है, लेकिन ऐसा करने से समस्या में महत्वपूर्ण जटिलता आ जाएगी। नवीनतम डेस्कटॉप प्रविष्टि विशिष्टता देखें ।
- आदेश निष्पादित करें
- उचित निकास कोड के साथ तुरंत बाहर निकलें (ताकि कई एक्ज़ेक लाइनों को निष्पादित न करें )
ध्यान दें, यह 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 का उपयोग वैकल्पिक है। इसके अलावा, कोई त्रुटि जाँच नहीं की जाती है ताकि आप यह सुनिश्चित कर सकें कि लॉन्चर मौजूद है और यदि आप अपनी स्क्रिप्ट को टिकाऊ बनाना चाहते हैं तो यह पठनीय है (इसका उपयोग करने से पहले)।
exec
असफल होने का कारण यह है कि निष्पादन आपकी वर्तमान में चल रही प्रक्रिया को आपके द्वारा निर्दिष्ट प्रक्रिया के साथ बदल देता है, इसलिए आपने जो किया वह आपके डेस्कटॉप को संकलित बाइनरी के रूप में चलाने के साथ बदलने का प्रयास किया गया था। कारण आप नहीं कर सकतेsudo exec
क्योंकि यह एक शेल बिल्डिन है और बाइनरी कमांड नहीं है।