ටර්මිනලයේ .desktop ගොනුවක් ධාවනය කිරීම


163

මට රැස් කර ගත හැකි දෙයින්, .desktopලිපිගොනු යනු යෙදුම් සැකසුම් අභිරුචිකරණය කිරීමට ඉඩ දෙන කෙටිමං ය. උදාහරණයක් ලෙස, මගේ /usr/share/applications/ෆෝල්ඩරයේ ඒවා ගොඩක් තිබේ .

මම එම ෆෝල්ඩරය විවෘත කළහොත් nautilus, මට මෙම යෙදුම් එහි සම්බන්ධිත ගොනුව දෙවරක් ක්ලික් කිරීමෙන් ධාවනය කළ හැකිය, උදා: ද්වි-ක්ලික් කිරීම firefox.desktopෆයර්ෆොක්ස් ධාවනය කරයි. කෙසේ වෙතත්, මට ටර්මිනලය හරහා එකම දේ කිරීමට ක්‍රමයක් සොයාගත නොහැක.

මම gnome-open foo.desktopඑය කරන්නේ නම් එය foo.desktopපෙළ ගොනුවක් ලෙස විවෘත වේ . මම එය ක්‍රියාත්මක කළ හැකි අතර එය බාෂ් වලින් ධාවනය කළහොත් එය අසාර්ථක වේ (අපේක්ෂා කරන පරිදි, එය පැහැදිලිවම bash ස්ක්‍රිප්ට් නොවේ).
සංස්කරණය කරන්න: exec /fullpath/foo.desktopමා විසින් Permission deniedහිමිකාරිත්වය මා වෙත වෙනස් කළත්, කිරීමෙන් මට පණිවිඩයක් ලැබේ. මම ක්‍රියාත්මක කර එකම විධානයක් කළහොත්, මම භාවිතා කරන ටර්මිනල් ටැබ් එක වැසෙයි (මම හිතන්නේ එය බිඳ වැටේ). අවසාන වශයෙන්, මා එසේ කළහොත් sudo exec /fullpath/foo.desktop, මට දෝෂ වාර්තා කිරීමක් sudo: exec: command not foundලැබේ.

ඒක තමයි මගේ ප්‍රශ්නය, මම foo.desktopටර්මිනලයෙන් ගොනුවක් ධාවනය කරන්නේ කෙසේද?


5
සැ exec. ඔබට නොහැකි වීමට sudo execහේතුව එය ෂෙල් බිල්ඩින් එකක් මිස ද්විමය විධානයක් නොවේ.
ඩෙනයිත්

සිත්ගන්නා කරුණ නම්, එය ටැබ් එක වැසීමට හේතුව කුමක්දැයි මම කල්පනා කළෙමි.
මලබාර්බා


මට පෙනේ, ඔවුන් අවසන් වන්නේ .desktop ගොනුව විග්‍රහ කිරීමෙනි. සබැඳියට කෙසේ හෝ ස්තූතියි.
enzotib

උපපරිපාලක වරු: අපොයි, මම මෙය අහම්බෙන් සලකුණු කර ඇති බව සිතන්න, එය එසේ නම් සමාවෙන්න
ක්‍රොඩ් ලැන්ෂාන්

Answers:


56

ක්‍රියාත්මක වන විධානය ඩෙස්ක්ටොප් ගොනුව තුළ අඩංගු වන අතර ඊට පෙර 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ආදිය) විස්තර කරන්නේ මෙහි . විධාන රේඛාවේ දියත් කිරීම සඳහා ඒවා කිසිවක් අදාළ නොවේ.


මෙය මෙතෙක් ලබා ඇති හොඳම ප්‍රති result ලය ලබා දෙන නමුත් සමහර විට එය නුසුදුසු හැසිරීම් ඇති කරයි. "Exec =" රේඛාවට% u හෝ% i වැනි තර්කයක් ඇති විට එය සිදු වේ. නිත්‍ය තර්කයක් ලෙස බාෂ් එම නූල පසු කිරීමට උත්සාහ කරයි. උදාහරණයක් ලෙස, කිරීමෙන් www.% U.comgrep '^Exec' firefox.desktop | sed 's/^Exec=//' පටවන ටැබ් එකක් සමඟ ෆයර්ෆොක්ස් විවෘත වේ .
මලබාර්බා

