Запуск файлу .desktop у терміналі


141

З того, що я можу зібрати, .desktopфайли - це ярлики, які дозволяють налаштувати параметри програми. Наприклад, у мене в /usr/share/applications/папці багато.

Якщо я відкрию цю папку nautilus, я можу запустити ці програми, лише двічі клацнувши відповідний файл, наприклад, двічі клацнувши firefox.desktopзапустити Firefox. Однак я не можу знайти спосіб зробити те ж саме через термінал.

Якщо я gnome-open foo.desktopце роблю, просто відкривається foo.desktopу вигляді текстового файлу. Якщо я зроблю його виконуваним, а потім запускаю його в bash, він просто не працює (що, як очікується, це явно не скрипт bash).
РЕДАКТУВАННЯ: Додавання exec /fullpath/foo.desktopдає мені Permission deniedповідомлення, навіть якщо я змінюю право власності на себе. Якщо я роблю виконуваний файл і виконую ту саму команду, вкладка терміналу, яку я використовую, просто закривається (я здогадуюсь, що вона виходить з ладу). Нарешті, якщо я це зробити sudo exec /fullpath/foo.desktop, я отримую повідомлення про помилки sudo: exec: command not found.

Це моє запитання, як я можу запустити foo.desktopфайл з терміналу?


5
Примітка: Причиною вашої execпомилки є те, що exec замінює ваш поточний запущений процес на вказаний вами процес, тож ви зробили спробу замінити оболонку на запуск робочого столу як складений бінарний файл. Причиною цього ви не sudo execможете, тому що це вбудована оболонка, а не двійкова команда.
Daenyth

Цікаво, мені було цікаво, чому це спричинило закриття вкладки.
Малабарба


Я бачу, вони закінчують розбір файлу .desktop. Все-таки дякую за посилання.
enzotib

модератори: ой, думаю, що я, можливо, позначив це випадково, вибачте, якщо це так
Croad Langshan

Відповіді:


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. Bash намагається передати цей рядок як звичайний аргумент. Наприклад, це grep '^Exec' firefox.desktop | sed 's/^Exec=//'відкриває Firefox з вкладкою, що завантажує www.% U.com .
Малабарба

На даний момент я додав секунду, sedщоб видалити будь-які аргументи. Але я думаю, що може бути і більш "природний" спосіб його виконання.
Малабарба

Я оновив свою відповідь додатковим sed - я забув, що файли на робочому столі можуть мати аргументи.
Хаміш Даунер

Ви повинні додати "хвіст -1" в трубу після "grep", оскільки "Exec =" може з'являтися кілька разів, а після цього слід виконати лише останню появу ..
Дейзі

13
-1: Це може працювати для простих .desktopфайлів, але він ігнорує записи , як Path=і TryExec=які можуть вплинути на виконання. Він також виконує неправильно, Exec=якщо файл містить Дії на робочому столі ("швидкі списки")
MestreLion

85

Відповідь повинна бути

xdg-open program_name.desktop

Але через помилку це більше не працює.


7
WoW, це все-таки помилка, багато прогресу в xdg. exo-openвказується як вирішення, і він також відкриває gedit. :(
Дрю

1
@RichardHolloway: gnome-openніяк НЕ назвати xdg-open, це навпаки! Тож питання полягає у gvfs-open(спадкоємці або gnome-open)
MestreLion

13
"більше не працює"? Це ніколи не було! xdg-openпрацює за допомогою асоціації mimetype, а .desktopфайли асоціюються з текстовими редакторами, оскільки вони є підкласом тексту
MestreLion

13
це настільки дурно (що немає розумного способу запустити файл на робочому столі з терміналу)
Сем Уоткінс,

2
Для мене працює в Arch Linux, але, можливо, це специфічна помилка Ubuntu.
Віктор

75

З будь-яким останнім ubuntu, який підтримує gtk-launchпросто перейти

gtk-launch <file>де назва файлу .desktop з .desktopчастиною або без неї

Так gtk-launch fooвідкриваєтьсяfoo.desktop

( gtk-launchдокументація )

.Desktop має бути в / usr / share / applications, / usr / local / share / applications або ~ / .local / share / застосунки

Використовується з терміналу або alt + F2 (команда alt + F2 зберігає в історії так легко доступну)


Це шлях, який працює і в debian.

gtk-start firefox.desktop ~ / .local / share / applications / запускає firefox, переглядаючи для мене каталог ~ / .local / share / applications / . Здається, якщо ви були правильні, Firefox не повинен був передавати каталог файлу .desktop як аргумент. Насправді каталог, переданий gtk-start, не повинен використовуватися для пошуку dir, що містить файл .desktop (а насправді це не так)
Croad Langshan,

Так! Відповідь, яка працює!
Алісія

Це працює для мене і в Arch Linux. Жодна з інших відповідей не була задовільною, але ця хороша. :-) Це працює, навіть якщо я запускаю KDE.
MountainX

