টার্মিনালে একটি .ডেস্কটপ ফাইল চালানো


140

আমি যা সংগ্রহ করতে পারি .desktopসেগুলি থেকে ফাইলগুলি শর্টকাট যা অ্যাপ্লিকেশনটির সেটিংস কাস্টমাইজ করার অনুমতি দেয়। উদাহরণস্বরূপ, আমার /usr/share/applications/ফোল্ডারে সেগুলির অনেকগুলি রয়েছে ।

যদি আমি এই ফোল্ডারটি খুলি nautilus, আমি কেবলমাত্র এটি সম্পর্কিত ফাইলগুলিতে ডাবল ক্লিক করে এই অ্যাপ্লিকেশনগুলি চালাতে পারি, যেমন ডাবল ক্লিক করে firefox.desktopফায়ারফক্স চালায়। তবে আমি টার্মিনালের মাধ্যমে একই জিনিস করার কোনও উপায় খুঁজে পাচ্ছি না।

আমি যদি gnome-open foo.desktopএটি করি তবে এটি foo.desktopএকটি পাঠ্য ফাইল হিসাবে খোল । যদি আমি এটিকে এক্সিকিউটেবল করে তুলি এবং তারপরে এটি ব্যাশে চালিত করি তবে এটি কেবল ব্যর্থ হয় (যা প্রত্যাশিত, এটি স্পষ্টভাবে বাশ স্ক্রিপ্ট নয়)।
সম্পাদনা: করণ exec /fullpath/foo.desktopআমাকে একটি Permission deniedবার্তা দেয় যদিও আমি নিজের মালিকানা পরিবর্তন করি। যদি আমি এক্সিকিউটেবল করতে পারি এবং একই কমান্ডটি করি তবে আমি যে টার্মিনাল ট্যাবটি ব্যবহার করছি তা কেবল বন্ধ হয়ে যায় (আমি অনুমান করছি এটি ক্র্যাশ হয়ে গেছে)। শেষ পর্যন্ত, আমি যদি করি তবে আমি sudo exec /fullpath/foo.desktopএকটি ত্রুটি প্রতিবেদন পেয়েছি sudo: exec: command not found

এটি আমার প্রশ্ন, আমি কীভাবে foo.desktopটার্মিনাল থেকে একটি ফাইল চালাতে পারি ?


5
এনবি: আপনার execব্যর্থ হওয়ার কারণ হ'ল এক্সিকিউটর আপনার বর্তমানে চলমান প্রক্রিয়াটি আপনার নির্দিষ্ট করা প্রক্রিয়াটির সাথে প্রতিস্থাপন করে, তাই আপনি যা করেছিলেন তা আপনার শেলটিকে একটি সংকলিত বাইনারি হিসাবে ডেস্কটপ চালানোর সাথে প্রতিস্থাপন করার চেষ্টা করা হয়েছিল। আপনি না পারার sudo execকারণ এটি শেল বিল্টিন এবং বাইনারি কমান্ড নয়।
দেনিথ 21

আকর্ষণীয়, আমি ভাবছিলাম কেন এটি ট্যাবটি বন্ধ করে দিয়েছে।
মালবারবা

সম্পর্কিত: জিনোম
.ডেস্কটপ

আমি দেখতে পাচ্ছি, তারা। ডেস্কটপ ফাইলটি বিশ্লেষণ করে শেষ করে। লিঙ্কের জন্য যাইহোক আপনাকে ধন্যবাদ।
enzotib

মডারেটর: ওফ, মনে হয় আমি দুর্ঘটনাক্রমে এটি চিহ্নিত করেছি, দুঃখিত যদি সেটাই হয়
করড ল্যাংশন

উত্তর:


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 - তাদের কেউ কমান্ড লাইনে চালু জন্য প্রাসঙ্গিক ।