මේ මොහොතේ මම sedඕනෑම තර්කයක් ඉවත් කිරීමට තත්පරයක් එකතු කළෙමි . නමුත් මම හිතන්නේ එය ක්‍රියාත්මක කිරීමට වඩා “ස්වාභාවික” ක්‍රමයක් තිබිය හැකිය.
මලබාර්බා

මම අතිරේක සෙඩ් සමඟ මගේ පිළිතුර යාවත්කාලීන කර ඇත - ඩෙස්ක්ටොප් ලිපිගොනු වලට තර්ක තිබිය හැකි බව මට අමතක විය.
හාමිෂ් ඩව්නර්

"Exec =" කිහිප වතාවක් දර්ශනය විය හැකි බැවින්, "grep" පසු ඔබ නලයට "වලිගය -1" එකතු කළ යුතු අතර, ඉන් පසුව, අවසාන පෙනුම පමණක් ක්‍රියාත්මක කළ යුතුය ..
daisy

13
-1: මෙය ඉතා සරල වැඩ හැක .desktopගොනු, නමුත් ඒ වගේ සටහන් නොතකා Path=හා TryExec=ක්රියාත්මක බලපෑමක් ඇති විය හැකිය වන. Exec=ගොනුවේ ඩෙස්ක්ටොප් ක්‍රියා ("ඉක්මන් ලැයිස්තු") තිබේ නම් එය ද වැරදි කරයි
මෙස්ට්‍රෙලියන්

95

gtk- දියත් කිරීම

සහාය දක්වන ඕනෑම මෑත උබුන්ටු සමඟ gtk-launchසරලව යන්න

gtk-launch <file>

කොටස .desktopසමඟ හෝ නැතිව ගොනුවේ නම කොහිද? .desktopඑබැවින් gtk-launch fooවිවෘත වේfoo.desktop

සිට gtk-launch ප්රලේඛනය :

gtk-launch විසින් ලබා දී ඇති නම භාවිතා කරමින් යෙදුමක් දියත් කරයි. වෙනත් ආකාරයකින් දක්වා නොමැති නම්, පෙරනිමි සංදර්ශකය මත නිසි ආරම්භක දැනුම්දීමකින් යෙදුම ආරම්භ වේ.

gtk- දියත් කිරීම අවම වශයෙන් එක් තර්කයක්වත් ගනී, දියත් කිරීමට යෙදුමේ නම. '.Desktop' උපසර්ගය සමඟ හෝ නැතිව / usr / share / application හි වාසය කරන පරිදි, නම ඩෙස්ක්ටොප් ගොනු නාමයට අනුරූප විය යුතුය.

මෙම .desktopඇතුළත් විය යුතුය /usr/share/applications, /usr/local/share/applicationsහෝ ~/.local/share/applications.

ටර්මිනලයෙන් භාවිතා කළ හැකිය Alt + F2( Alt + F2ඉතිහාසයේ ගබඩා විධානයන් ගබඩා කර ඇති බැවින් එය පහසුවෙන් ප්‍රවේශ විය හැකිය).


ඩෙබියන් භාෂාවෙන්ද මෙය ක්‍රියාත්මක වේ.

gtk-launch firefox.desktop ~ / .local / share / applications / ඩිරෙක්ටරිය නරඹන ෆයර්ෆොක්ස් දියත් කරයි ~ / .local / share / applications / මා වෙනුවෙන්. ඔබ නිවැරදි නම්, ෆයර්ෆොක්ස් .desktop ගොනුවේ නාමාවලිය තර්කයක් ලෙස සම්මත නොකළ යුතු බව පෙනේ. ඇත්ත වශයෙන්ම gtk-launch වෙත යොමු කරන ලද නාමාවලිය .desktop ගොනුව අඩංගු dir සොයා ගැනීමට භාවිතා නොකළ යුතුය (එය ඇත්ත වශයෙන්ම නොවේ)
ක්‍රොඒඩ් ලැන්ෂාන්

Yay! ක්‍රියාත්මක වන පිළිතුරක්!
ඇලිසියා