2
Жодна версія цього не працює для мене на Ubuntu 18.10. Щоразу, коли він скаржиться, що програми не існує, я перебуваю в папці з файлом робочого столу чи ні, включаю я розширення .desktop чи ні, і я окремо називаю каталог чи ні.
Джозеф Гарвін

38

На сьогодні (12.10) помилка все ще присутня. Це насправді залежить від того, як gvfs-open(називається xdg-open).

І все-таки мені вдалося швидко вирішити (вкрасти натхнення у вихідного коду nautilus). Він дещо перекручений, але працює бездоганно на Ubuntu 12.10, додаючи значущий значок (не більше ?) на панелі запуску Unity.

По-перше, я написав сценарій python за допомогою Gio і помістив його як ~/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вирішить помилку, але тим часом ...


1
Це працює краще, ніж відповідь Хаміша Даунера, оскільки він буде правильно працювати з декількома Exec=рядками та %параметрами в команді.
Flimm

4
Дякую за код - я на Lucid, і я просто зберег це як /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
Насправді це питання стосовно відповіді Карло Пеллегріні. Я новачок, будь ласка, виправте мене, якщо був кращий спосіб розмістити його. Сценарій працює дуже добре, але піктограма, яку я отримую на панелі запуску Unity, це не значок, визначений у файлі .desktop, а значок за замовчуванням команди 'Exec'ed'. Будь-які ідеї з цього приводу?
Інго Леонхардт

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).

Тож, щоб обійти це, ми можемо використовувати хакерську маленьку функцію Bash, яка тимчасово встановлює потрібний файл .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. Негайно вийдіть з відповідним кодом виходу (щоб не виконати кілька рядків Exec )

Зауважте, цей сценарій AWK розглядає декілька кращих випадків, які можуть бути, а можуть бути, неправильно вирішені в деяких інших відповідях. Зокрема, ця команда видаляє декілька змінних Exec (дбаючи про те, щоб інакше не видалити символ%), виконає лише одну команду рядка Exec і буде вести себе як очікувалося, навіть якщо команда рядка Exec містить один або більше знаків рівності (наприклад script.py --profile=name).

Ще кілька застережень ... Відповідно до специфікації, TryExec є:

Шлях до виконуваного файлу на диску, який використовується для визначення того, чи програма фактично встановлена. Якщо шлях не є абсолютним шляхом, файл шукається у змінній середовища $ PATH. Якщо файл відсутній або він не виконується, запис може бути проігноровано (наприклад, не використовується в меню).

Зважаючи на це, не має сенсу виконувати це значення.

Деякі інші проблеми - " Шлях та термінал" . Шлях складається з робочого каталогу для запуску програми. Термінал є булевим, який вказує, чи запускається програма у вікні терміналу. З цим можна вирішити всі питання, але в винаході колеса немає сенсу, оскільки вже є реалізація специфікації. Якщо ви хочете реалізувати Path , майте на увазі, що він system()породжує підпроцес, тому ви не можете змінити робочий каталог, зробивши щось подібне system("cd \047" working_directory "\047"); system(command). Однак, можливо, ви можете зробити щось на кшталт system("cd \047" working_directory "\047 && " command). Примітка \ 047 - це одиничні лапки (тому команда не розбивається на шляхи з пробілами).

Альтернатива Python

Я викрадаю сторінку від Карло тут , який запропонував створити сценарій Python, щоб використовувати модуль gi . Ось мінімальний спосіб виконання одного і того ж коду з оболонки без створення файлу та турботи про введення / виведення.

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команда приємна. Тому +1
AB