এটি এ পর্যন্ত সেরা ফলাফল দেয় তবে এটি কখনও কখনও অনাকাঙ্ক্ষিত আচরণ করে। এটি যখনই ঘটে থাকে "এক্সেক =" রেখার সাথে% u বা% i এর মতো আর্গুমেন্ট থাকে। বাশ নিয়মিত যুক্তি হিসাবে সেই স্ট্রিংটি পাস করার চেষ্টা করে। উদাহরণস্বরূপ, grep '^Exec' firefox.desktop | sed 's/^Exec=//'ফায়ারফক্সটি এমন একটি ট্যাব দিয়ে খোলে যা www।% U.com লোড করে ।
মালবারবা

এই মুহূর্তের জন্য আমি sedকোনও যুক্তি সরাতে একটি সেকেন্ড যুক্ত করেছি । তবে আমি মনে করি এটি চালানোর আরও একটি "প্রাকৃতিক" উপায় থাকতে পারে।
মালবারবা

আমি অতিরিক্ত উত্তর দিয়ে আমার উত্তর আপডেট করেছি - আমি ভুলে গিয়েছিলাম ডেস্কটপ ফাইলগুলিতে যুক্তি থাকতে পারে।
হামিশ ডাউনার

"গ্রেপ" এর পরে পাইপে আপনার "লেজ -1" যুক্ত করা উচিত, যেহেতু "এক্সিকি =" একাধিকবার উপস্থিত হতে পারে এবং তার পরে কেবল শেষ উপস্থিতি সম্পাদন করা উচিত ..
ডেইজি

13
-1: এটি সরল .desktopফাইলগুলির জন্য কাজ করতে পারে তবে এটি এন্ট্রিগুলিকে উপেক্ষা করে Path=এবং এটি কার্যকরভাবে TryExec=প্রভাবিত করতে পারে। এছাড়া ভুল executes Exec=ফাইলটি ডেস্কটপ পদক্ষেপ ( "quicklists") রয়েছে
MestreLion

85

উত্তরটি হওয়া উচিত

xdg-open program_name.desktop

তবে বাগের কারণে এটি আর কাজ করে না।


7
বাহ এটি এখনও একটি বাগ, এক্সডিজিতে প্রচুর অগ্রগতি। exo-openকর্মক্ষেত্র হিসাবে তালিকাভুক্ত করা হয় এবং এটি জিডিটও খোলে। :(
ড্র হয়েছে

1
@ রিচার্ডহলোয়: কল gnome-openকরবেন নাxdg-open , এটি অন্যভাবে! সুতরাং ইস্যুটি gvfs-open(উত্তরসূরি বা gnome-open) এর মধ্যে রয়েছে
MestreLion

13
"আর কাজ করে না"? এটা কখনই হয়নি! xdg-openমাইমটাইপ অ্যাসোসিয়েশন দ্বারা কাজ করে এবং .desktopফাইলগুলি টেক্সট সম্পাদকদের সাথে যুক্ত হয়, যেহেতু তারা পাঠ্যের একটি উপশ্রেণী হয়
MestreLion

13
এটি এত নির্বোধ (যে টার্মিনাল থেকে ডেস্কটপ ফাইল চালানোর কোনও বুদ্ধিমান উপায় নেই)
স্যাম ওয়াটকিন্স

2
আর্চ লিনাক্সে আমার জন্য কাজ করে তবে সম্ভবত এটি একটি উবুন্টু-নির্দিষ্ট বাগ।
ভিক্টর

75

সাম্প্রতিক যে কোনও উবুন্টু সমর্থন করে যা gtk-launchকেবল সহজভাবে যান

gtk-launch <file>.desktopঅংশটি সহ বা ছাড়াই .ডেস্কটপ ফাইলটির নাম

তাই gtk-launch fooখোলেfoo.desktop

( gtk-launchডকুমেন্টেশন )

.ডেস্কটপটি / ইউএসআর / শেয়ার / অ্যাপ্লিকেশন, / ইউএসআর / লোকাল / শেয়ার / অ্যাপ্লিকেশন বা ~ / .লোকল / শেয়ার / অ্যাপ্লিকেশনগুলিতে থাকতে হবে

টার্মিনাল বা Alt + F2 থেকে ব্যবহারযোগ্য (ইতিহাসে Alt + F2 স্টোরের কমান্ড এত সহজেই অ্যাক্সেসযোগ্য)


এটি এইভাবে, ডেবিয়ানেও কাজ করে।

gtk- লঞ্চ ফায়ারফক্স.ডেস্কটপ ~ /। লোকাল / শেয়ার / অ্যাপ্লিকেশন / আমার জন্য ফায়ারফক্স ডিরেক্টরি view / .local / শেয়ার / অ্যাপ্লিকেশন / ডিরেক্টরি দেখছে । মনে হয় আপনি যদি সঠিক ছিলেন তবে ফায়ারফক্সকে আর্গুমেন্ট হিসাবে .ডেস্কটপ ফাইলের ডিরেক্টরিটি পাস করা উচিত হয়নি। আসলে জিটিকে-লঞ্চে পাস করা ডিরেক্টরিটি .ডেস্কটপ ফাইলযুক্ত দিরটি সনাক্ত করার জন্য ব্যবহার করা হয় না (এবং বাস্তবে এটি নেই)
ক্রড ল্যাংशान

হ্যাঁ! একটি উত্তর যে কাজ করে!
অ্যালিসিয়া

এটি আমার জন্য আর্চ লিনাক্সেও কাজ করে। অন্য উত্তরগুলির মধ্যে কোনওটি সন্তোষজনক ছিল না, তবে এটি ভাল। :-) আমি কে-ডি-কে চালাচ্ছি যদিও এটি কাজ করে।
মাউন্টেনএক্স