මෙය ආරුක්කු ලිනක්ස් වලද මට වැඩ කරයි. අනෙක් පිළිතුරු කිසිවක් සතුටුදායක නොවීය, නමුත් මෙය හොඳ ය. :-) මම KDE ධාවනය කළත් එය ක්‍රියාත්මක වේ.
මවුන්ටන්එක්ස්

4
උබුන්ටු 18.10 හි මෙහි කිසිදු සංස්කරණයක් මට වැඩ නොකරයි. එය පැමිණිලි කරන සෑම අවස්ථාවකම යෙදුම නොපවතී, මම ඩෙස්ක්ටොප් ගොනුව සහිත ෆෝල්ඩරයේ සිටියත් නැතත්, .desktop දිගුව ඇතුළත් කළත් නැතත්, මම වෙනමම නාමාවලිය නම් කළත් නැතත්.
ජෝශප් ගාර්වින්

91

පිළිතුර විය යුතුය

xdg-open program_name.desktop

නමුත් දෝෂයක් හේතුවෙන් ( මෙහි උඩුමහලේ) මෙය තවදුරටත් ක්‍රියාත්මක නොවේ.


7
WoW මෙය තවමත් දෝෂයකි, xdg හි බොහෝ ප්‍රගතියක් ඇත. exo-openවැඩකරන ලෙස ලැයිස්තුගත කර ඇති අතර එය gedit ද විවෘත කරයි. :(
Drew

1
@RichardHolloway: gnome-openනැත නැත අමතන්න xdg-open, එය වෙනත් ආකාරයකින් ක් පමණ වෙනවා! එබැවින් ගැටළුව පවතින්නේ gvfs-open(අනුප්‍රාප්තිකයා හෝ gnome-open)
මෙස්ට්‍රෙලියන්

15
"තවදුරටත් ක්‍රියාත්මක නොවේ"? එය කිසි විටෙකත් සිදු නොවීය! xdg-openමයිමෙටයිප් ඇසෝසියේෂන් විසින් ක්‍රියා කරන අතර .desktopලිපිගොනු පෙළ සංස්කාරකවරුන් සමඟ සම්බන්ධ වී ඇත, මන්ද ඒවා පෙළෙහි උප
පංතියක් බැවින්

15
මෙය කෙතරම් මෝඩද (ටර්මිනලයේ සිට ඩෙස්ක්ටොප් ගොනුවක් ධාවනය කිරීමට බුද්ධිමත් ක්‍රමයක් නොමැත)
සෑම් වොට්කින්ස්

2
ආර්ච් ලිනක්ස් හි මා වෙනුවෙන් ක්‍රියා කරයි, නමුත් සමහර විට එය උබුන්ටු විශේෂිත දෝෂයකි.
වික්ටර්

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 something.desktop අපේක්ෂිත පරිදි ක්‍රියා කරයි
  • #!/usr/bin/xdg-open ක්‍රියාත්මක කළ හැකි ඩෙස්ක්ටොප් සටහනක් මත ඇති හැෂ්බෑන්ග් ද ක්‍රියා කරයි

gvfs-openදෝෂය විසඳන විට එය නිෂ් less ල කාර්යයක් වනු ඇත, නමුත් මේ අතරතුර ...


1
මෙය හමීෂ් ඩව්නර්ගේ පිළිතුරට වඩා හොඳින් ක්‍රියා කරයි, මන්ද එය විධානයෙහි බහු Exec=රේඛා සහ %පරාමිතීන් සමඟ නිවැරදිව කටයුතු කරනු ඇත.
Flimm

4
කේතය ස්තුතියි - මම පැහැදිලි කටහඬකින් කරුණු මත ඉන්නේ, මම හුදෙක් මෙම ගැලවීම /usr/bin/xdg-openpy, සහ එය ලබා දුන් chmod +x- සහ භාවිතා launcher.launch([],context)වෙනුවට ...None,context)(නිසා " TypeError: තර්කය 1: අනුක්රමය විය යුතුය, NoneType නොවේ "). දැන් xdg-openpy app.desktopවිධාන රේඛාවෙන් ක්‍රියා කරයි (සහ සියල්ල දෙවරක් ක්ලික් කරන විට සාමාන්‍ය පරිදි app.desktop), මම ටර්මිනලය xdg-openඅමතා ටැබ් එක ඔබන්න උත්සාහ කළහොත් එය මට මතක් කර දිය හැකිය . චියර්ස්!
sdaau