Що таке URI в цьому контексті? У мене є файл робочого столу у довільній папці. Як, до біса, я просто запускаю gtk-start на ньому без необхідності загортати його в інший сценарій? Це божевільно.
Джозеф Гарвін

Це awkрішення не працюватиме належним чином, якщо команда має подвійний пробіл пробілів або звороту косу рису. Це порушується на цьому: Exec=env WINEPREFIX="/path/to/.wine" wine c:\\\\windows\\\\command\\\\start.exe /Unix /path/to/.wine/dosdevices/c:/users/Public/Рабочий\\ стол/appname.lnkІ dexрішення працює добре.
MarSoft

27

Поки OP не запитував про KDE, для тих, хто працює з KDE, може бути використана наступна команда:

kioclient exec <path-to-desktop-file>

У Fedora це включено в kde-runtimeобороти в хвилину.


5
Оновлено, оскільки воно працює. Зовсім не потрібно запускати KDE, якщо ця програма встановлена.
базовий6

Чи є спосіб цього відхилити? Я склав програвач Clementine, який має помилку, яка виникає лише при запуску через файл .desktop (з плазмовою оболонкою). І я не можу зрозуміти, як мати вихідний журнал журналу.
Кваадпеппер

@Kwaadpepper ви можете використовувати ваш .desktop файл для запуску скрипту оболонки, який внутрішньо запускає вашу команду і перенаправляє вихід у файл.
Раман

Наразі я не знаходжу кіокліент у жодному пакеті KDE для Arch Linux. Однак gtk-запуск працює для мене в KDE.
MountainX

15

Ви можете використовувати dex .

dex foo.desktop

2
IMHO - це точно правильна відповідь: Один інструмент, один виклик з файлом як параметр. Це те, що я також шукав, щоб перевірити власноруч написані .desktopфайли. І це також може створювати .desktopфайли, так! :-)
Аксель Беккерт

Ідеально! Якщо ви додасте .desktop файл, який використовує dex gist.github.com/stuaxo/4169fc1342c496b7c8f7999188f2f242 до / usr / share / applications /, ви зможете запускати настільні файли у файловому менеджері, не відкриваючи їх також у gedit.
Стюарт Ексон

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

здається, працює у версії 13.10, якщо встановлено екзо-утиліти (як це стосується Xubuntu).


Так, щойно тестували його в Ubuntu Studio 14.04. До речі. там також працюють xdg-open і gvfs-open.
jarno

Працює і в 15
Джонатан

Використання Debian з xfce. Чудово працює!
king_julien

Працює для мене в Ubuntu 14.04
Тайлер Колліє

8

Додаток до відповіді Хаміша.

Враховуючи сценарій deskopen, ви можете використовувати посилання на нього як рядок shebang у файлі .desktop , оскільки символ коментаря все ще є #. Тобто, поставте це як перший рядок файлу .desktop :

#!/usr/bin/env deskopen

Потім позначте файл .desktop як виконуваний файл (наприклад, з a chmod +x whatever.desktop), і тоді ви можете

path/to/whatever.desktop

and voilà - Додаток відкриється! (У комплекті з файлом значків, який я вказав, хоча я не маю уявлення як.)

Тепер, якщо ви також хочете, щоб deskopen проходив через будь-які параметри командного рядка, замість цього ви можете використовувати цю трохи змінену версію:

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

Як сторону, я намагався використовувати "#{@:2}"замість shifting, але це все одно давало мені "погану заміну" ...


Я знаю, що це більш доречно коментар до відповіді Хаміша, але я новий користувач і мені не дозволяють коментувати. Ну добре!
пабст

Якщо у вас є репутація, найбільш прийнятною дією було б фактично редагувати цю відповідь.
Flimm

Враховуйте, що кожен може запропонувати зміни, навіть користувачі, які не ввійшли в систему! Ні в якому разі не великий.
Flimm

1
Це відповідь сама по собі, її добре.
Бруно Перейра

ви можете використовувати "${@:1}"замість цього shift, але це потрібно bashзамість shвашого #!шебангу. ІМХО ваш оригінальний підхід до зміни - простіший і кращий
MestreLion

6

В даний час не існує програми, яка б робила те, що ви описуєте в архівах Ubuntu. Проводиться кілька зусиль для створення загального рішення для забезпечення інтеграції для робочого середовища (наприклад, openbox), яке не відповідає цим специфікаціям XDG.