2
উবুন্টু 18.10 এ এর ​​কোনও সংস্করণ আমার পক্ষে কাজ করে না। যতক্ষণ না এটি অভিযোগ করে অ্যাপ্লিকেশনটির অস্তিত্ব নেই, আমি ডেস্কটপ ফাইলের সাথে ফোল্ডারে থাকি বা না থাকুক, আমি .ডেস্কটপ এক্সটেনশানটি অন্তর্ভুক্ত করি কিনা এবং আমি আলাদাভাবে ডিরেক্টরিটির নাম রাখি কিনা।
জোসেফ গারভিন

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 काहीतरी.ডেস্কটপ প্রত্যাশার মতো কাজ করে
  • #!/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এবং ট্যাব টিপলে এটি আমাকে মনে করিয়ে দিতে পারে । চিয়ার্স!
sdaau

3
+1 টি। এটি একমাত্র উত্তর যা ম্যানুয়ালি .desktopফাইলটি বিশ্লেষণের প্রয়োজন হয় না , সুতরাং এটি সবচেয়ে বুদ্ধিমান (এবং নিরাপদ) পদ্ধতির approach অবচয়হীন gi.repositoryপরিবর্তে আধুনিক ব্যবহার করে pygtk, তাই দুর্দান্ত! :)
MestreLion

2
আসলে, এটি কার্লো পেলেগ্রিনি এর উত্তর সম্পর্কিত একটি প্রশ্ন। আমি এক নতুন, আমি যদি এটি রাখার আরও ভাল উপায় থাকে তবে আমাকে সংশোধন করুন। স্ক্রিপ্টটি সত্যিই দুর্দান্ত কাজ করে, তবে আমি Unক্য লঞ্চারটিতে যে আইকনটি পাই তা ডেস্কটপ ফাইলে সংজ্ঞায়িত আইকন নয় বরং 'এক্সিকিউড' কমান্ডের ডিফল্ট আইকন। সে সম্পর্কে কোন ধারণা?
ইনগো লেওনহার্ড

1
@Noitidart গত উত্তর লিখতে কিছু Google করতে মো নেতৃত্বে এবং আমি দেখেছি যে । এটি পরীক্ষা করে
দেখেনি

31

সঠিক পথ

gtk-launchএটি উপলব্ধ থাকলে আপনার ব্যবহার করা উচিত । এটি সাধারণত libgtk-3-bin প্যাকেজের অংশ (এটি ডিস্ট্রো অনুসারে পৃথক হতে পারে)।

gtk-launch নিম্নলিখিত হিসাবে ব্যবহৃত হয়:

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

দয়া করে মনে রাখবেন gtk-launchপ্রয়োজন .desktop ইনস্টল করার জন্য ফাইল (অর্থাত অবস্থিত /usr/share/applicationsবা ~/.local/share/applications)।