3
+1. .desktopගොනුව අතින් විග්‍රහ කිරීම අවශ්‍ය නොවන එකම පිළිතුර මෙයයි , එබැවින් එය වඩාත්ම බුද්ධිමත් (ආරක්ෂිත) ප්‍රවේශයයි. gi.repositoryඅතහැර දැමූ ඒවා වෙනුවට නවීන භාවිතා කරයි pygtk, එතරම් විශිෂ්ටයි! :)
MestreLion

2
ඇත්ත වශයෙන්ම, මෙය කාලෝ පෙලෙග්‍රිනිගේ පිළිතුර සම්බන්ධ ප්‍රශ්නයකි. මම නවකයෙක්, කරුණාකර එය නිවැරදි කිරීමට වඩා හොඳ ක්‍රමයක් තිබේ නම් මාව නිවැරදි කරන්න. ස්ක්‍රිප්ට් එක ඉතා හොඳින් ක්‍රියා කරයි, නමුත් යුනිටි ලොන්චරයේ මට ලැබෙන අයිකනය .desktop ගොනුවේ අර්ථ දක්වා ඇති නිරූපකය නොව 'Exec'ed විධානයෙහි පෙරනිමි නිරූපකය වේ. ඒ ගැන යම් අදහසක් තිබේද?
ඉන්ගෝ ලියොන්හාර්ඩ්

1
O නොයිටිඩාර්ට් අවසාන පිළිතුර ලිවීම නිසා ගූගල් කිරීමට යම් යම් දේ කළ අතර මට එය හමු විය . එය පරික්ෂා කර නැත, නමුත් සමහර විට එය උපකාරී වනු ඇත
ඉන්ගෝ ලියොන්හාර්ඩ්

33

නිවැරදි මාර්ගය

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

ඒ නිසා මෙම වටා ලබා ගැනීම සඳහා, අප තාවකාලිකව අපේක්ෂිත ස්ථාපනය කරන hackish ටිකක් බෑෂ් ක්රියාව භාවිත කල හැක .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

    )

}

ඔබට එය එසේ භාවිතා කළ හැකිය (තවද ඔබට අවශ්‍ය නම් අතිරේක තර්ක හෝ යූආර්අයි හරහා යන්න):

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

අත්පොත විකල්පය

.Desktop ගොනුවක් අතින් විග්‍රහ කර ක්‍රියාත්මක කිරීමට ඔබට අවශ්‍ය නම්, පහත දැක්වෙන awkවිධානය මඟින් ඔබට එය කළ හැකිය :

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

ඔබට awkවිධානය සර්ව පාක්ෂික පිටපතක් ලෙස සැලකීමට අවශ්‍ය නම් ; Exec විධානයක් සොයාගත නොහැකි වූ විට අපට දෝෂ පණිවිඩයක් පෙන්විය හැකි අතර ආපසු 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. Exec = සමඟ ආරම්භ වන රේඛාව සොයා ගන්න
  2. Exec = ඉවත් කරන්න
  3. ඕනෑම Exec විචල්යයන් ඉවත් කරන්න (උදා %f. %u, %U). පිරිවිතරයන් අදහස් කරන පරිදි මේවා ස්ථානීය තර්ක සමඟ ප්‍රතිස්ථාපනය කළ හැකි නමුත් එසේ කිරීමෙන් ගැටලුවට සැලකිය යුතු සංකීර්ණතාවයක් එකතු වේ. නවතම ඩෙස්ක්ටොප් ප්‍රවේශ පිරිවිතර බලන්න .
  4. විධානය ක්‍රියාත්මක කරන්න
  5. සුදුසු පිටවීමේ කේතය සමඟ වහාම පිටවන්න (බහු Exec රේඛා ක්‍රියාත්මක නොකිරීමට )