Arch Linux працює над реалізацією xdg-автозапуску на основі бібліотек python-xdg. Як я можу знайти, це здається ще не повністю завершеним, але має деякі звіти про успіх.

Існує також C ++ реалізація xdg-autostart на gitorious (http://gitorious.org/xdg-autostart/), яка, ймовірно, виграє від ширшого використання.

Якщо будь-яке рішення працює для вас, будь ласка, подумайте надсилати необхідну роботу для включення в Debian або Ubuntu.

Щоб використовувати будь-який інструмент з openstart, ви зателефонуєте до нього в /etc/xdg/openbox/autostart.sh (якщо я правильно читаю документацію openbox). Якщо це не працює, ви, ймовірно, можете викликати його в будь-якому із сценаріїв ініціалізації сеансу openbox.


Не те, що я хотів би почути, все одно дякую за інформацію
enzotib

6

У мене немає негайного рішення, яке б відповідало вимозі "використовувати стандартну команду" , але якщо ви хотіли мінімально проаналізувати .desktopфайли або хотіли створити псевдонім Bash, то слід працювати наступним чином:

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

Інший підхід, який може бути цікавим, - створити binfmt-miscметод рівня ядра, ніж збіги у .desktopфайлах (див. grep -r . /proc/sys/fs/binfmt_misc/ті шаблони, які ви ввімкнули на даний момент).

Зрештою, що - то де - то доведеться розібрати .desktopфайли, це просто питання про те , як «стандартному / по замовчуванням» , тобто.


Дякую, цікаво. Як "стандартний" я маю на увазі щось, що надається DE та відповідає сайту freedesktop.org.
enzotib

Оновлення, awkа не ланцюжок greps і seds.
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

Під час спроби тестування цих файлів я знайшов найпростіший спосіб перевірити, що DM або менеджер сеансів зробить те, що я очікував - відкрити навколишній dir у браузері папок інтерфейсу та двічі клацнути, щоб відкрити їх.

Якщо ви знаходитесь у командному рядку: gvfs-open .або gnome-open .відкриєте його у налаштованому браузері папок.

Річ з sed не буде відображати поведінку DM, включаючи прискіпливі речі, такі як втечі та цитування, де вам не хотілося б альтернативної поведінки. Це не командний рядок, але він підтвердив речі. Я також знайшов налаштування Terminal=trueкорисною для налагодження.


Термінал одразу зникає, я не маю часу побачити повідомлення при використанні 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

Зауважте, що в системах Ubuntu ваші пускові установки на робочому столі "меню пуску" доступні в /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-start: немає такої програми"
  4. kioclient exec /usr/share/applications/eclipse_for_cpp.desktop # Твори
  5. dex /usr/share/applications/eclipse_for_cpp.desktop# sudo apt install dexНе вдалося & не вдалося знайти пакет dex

0

Переконайтеся, що сценарій, на який вказує файл на робочому столі, також виконується.

Якщо все ще не працює. Зробіть файл на робочому столі, який можна керувати в терміналі, змінивши Terminal=true, і помістіть його всередині bash-скрипту. Запустіть скрипт, щоб знайти вихід помилки. Зміна назад, коли виправлені помилки.


0

Відповідь Хаміша чудова, але я хотів би запропонувати більш просту альтернативу з меншою кількістю труб:

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

У цьому випадку awkвиконується пошук рядка, починаючи з цього Exec, а потім ми просто друкуємо поля після цього рядка, використовуючи для циклу та =друкуємо поле 2, тобто те, що приходить після цього поля. Фігурні дужки на кінцях команд, $(...)є заміною параметрів, таким чином оболонка буде виконувати все, що повертає команда awk; у цьому випадку він повертає фактичну команду, що надходить після Exec=.

У деяких рідкісних випадках може бути більше однієї =ознаки, що все ж є можливою. Для цього я пропоную

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

Ніцца, awkі Серг =)
AB

І іноді, є TryExec, можливо, вам слід перевірити свою 2-ю команду =)
AB

@AB Hehe, awkце моя зброя вибору, що стосується обробки тексту. Крім того, це синтаксис близький до C. Ох, і вже додали TryExecчастину ^ _ ^
Сергій Колодяжний,

У вас мій +1 =)
AB

Але то , що про %f, %u, %Uабо що - щось подібне за команду?
AB
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.