সুতরাং এটি পেতে, আমরা একটি হ্যাকিশ লিটল ব্যাশ ফাংশন ব্যবহার করতে পারি যা কাঙ্ক্ষিত .ডেস্কটপ ফাইলটি আরম্ভ করার আগে অস্থায়ীভাবে ইনস্টল করে । .ডেস্কটপ ফাইল ইনস্টল করার "সঠিক" উপায়টি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

    )

}

আপনি এটির মতো এটি ব্যবহার করতে পারেন (এবং আপনি চাইলে অতিরিক্ত যুক্তি বা ইউআরআইও দিয়ে যান):

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

ম্যানুয়াল বিকল্প

আপনি যদি একটি। ডেস্কটপ ফাইল ম্যানুয়ালি বিশ্লেষণ এবং সম্পাদন করতে চান তবে আপনি নিম্নলিখিত awkআদেশটি দিয়ে এটি করতে পারেন :

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

আপনি যদি awkকমান্ডটিকে সর্ব-ও-ওয়ান স্ক্রিপ্টের মতো আচরণ করতে চান ; এমনকি আমরা একটি ত্রুটি বার্তা প্রদর্শন করতে পারি এবং এক্সিকিউট কমান্ড না পাওয়া ইভেন্টে 1 এর রিটার্ন কোড সহ প্রস্থান করতে পারি :

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. এক্সেক = দিয়ে শুরু করে লাইনটি সন্ধান করুন
  2. এক্সেক = সরান
  3. কোনো Exec এর ভেরিয়েবল সরান (যেমন %f, %u, %U)। নির্দিষ্টকরণের ইচ্ছার সাথে এগুলি স্থিতিগত যুক্তিগুলির সাথে প্রতিস্থাপন করা সম্ভব তবে এটি করা সমস্যার সাথে উল্লেখযোগ্য জটিলতা যুক্ত করবে। সর্বশেষতম ডেস্কটপ এন্ট্রি স্পেসিফিকেশন দেখুন
  4. কমান্ড কার্যকর করুন
  5. তাত্ক্ষণিকভাবে উপযুক্ত প্রস্থান কোড সহ প্রস্থান করুন (যাতে একাধিক এক্সিক লাইনগুলি কার্যকর করা যায় না )

দ্রষ্টব্য, এই AWK স্ক্রিপ্টটি কয়েকটি প্রান্তের কেসগুলিতে সম্বোধন করে যা অন্য কয়েকটি উত্তরের মাধ্যমে সঠিকভাবে সম্বোধন করতে পারে বা নাও পারে। বিশেষত, এই কমান্ডটি একাধিক এক্সিক ভেরিয়েবলগুলি সরিয়ে দেয় (অন্যথায়% চিহ্নটি সরিয়ে না নেওয়ার বিষয়ে যত্ন নিচ্ছে), কেবলমাত্র একক এক্সাইন লাইন কমান্ড কার্যকর করবে এবং এক্সেক লাইন কমান্ডে এক বা একাধিক সমান চিহ্ন (উদাঃ script.py --profile=name) উপস্থিত থাকলেও প্রত্যাশা অনুযায়ী আচরণ করবে ।

মাত্র কয়েকটি অন্যান্য সতর্কতা ... স্পেসিফিকেশন অনুসারে ট্রাইএক্সেক হ'ল:

প্রোগ্রামটি আসলে ইনস্টল করা আছে কি না তা নির্ধারণ করতে ব্যবহৃত ডিস্কে একটি এক্সিকিউটেবল ফাইলের পাথ। যদি পথটি কোনও পরম পাথ না হয় তবে ফাইলটি $ PATH এনভায়রনমেন্ট ভেরিয়েবলের মধ্যে দেখা যাবে। যদি ফাইলটি উপস্থিত না থাকে বা যদি এটি কার্যকর না হয় তবে এন্ট্রি উপেক্ষা করা হতে পারে (উদাহরণস্বরূপ মেনুতে ব্যবহৃত হবে না)।

এটি মনে রেখে, এটির মানটি কার্যকর করার কোনও মানে হয় না।

