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

142

Из того, что я могу собрать, .desktopфайлы являются ярлыками, которые позволяют настраивать параметры приложения. Например, у меня их много в моей /usr/share/applications/папке.

Если я открою эту папку в nautilus, я могу запустить эти приложения, просто дважды щелкнув соответствующий файл, например, дважды щелкнув, firefox.desktopзапустит Firefox. Тем не менее, я не могу найти способ сделать то же самое через терминал.

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

Это мой вопрос, как мне запустить foo.desktopфайл из терминала?

Malabarba
источник
5
NB. Причина, по которой вы execпотерпели неудачу, заключается в том, что exec заменяет ваш текущий запущенный процесс указанным вами процессом, поэтому вы попытались заменить вашу оболочку запуском рабочего стола в виде скомпилированного двоичного файла. Причина, по которой вы не смогли этого сделать, sudo execзаключается в том, что это встроенная оболочка, а не двоичная команда.
Дейнит
Интересно, мне было интересно, почему это привело к закрытию вкладки.
Малабарба
Связанный: Hashbang для файлов .desktop Gnome
rndrük
Я вижу, они заканчивают анализом файла .desktop. В любом случае спасибо за ссылку.
энзотиб
модераторы: ой, думаю, что я мог отметить это случайно, извините, если это так
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 - я забыл, что файлы рабочего стола могут иметь аргументы.
Хэмиш Даунер
Вы должны добавить «tail -1» в канал после «grep», поскольку «Exec =» может появляться несколько раз, и после этого должно выполняться только последнее появление.
daisy
13
-1: Это может работать для простых .desktopфайлов, но он игнорирует записи , как Path=и TryExec=которые могут повлиять на исполнение. Он также выполняется неправильно, Exec=если файл содержит Действия на рабочем столе («
быстрые списки
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.
Виктор
76

С любой недавней Ubuntu, которая поддерживает gtk-launchпросто перейти

gtk-launch <file>где имя файла .desktop с или без .desktopдетали

Так gtk-launch fooоткрываетсяfoo.desktop

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

.Desktop должен находиться в / usr / share / Applications, / usr / local / share / application или ~ / .local / share / Applications

Используется из терминала или alt + F2 (команда alt + F2 хранит историю, поэтому легко доступна)

Дуг
источник
Это кстати, работает и в Debian.
gtk-launch firefox.desktop ~ / .local / share / Applications / запускает Firefox, просматривая каталог ~ / .local / share / Applications / для меня. Кажется, если вы были правы, Firefox не должен был передаваться каталог файла .desktop в качестве аргумента. Фактически, каталог, переданный в gtk-launch, не должен использоваться для поиска каталога, содержащего файл .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 что-то.дескопт работает как положено
  • #!/usr/bin/xdg-open hashbang поверх исполняемой записи рабочего стола тоже работает

Это будет бесполезная работа, когда 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и нажать Tab. Ура!
sdaau
3
+1. Это единственный ответ, который не требует ручного анализа .desktopфайла, поэтому это наиболее разумный (и безопасный) подход. Также использует современные gi.repositoryвместо устаревших pygtk, так здорово! :)
MestreLion
2
На самом деле, это вопрос, касающийся ответа Карло Пеллегрини. Я новичок, пожалуйста, поправьте меня, если есть лучший способ разместить его. Сценарий работает очень хорошо, но значок, который я получаю на панели запуска Unity, - это не значок, определенный в файле .desktop, а значок по умолчанию для команды «Exec». Есть идеи по этому поводу?
Инго Леонхардт
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. Если файл отсутствует или не является исполняемым, запись можно игнорировать (например, не использовать в меню).

Имея это в виду, не имеет смысла выполнять его значение.

Некоторые другие проблемы - Путь и Терминал . Путь состоит из рабочего каталога, в котором запускается программа. Terminal - логическое значение, указывающее, выполняется ли программа в окне терминала. Все это может быть решено, но нет смысла изобретать велосипед, поскольку уже есть реализации спецификации. Если вы хотите реализовать Path , имейте в виду, что он system()порождает подпроцесс, поэтому вы не можете изменить рабочий каталог, выполнив что-то подобное system("cd \047" working_directory "\047"); system(command). Однако вы могли бы предположительно сделать что-то вроде system("cd \047" working_directory "\047 && " command). Примечание \ 047 - одинарные кавычки (поэтому команда не разбивается на пути с пробелами).

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

Я краду страницу с Карло здесь , который предложил создать сценарий Python , чтобы использовать г модуля. Вот минимальный способ выполнить тот же код из оболочки без необходимости создавать файл и беспокоиться о вводе / выводе.

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
АВ
Что такое 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решение работает отлично.
MarSoft
27

Хотя OP не спрашивал о KDE, для всех, кто работает с KDE, можно использовать следующую команду:

kioclient exec <path-to-desktop-file>

На Fedora это включено в число kde-runtimeоборотов в минуту.