සටහන, මෙම AWK ස්ක්‍රිප්ට් වෙනත් පිළිතුරු මගින් නිසි ලෙස ආමන්ත්‍රණය කළ හැකි හෝ නොකළ හැකි අවස්ථා කිහිපයක් ආමන්ත්‍රණය කරයි. නිශ්චිතවම, මෙම විධානය මඟින් එක්සෙක් විචල්‍යයන් කිහිපයක් ඉවත් කරයි (වෙනත් ආකාරයකින්% සංකේතය ඉවත් නොකිරීමට වගබලා ගනී), එක් එක් එක්සෙක් රේඛා විධානයක් පමණක් ක්‍රියාත්මක කරනු ඇති අතර, එක්සෙක් රේඛා විධානයට සමාන ලකුණක් හෝ වැඩි ගණනක් (උදා script.py --profile=name) අඩංගු වුවද අපේක්ෂිත පරිදි ක්‍රියා කරනු ඇත .

තවත් අවවාද කිහිපයක් පමණි ... පිරිවිතරයන්ට අනුව, ට්‍රයිඑක්සෙක් යනු:

වැඩසටහන සැබවින්ම ස්ථාපනය කර ඇත්දැයි තීරණය කිරීම සඳහා තැටියේ ක්‍රියාත්මක කළ හැකි ගොනුවකට මාවත. මාර්ගය නිරපේක්ෂ මාර්ගයක් නොවේ නම්, ගොනුව $ 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

URIs භාවිතා කිරීම අත්‍යවශ්‍ය නොවන බව සලකන්න. තවද, කිසිදු දෝෂ පරීක්‍ෂණයක් සිදු නොකෙරේ, එවිට ඔබේ ස්ක්‍රිප්ට් කල් පවතින බව ඔබට අවශ්‍ය නම් දියත් කිරීම පවතින බවත් එය කියවිය හැකි බවත් (එය භාවිතා කිරීමට පෙර) සහතික කිරීමට ඔබට අවශ්‍ය වනු ඇත.


නමුත් awkවිධානය හොඳයි. එබැවින් +1
ඒබී

මෙම සන්දර්භය තුළ යූආර්අයි යනු කුමක්ද? මට අත්තනෝමතික ෆෝල්ඩරයක ඩෙස්ක්ටොප් ගොනුවක් තිබේ. වෙනත් තිර රචනයකින් ඔතා නොගෙන මම එය මත 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විසඳුම හොඳින් ක්‍රියාත්මක වේ.
මාර්සොෆ්ට්

30

OP KDE ගැන විමසන්නේ නැති අතර, KDE ධාවනය කරන ඕනෑම කෙනෙකුට පහත විධානය භාවිතා කළ හැකිය:

kioclient exec <path-to-desktop-file>

ෆෙඩෝරා හි, මෙය kde-runtimerpm හි ඇතුළත් වේ.


5
එය ක්‍රියාත්මක වන නිසා ඉහළට. ඔබ මෙම වැඩසටහන ස්ථාපනය කර ඇති තාක් කල් KDE ධාවනය කිරීම අවශ්‍ය නොවේ.
මූලික 6

මෙයින් ඉවත් වීමට ක්‍රමයක් තිබේද? මම ක්ලෙමන්ටයින් වාදකය සම්පාදනය කර ඇති අතර, එය දෝෂයක් ඇත .desktop ගොනුව හරහා (ප්ලාස්මා-ෂෙල් සමඟ) දියත් කිරීම පමණි. කෙසේ වෙතත්, නිමැවුම් ලොග් ලොග් කෙසේ හෝ තිබේදැයි මට සිතාගත නොහැක.
ක්වාඩ්පෙපර්

W ක්වාඩ්පෙපර් ඔබට ඔබේ .desktop ගොනුව භාවිතා කර ෂෙල් ස්ක්‍රිප්ට් එකක් දියත් කළ හැකි අතර එය අභ්‍යන්තරව ඔබේ විධානය ක්‍රියාත්මක කර ප්‍රතිදානය ගොනුවකට හරවා යවයි.
රාමන්

ආර්ච් ලිනක්ස් සඳහා කේඩීඊ හි කිසිදු පැකේජයක මේ වන විට මට කියෝක්ලියන්ට් හමු නොවේ. කෙසේ වෙතත්, gtk-launch මා වෙනුවෙන් KDE යටතේ ක්‍රියා කරයි.
මවුන්ටන්එක්ස්