কিছু অন্যান্য উদ্বেগ হ'ল পাথ এবং টার্মিনাল । প্রোগ্রামটি চালানোর জন্য পাথ ওয়ার্কিং ডিরেক্টরি নিয়ে গঠিত consists টার্মিনালটি একটি বুলিয়ান যা প্রোগ্রামটি টার্মিনাল উইন্ডোতে চালিত হচ্ছে কিনা তা নির্দেশ করে। এগুলিকেই সম্বোধন করা যেতে পারে তবে চাকাটির পুনর্বিবেচনা করার কোনও বুদ্ধি নেই কারণ ইতিমধ্যে অনুমানের বাস্তবায়ন রয়েছে। আপনি যদি পথটি বাস্তবায়ন করতে চান তবে মনে রাখবেন যে 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

নোট করুন ইউআরআই ব্যবহার optionচ্ছিক। এছাড়াও, কোনও ত্রুটি যাচাই করা হয় নি তাই আপনি যদি আপনার স্ক্রিপ্টটি টেকসই করতে চান তবে লঞ্চটি বিদ্যমান এবং এটি পাঠযোগ্য (এটি ব্যবহারের আগে) নিশ্চিত করতে চাইবেন।


কিন্তু awkকমান্ড চমৎকার। অতএব
A

এই প্রসঙ্গে একটি ইউআরআই কী? আমার একটি স্বেচ্ছাসেবী ফোল্ডারে একটি ডেস্কটপ ফাইল রয়েছে। অন্য কোনও স্ক্রিপ্টে এটি মোড়ানো না করে আমি কীভাবে হ্যাকটি কেবল gtk- লঞ্চ চালাচ্ছি? এটা পাগল।
জোসেফ গারভিন

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
Upvated কারণ এটি কাজ করে। আপনি যতক্ষণ না এই প্রোগ্রামটি ইনস্টল করেন ততক্ষণ কেডিএ চালানোর দরকার নেই।
বেসিক 6

এই স্টাডাউট আছে কোন উপায় আছে? আমি ক্লিমেটাইন প্লেয়ার সংকলন করেছি, যার মধ্যে একটি বাগ রয়েছে যা কেবলমাত্র .ডেস্কটপ ফাইলের মাধ্যমে চালু হয় (প্লাজমা-শেল সহ)। এবং আমি খুঁজে বের করতে পারি না, কিভাবে আউটপুট লগ আছে যাই হোক।
কোয়াডপেপার

@ কোয়াডপেপার আপনি শেল স্ক্রিপ্ট চালু করতে আপনার .ডেস্কটপ ফাইলটি ব্যবহার করতে পারেন, যা অভ্যন্তরীণভাবে আপনার কমান্ড চালায় এবং আউটপুট কোনও ফাইলে পুনঃনির্দেশ করে।
রমন

এই মুহুর্তে আর্চ লিনাক্সের জন্য কেডিএর কোনও প্যাকেজে আমি কিয়োক্লিয়েন্ট খুঁজে পাই না। যাইহোক, gtk- লঞ্চটি আমার জন্য কেডিএর অধীনে কাজ করে।
মাউন্টেনএক্স

15

আপনি ডেক্স ব্যবহার করতে পারেন ।

dex foo.desktop

2
আইএমএইচও এটি হ'ল সঠিক উত্তর: একটি সরঞ্জাম, প্যারামিটার হিসাবে কেবলমাত্র একটি ফাইল call হস্ত-লিখিত .desktopফাইলগুলি পরীক্ষা করার জন্য আমি এটিও খুঁজছিলাম । এবং এটি .desktopফাইল তৈরি করতে পারে , হ্যাঁ! :-)
এক্সেল বেকার্ট

পারফেক্ট! যদি আপনি এমন একটি ডেস্কটপ ফাইল যুক্ত করেন যা ডেক্স gist.github.com/stuaxo/4169fc1342c496b7c8f7999188f2f242 তে / usr / share / অ্যাপ্লিকেশনগুলিতে ব্যবহার করে / আপনি ফাইল- ম্যানেজারে ডেস্কটপ ফাইলগুলি ডিফল্টরূপে জিডিটিতে না খোলার জন্য সক্ষম করতে পারবেন।
স্টুয়ার্ট অ্যাকসন

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