Раман
источник
5
Проголосовал, потому что это работает. Нет необходимости запускать KDE, если у вас установлена ​​эта программа.
basic6
Есть ли способ получить это? Я скомпилировал проигрыватель клементины, в котором есть ошибка, возникающая только при запуске через файл .desktop (с plasma-shell). И я не могу понять, как иметь журнал регистрации выходных данных в любом случае.
Kwaadpepper
@Kwaadpepper вы можете использовать ваш файл .desktop для запуска сценария оболочки, который внутренне выполняет вашу команду и перенаправляет вывод в файл.
Раман
В настоящее время я не нахожу kioclient ни в одном пакете KDE для Arch Linux. Тем не менее, gtk-launch работает под KDE для меня.
MountainX
15

Вы могли бы использовать Dex .

dex foo.desktop
couac
источник
2
ИМХО, это совершенно правильный ответ: один инструмент, один вызов, только файл в качестве параметра. Это то, что я тоже искал для проверки рукописных .desktopфайлов. И он может создавать .desktopфайлы, да! :-)
Аксель Беккерт,
Отлично! Если вы добавите файл .desktop, который использует dex gist.github.com/stuaxo/4169fc1342c496b7c8f7999188f2f242 в / usr / share / apps /, вы сможете запускать файлы рабочего стола в менеджере файлов, не открывая их по умолчанию в gedit.
Стюарт Аксон
13
exo-open [[path-to-a-desktop-file]...]

Кажется, работает в выпуске 13.10, если exo-utils установлен (как в случае с Xubuntu).

Ярно
источник
Да, только что проверил это в Ubuntu Studio 14.04. КСТАТИ. Там тоже работают xdg-open и gvfs-open.
Ярно
Работает и в 15
Джонатан
Использование Debian с xfce. Работает отлично!
king_julien
У меня работает в Ubuntu 14.04
Тайлер Кольер
8

Приложение к ответу Хэмиша.

Имея скрипт deskopen, вы можете использовать ссылку на него как строку shebang в файле .desktop , так как символ комментария остается неизменным #. То есть, поместите это в качестве первой строки файла .desktop :

#!/usr/bin/env deskopen

Затем пометьте файл .desktop как исполняемый (например, с помощью chmod +x whatever.desktop), а затем вы можете

path/to/whatever.desktop

и вуаля - приложение откроется! (В комплекте с значком файла, который я указал, хотя я понятия не имею, как.)

Теперь, если вы также хотите, чтобы 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в вашем #!shebang. ИМХО ваш оригинальный подход к смене проще и лучше
MestreLion
6

В настоящее время нет приложения, которое делает то, что вы описываете в архивах Ubuntu. В настоящее время предпринимается пара попыток создать общее решение, обеспечивающее интеграцию для сред рабочего стола (таких как openbox), которые не соответствуют этим спецификациям XDG.

Arch Linux работает над реализацией xdg-autostart на основе библиотек python-xdg. Из того, что я могу найти, это, кажется, еще не полностью завершено, но есть некоторые сообщения об успехе.

Существует также реализация xdg-autostart на gitorious на C ++ (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.
энзотиб
Upvote для, awkа не цепь grepс и sedс.
JMTD
Upvote, хотя это не работает (или лучше сказать - работает слишком много), если у вас есть ультипичные 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)
Fordi
источник
1

При попытке протестировать эти файлы я нашел самый простой способ проверить, что DM или менеджер сеансов будет делать то, что я ожидал, - открыть окружающий каталог в браузере папок пользовательского интерфейса, а затем дважды щелкнуть, чтобы открыть их.

Если вы находитесь в командной строке: gvfs-open .или gnome-open .откроете ее в настроенной папке браузера.

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

Дэнни Стейпл
источник
Терминал сразу исчезает, у меня нет времени, чтобы увидеть сообщение при использовании Terminal = true: s
gouessej
1

Этот SO ответ дал мне понять: не пытайтесь выполнить файл рабочего стола, запустите файл, указанный в файле рабочего стола.

Например, выполните /home/jsmith/Desktop/x11vnc.sh

Exec=/home/jsmith/Desktop/x11vnc.sh
user119824
источник
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-launch: нет такого приложения"
  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. Запустите скрипт, чтобы перехватить вывод ошибок. Вернитесь назад, когда ошибки будут исправлены.

hakunami
источник
0

Ответ Хэмиша великолепен, но я хотел бы предложить более простую альтернативу, с меньшим количеством задействованного трубопровода:

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

В этом случае awkвыполняется поиск строки, начинающейся с Exec, а затем мы просто печатаем поля после этой строки, используя цикл for, и =печатаем поле 2, т. Е. Все, что идет после этого поля. Фигурные скобки на концах команд $(...)являются подстановкой параметров, поэтому shell будет выполнять все, что возвращает команда awk; в этом случае он возвращает фактическую команду, которая идет после Exec=.

В некоторых редких случаях может быть более одного =знака, что все еще возможно. Для этого я предлагаю

$(awk -F= '/^Exec/||/^TryExec/ {for(i=2;i<=NF;i++) print $i;exit}' /usr/share/applications/firefox.desktop)
Сергей Колодяжный
источник
Ницца, awkи Serg =)
AB
И иногда, есть TryExec, может быть, вы должны проверить свою 2-ую команду =)
AB
@AB Хе-хе, awkмой выбор оружия, когда дело доходит до обработки текста. Кроме того, его синтаксис близок к C. Да, и уже добавили TryExecчасть ^ _ ^
Сергей Колодяжный
У вас есть мой +1 =)
АВ
Но то , что о %f, %u, %Uили что - то подобное за команду?
AB