20

ඔබට ඩෙක්ස් භාවිතා කළ හැකිය .

dex foo.desktop

3
IMHO මෙය හරියටම නිවැරදි පිළිතුරයි: එක් මෙවලමක්, පරාමිතියක් ලෙස ගොනුව පමණක් ඇති තනි ඇමතුමක්. අතින් ලියන ලද .desktopලිපිගොනු පරීක්ෂා කිරීම සඳහා මා බලාපොරොත්තු වූයේ එයයි . එයට .desktopලිපිගොනු නිර්මාණය කළ හැකිය, ඔව් ! :-)
ඇක්සෙල් බෙකර්ට්

පරිපූර්ණ! ඔබ ඩෙක්ස් gist.github.com/stuaxo/4169fc1342c496b7c8f7999188f2f242 භාවිතා කරන .desktop ගොනුවක් / usr / share / applications වෙත එකතු කළහොත් / පෙරනිමියෙන් gedit වලින් විවෘත නොකර ගොනු කළමනාකරු තුළ ඩෙස්ක්ටොප් ගොනු දියත් කිරීමට ඔබට හැකි වේ.
ස්ටුවර්ට් ඇක්සන්

1
ඒක තමයි! නිවැරදි පිළිතුර සඳහා ඕනෑවට වඩා අනුචලනය කිරීම ...
ricab

20.04 දින වැඩ කරයි.
පෙන්ගෙ ජෙන්ග්

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

එක්සෝ-යුටිල්ස් ස්ථාපනය කර ඇත්නම් 13.10 නිකුතුවේ වැඩ කරන බව පෙනේ (Xubuntu හි මෙන්).


ඔව්, එය උබුන්ටු ස්ටුඩියෝ 14.04 හි පරීක්ෂා කර ඇත. BTW. xdg-open සහ gvfs- විවෘත වැඩ ද එහි ඇත.
jarno

15 හි ද ක්‍රියා කරයි
ජොනතන්

Xfce සමඟ ඩේබියන් භාවිතා කිරීම. නියමයි!
king_julien

උබුන්ටු 14.04 හි මා වෙනුවෙන් වැඩ කරයි
ටයිලර් කොලියර්

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, නමුත් එය මට 'නරක ආදේශකයක්' ලබා දුන්නේය ...


මෙය හමීෂ්ගේ පිළිතුරට වඩාත් උචිත අදහස් දැක්වීමක් බව මම දනිමි, නමුත් මම නව පරිශීලකයෙක් වන අතර අදහස් දැක්වීමට අවසර නැත. හා හොඳයි!
pabst

ඔබට කීර්තියක් තිබේ නම්, වඩාත් සුදුසු ක්‍රියාව වනුයේ ඇත්ත වශයෙන්ම එම පිළිතුර සංස්කරණය කිරීමයි.
Flimm

එයට පහර දෙන්න, ඕනෑම කෙනෙකුට සංස්කරණයන් යෝජනා කළ හැකිය, පිවිසී නැති පරිශීලකයින් පවා! එය කිසිම ආකාරයකින් ලොකු දෙයක් නොවේ.
Flimm

1
මෙය තනිවම පිළිතුරකි, එහි දඩය.
un නෝ පෙරෙයිරා

ඔබට "${@:1}"ඒ වෙනුවට භාවිතා කළ හැකිය shift, නමුත් ඒ සඳහා ඔබේ ෂෙබාං bashවෙනුවට අවශ්‍ය වේ . IMHO ඔබේ මුල් මාරුවීමේ ප්‍රවේශය වඩා සරල හා වඩා හොඳයsh#!
මෙස්ට්‍රෙලියන්

6

උබුන්ටු ලේඛනාගාරයේ ඔබ විස්තර කරන දේ කරන යෙදුමක් දැනට නොමැත. මෙම එක්ස්ඩීජී පිරිවිතරයන්ට අනුකූල නොවන ඩෙස්ක්ටොප් පරිසරයන් සඳහා (විවෘත පෙට්ටිය වැනි) ඒකාබද්ධ කිරීම සඳහා පොදු විසඳුමක් නිර්මාණය කිරීමට උත්සාහයන් කිහිපයක් ක්‍රියාත්මක වෙමින් පවතී.