13.10 রিলিজে কাজ করছে বলে মনে হচ্ছে, এক্সো-ইউটিসগুলি ইনস্টল করা থাকলে (যেমন জুবুন্টুর ক্ষেত্রেও)।


হ্যাঁ, এটি কেবল উবুন্টু স্টুডিওতে 14.04 এ পরীক্ষা করা হয়েছে। BTW। এক্সডিজি-ওপেন এবং জিভিএফএস-ওপেন কাজও সেখানে।
জার্নো


Xfce এর সাথে ডেবিয়ান ব্যবহার করা হচ্ছে। দুর্দান্ত কাজ!
কিং_জুলিয়ান

উবুন্টু 14.04 এ আমার জন্য কাজ করে
টাইলার কলিয়ার

8

হামিশের উত্তরে সংযোজন।

Deskopen স্ক্রিপ্ট দেওয়া, আপনি একটি রেফারেন্স এটি একটি কুঁড়েঘর লাইন হিসেবে ব্যবহার করতে পারেন .desktop ফাইল, যেহেতু মন্তব্য চরিত্র এখনও #। এর অর্থ হল, এটি .ডেস্কটপ ফাইলের প্রথম লাইন হিসাবে রাখুন :

#!/usr/bin/env deskopen

তারপরে .ডেস্কটপ ফাইলটিকে এক্সিকিউটেবল (যেমন একটি সহ 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, তবে এটি আমাকে 'খারাপ প্রতিস্থাপন' দিয়ে চলেছে ...


আমি জানি এটি হামিশের উত্তরের পক্ষে যথাযথ মন্তব্য, তবে আমি একজন নতুন ব্যবহারকারী এবং মন্তব্য করার অনুমতি নেই not আচ্ছা ভালো!
pabst

আপনার খ্যাতি থাকলে সর্বাধিক উপযুক্ত কর্মটি হ'ল সেই উত্তরটি সম্পাদনা করা।
ফ্লিম

এই স্ট্রাইক করুন, যে কেউ সম্পাদনাগুলি এমনকি লগ ইন না করে এমন ব্যবহারকারীদেরও পরামর্শ দিতে পারে! এটি কোনওভাবেই বড় নয়।
ফ্লিম

1
এটি নিজেই একটি উত্তর, এটি জরিমানা।
ব্রুনো পেরেরা

আপনি "${@:1}"পরিবর্তে ব্যবহার করতে পারেন shift, তবে এটি আপনার শেবাংয়ের bashপরিবর্তে প্রয়োজন । আপনার আসল শিফট পদ্ধতির আইএমএইচও করুন সহজ এবং আরও ভালsh#!
MestreLion

6

উবুন্টু সংরক্ষণাগারগুলিতে আপনি যা বর্ণনা করেছেন তেমন কোনও অ্যাপ্লিকেশন বর্তমানে নেই। ডেস্কটপ এনভায়রনমেন্টগুলির (যেমন ওপেনবক্সের মতো) এই এক্সডিজি স্পেসিফিকেশনগুলির সাথে সামঞ্জস্যপূর্ণ নয় এমন একত্রীকরণের জন্য সাধারণ সমাধান তৈরির জন্য বেশ কয়েকটি প্রচেষ্টা চলছে।

আর্ক লিনাক্স পাইথন-এক্সডিজি লাইব্রেরির উপর ভিত্তি করে এক্সডিজি-অটোস্টার্ট প্রয়োগের কাজ করছে। আমি যা খুঁজে পেতে পারি তা থেকে এটি এখনও সম্পূর্ণরূপে সম্পূর্ণ নয় বলে মনে হয় তবে সাফল্যের কয়েকটি প্রতিবেদন রয়েছে।

জিটারিয়াস (http://gitorious.org/xdg-autostart/) এ এক্সডিজি-অটোস্টার্টের একটি সি ++ প্রয়োগও রয়েছে যা সম্ভবত ব্যাপক ব্যবহারে উপকৃত হবে।

যদি উভয়ই সমাধান আপনার পক্ষে কাজ করে তবে দয়া করে ডেবিয়ান বা উবুন্টু উভয়ের অন্তর্ভুক্তির জন্য প্রয়োজনীয় কাজ জমা দেওয়ার কথা বিবেচনা করুন।

ওপেনস্টার্ট দিয়ে যে কোনও একটি সরঞ্জাম ব্যবহার করতে, আপনি এটিকে /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ফাইল, এটা ঠিক কিভাবে "মান / ডিফল্ট" যে একটি প্রশ্ন।


আপনাকে ধন্যবাদ, আকর্ষণীয়। "স্ট্যান্ডার্ড" হিসাবে আমি ডিই দ্বারা সরবরাহিত কিছু এবং ফ্রিডেস্কটপ.োগ.গ্রাফিকেশনকে মেনে চলার অর্থ।
enzotib

S এবং s এর awkশৃঙ্খলার পরিবর্তে আপভোট করুন । grepsed
jmtd

আপভোট, যদিও এটি কাজ করে না (বা আরও ভাল করে বলা - খুব বেশি কাজ করে) আপনার যদি অতিপ্রান্ত Exec=লাইন থাকে: /
বরিস চুরজিন

2

আমি উপরের কার্লোর উত্তর থেকে স্ক্রিপ্টটি নিয়েছি এবং আমার নিজের ডেস্কটপ ব্যবহারের জন্য এটিতে উন্নত করার চেষ্টা করেছি।

স্ক্রিপ্টের এই সংস্করণটি আপনাকে কোনও অ্যাপ্লিকেশন চালানোর অনুমতি দেবে যেমন আপনি এটি HUD তে প্রবেশ করেছেন, যতক্ষণ না এটি প্রথম ফলাফল হওয়ার সম্ভাবনা রয়েছে। এটি আপনাকে .ডেস্কটপ ফাইলগুলির জন্য ফাইল আর্গুমেন্টগুলি পাস করতে দেয় যা ইউআরআই সমর্থন করে না।

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

এই এই উত্তরটি আমার পক্ষে এটি পরিষ্কার করে দিয়েছে: ডেস্কটপ ফাইলটি কার্যকর করার চেষ্টা করবেন না, ডেস্কটপ ফাইলটিতে নির্দেশিত ফাইলটি কার্যকর করুন।

উদাহরণস্বরূপ, /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/

উদাহরণস্বরূপ, উপরের কোনটি আদেশ আমার উবুন্টু 14.04 সিস্টেমে কাজ করে বা না কাজ করে তা দেখাতে, এখানে আমার জন্য নিম্নলিখিত কলগুলির ফলাফল রয়েছে:

  1. xdg-open /usr/share/applications/eclipse_for_cpp.desktop # বাগের কারণে ব্যর্থ হয়েছে (আমাকে এই .ডেস্কটপ ফাইলটি সংরক্ষণ করার চেষ্টা করুন)
  2. exo-open /usr/share/applications/eclipse_for_cpp.desktop # কাজ
  3. gtk-launch /usr/share/applications/eclipse_for_cpp.desktop # "জিটিকে-লঞ্চ: এই জাতীয় কোনও অ্যাপ্লিকেশন" ব্যর্থ
  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এবং Serg =)
এবি

এবং কখনও কখনও, একটি থাকে TryExec, সম্ভবত আপনার নিজের দ্বিতীয় কমান্ডটি পরীক্ষা করা উচিত =)
এবি

awkপাঠ্য প্রক্রিয়াজাতকরণের ক্ষেত্রে এটি এএবি হেই, আমার পছন্দের অস্ত্র। তদ্ব্যতীত, এটি সিনট্যাক্স কাছাকাছি C। ওহ, এবং ইতিমধ্যে TryExecঅংশ যোগ করেছে ^ _ ^
সের্গেই কলডিয়াজন্য

আপনার আমার +1 =) আছে
এবি

কিন্তু কি সম্পর্কে %f, %u, %Uঅথবা কমান্ড পিছনে ভালো কিছু?
এবি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.