ආර්ච් ලිනක්ස් පයිතන්- xdg පුස්තකාල මත පදනම්ව xdg-autostart ක්‍රියාත්මක කිරීමට කටයුතු කරයි. මට සොයාගත හැකි දෙයින්, මෙය තවමත් සම්පුර්ණ වී නැති බව පෙනේ, නමුත් සාර්ථකත්වය පිළිබඳ වාර්තා කිහිපයක් ඇත.

පුළුල් භාවිතයෙන් ප්‍රයෝජන ගත හැකි ගිටීරියස් (http://gitorious.org/xdg-autostart/) මත 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 ගොනු විග්‍රහ කිරීමට සිදුවනු ඇත , එය “සම්මත / පෙරනිමි” වන්නේ කෙසේද යන්න පිළිබඳ ප්‍රශ්නයකි.


ස්තූතියි, රසවත්. “සම්මත” ලෙස මා අදහස් කරන්නේ DE විසින් සපයන ලද සහ freesktop.org ට අනුකූල වන දෙයක්.
enzotib

S සහ s awkදාමයකට වඩා ඉහළට ඔසවන්න . grepsed
jmtd

ඔබට අවසාන රේඛා තිබේ නම් එය ක්‍රියා නොකරයි (හෝ වඩා හොඳට වැඩ කරයි) Exec=: /
බොරිස් චර්සින්

4

(මෙහි ඇති වෙනත් විවිධ පිළිතුරු වලින් සම්පාදනය කරන ලදි)

ඔබේ පද්ධතිය සහ ඔබේ පද්ධතියේ පවතින හෝ නොවිය හැකි විවිධ දෝෂ මත පදනම්ව, ඒවායින් එකක් ක්‍රියාත්මක වන තෙක් පහත සඳහන් දෑ උත්සාහ කරන්න:

  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 පද්ධතියේ ඉහත කුමන විධානයන් කරන්නේද නැතහොත් ක්‍රියා කරන්නේද යන්න පෙන්වීමට, පහත දැක්වෙන ඇමතුම්වල ප්‍රති results ල මෙන්න:

  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-launch: එවැනි යෙදුමක් නොමැත"
  4. kioclient exec /usr/share/applications/eclipse_for_cpp.desktop # කටයුතු
  5. dex /usr/share/applications/eclipse_for_cpp.desktop# අසමත්, සහ sudo apt install dexඇසුරුම් ඩෙක්ස් සොයාගත නොහැක

2

මම ඉහත කාලෝගේ පිළිතුරෙන් පිටපත ලබා ගත් අතර මගේ ඩෙස්ක්ටොප් භාවිතය සඳහා එය වැඩි දියුණු කිරීමට උත්සාහ කළෙමි .

ස්ක්‍රිප්ටයේ මෙම අනුවාදය ඔබට ඕනෑම යෙදුමක් HUD හි ඇතුළත් කළ ආකාරයට ධාවනය කිරීමට ඉඩ සලසයි, එය පළමු ප්‍රති .ලය විය හැකි තාක් කල්. යූආර්අයි සඳහා සහය නොදක්වන .desktop ගොනු සඳහා ගොනු තර්ක ඉදිරිපත් කිරීමට ද එය ඔබට ඉඩ දෙයි.

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

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සහ සර්ග් =)
ඒබී

සමහර විට, ඇත TryExec, සමහර විට ඔබ ඔබේ 2 වන විධානය පරීක්ෂා කළ යුතුය =)
ඒබී

@ ඒ.බී හෙහෙ, awkපෙළ සැකසීමේදී මගේ තේරීමේ ආයුධය එයයි. ඇරත්, එහි වාක්‍ය ඛණ්ඩය ආසන්නය C. ඔහ්, සහ දැනටමත් added TryExec_ part කොටස එකතු කර ඇත
සර්ජි කොලොඩියාස්නි

ඔබට මගේ +1 =)
ඒබී

එහෙත් ගැන මොකක්ද %f, %u, %Uහෝ විධාන පිටුපස මේ වගේ දෙයක්?
ඒබී
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.