Из того, что я могу собрать, .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
файл из терминала?
источник
exec
потерпели неудачу, заключается в том, что exec заменяет ваш текущий запущенный процесс указанным вами процессом, поэтому вы попытались заменить вашу оболочку запуском рабочего стола в виде скомпилированного двоичного файла. Причина, по которой вы не смогли этого сделать,sudo exec
заключается в том, что это встроенная оболочка, а не двоичная команда.Ответы:
Команда, которая выполняется, содержится в файле рабочего стола, перед которым стоит,
Exec=
чтобы вы могли извлечь и запустить ее:Чтобы сломать это
Вы можете поместить это в файл, скажем,
~/bin/deskopen
с содержаниемЗатем сделайте его исполняемым
И тогда вы могли бы сделать, например,
Аргументы (
%u
и%F
т. Д.) Подробно описаны по адресу http://standards.freedesktop.org/desktop-entry-spec/desktop-entry-spec-1.0.html#exec-variables - ни один из них не имеет отношения к запуску из командной строки. ,источник
grep '^Exec' firefox.desktop | sed 's/^Exec=//'
открывает Firefox с вкладкой, которая загружает www.% U.com .sed
чтобы удалить любые аргументы. Но я думаю, что может быть более «естественный» способ запустить его..desktop
файлов, но он игнорирует записи , какPath=
иTryExec=
которые могут повлиять на исполнение. Он также выполняется неправильно,Exec=
если файл содержит Действия на рабочем столе («Ответ должен быть
Но из- за ошибки это больше не работает.
источник
exo-open
указан как обходной путь, и он также открывает Gedit. :(gnome-open
никак не назватьxdg-open
, это наоборот! Таким образом, проблема заключается вgvfs-open
(преемник илиgnome-open
)xdg-open
работы ассоциации mimetype, а.desktop
файлы связаны с текстовыми редакторами, поскольку они являются подклассом текстаС любой недавней 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 хранит историю, поэтому легко доступна)
источник
На сегодняшний день (12.10) ошибка все еще присутствует. На самом деле это зависит от того, как
gvfs-open
( вызываетсяxdg-open
) работает.Тем не менее, мне удалось быстро обойти (украсть вдохновение из исходного кода nautilus). Это немного запутанно, но работает безупречно на Ubuntu 12.10, добавляя значащий значок (не более
?
) на панели запуска Unity.Во-первых, я написал скрипт на Python с использованием Gio и поместил его в файл
~/bin/run-desktop
:Сценарий должен иметь разрешение на выполнение, поэтому я запустил его в терминале:
Затем я создал относительную
.desktop
запись на~/.local/share/applications/run-desktop.desktop
:Наконец -то я связывал запись в качестве обработчика по умолчанию в
~/.local/share/applications/mimeapps.list
соответствии с[Default Applications]
сечением в виде:В настоящее время:
xdg-open
что-то.дескопт работает как положено#!/usr/bin/xdg-open
hashbang поверх исполняемой записи рабочего стола тоже работаетЭто будет бесполезная работа, когда
gvfs-open
решит ошибку, а пока ...источник
Exec=
строк и%
параметров в команде./usr/bin/xdg-openpy
, и дал егоchmod +x
- и использовалlauncher.launch([],context)
вместо...None,context)
(из-за " TypeError: аргумент 1: Должен быть последовательность, а не NoneType "). Теперьxdg-openpy app.desktop
работает из командной строки (и все как обычно при двойном щелчкеapp.desktop
), и это может напомнить мне, если я попытаюсь позвонить в терминалxdg-open
и нажать Tab. Ура!.desktop
файла, поэтому это наиболее разумный (и безопасный) подход. Также использует современныеgi.repository
вместо устаревшихpygtk
, так здорово! :)Правильный путь
Вы должны действительно использовать,
gtk-launch
если это доступно. Обычно это часть пакета libgtk-3-bin (это может отличаться в зависимости от дистрибутива).gtk-launch
используется следующим образом:Обратите внимание, что для установки
gtk-launch
требуется файл .desktop (т. Е. Он находится в/usr/share/applications
или~/.local/share/applications
).Таким образом, чтобы обойти это, мы можем использовать маленькую хакерскую функцию Bash, которая временно устанавливает нужный файл .desktop перед его запуском. «Правильный» способ установки файла .desktop - через,
desktop-file-install
но я собираюсь игнорировать это.Вы можете использовать его следующим образом (а также передавать дополнительные аргументы или URI, если хотите):
Ручная альтернатива
Если вы хотите вручную проанализировать и выполнить файл .desktop , вы можете сделать это с помощью следующей
awk
команды:Если вы хотите обработать
awk
команду как сценарий «все в одном»; мы можем даже показать сообщение об ошибке и выйти с кодом возврата 1 в случае, если команда Exec не найдена:Вышеупомянутые команды будут:
%f
,%u
,%U
). Их можно заменить позиционными аргументами, как это предусмотрено в спецификации, но это может значительно усложнить проблему. См. Последнюю спецификацию входа на рабочий стол .Обратите внимание, что этот сценарий AWK обращается к нескольким крайним случаям, которые могут или не могут быть должным образом рассмотрены некоторыми другими ответами. В частности, эта команда удаляет несколько переменных Exec (стараясь не удалять символ% в противном случае), будет выполнять только одну строковую команду Exec и будет вести себя так, как ожидается, даже если строковая команда Exec содержит один или несколько знаков равенства (например,
script.py --profile=name
).Еще несколько предостережений ... Согласно спецификации, TryExec это:
Имея это в виду, не имеет смысла выполнять его значение.
Некоторые другие проблемы - Путь и Терминал . Путь состоит из рабочего каталога, в котором запускается программа. Terminal - логическое значение, указывающее, выполняется ли программа в окне терминала. Все это может быть решено, но нет смысла изобретать велосипед, поскольку уже есть реализации спецификации. Если вы хотите реализовать Path , имейте в виду, что он
system()
порождает подпроцесс, поэтому вы не можете изменить рабочий каталог, выполнив что-то подобноеsystem("cd \047" working_directory "\047"); system(command)
. Однако вы могли бы предположительно сделать что-то вродеsystem("cd \047" working_directory "\047 && " command)
. Примечание \ 047 - одинарные кавычки (поэтому команда не разбивается на пути с пробелами).Альтернатива Python
Я краду страницу с Карло здесь , который предложил создать сценарий Python , чтобы использовать г модуля. Вот минимальный способ выполнить тот же код из оболочки без необходимости создавать файл и беспокоиться о вводе / выводе.
Затем выполните функцию запуска следующим образом:
Обратите внимание, что использование URI необязательно. Кроме того, проверка ошибок не выполняется, поэтому вы должны убедиться, что модуль запуска существует и доступен для чтения (перед его использованием), если вы хотите, чтобы ваш сценарий был надежным.
источник
awk
команда хороша. Поэтому +1awk
решение не будет работать должным образом, если команда имеет пробелы с двойным экранированием или обратную косую черту. Это ломается на это:Exec=env WINEPREFIX="/path/to/.wine" wine c:\\\\windows\\\\command\\\\start.exe /Unix /path/to/.wine/dosdevices/c:/users/Public/Рабочий\\ стол/appname.lnk
иdex
решение работает отлично.Хотя OP не спрашивал о KDE, для всех, кто работает с KDE, можно использовать следующую команду:
kioclient exec <path-to-desktop-file>
На Fedora это включено в число
kde-runtime
оборотов в минуту.источник
Вы могли бы использовать Dex .
источник
.desktop
файлов. И он может создавать.desktop
файлы, да! :-)Кажется, работает в выпуске 13.10, если exo-utils установлен (как в случае с Xubuntu).
источник
Приложение к ответу Хэмиша.
Имея скрипт deskopen, вы можете использовать ссылку на него как строку shebang в файле .desktop , так как символ комментария остается неизменным
#
. То есть, поместите это в качестве первой строки файла .desktop :Затем пометьте файл .desktop как исполняемый (например, с помощью
chmod +x whatever.desktop
), а затем вы можетеи вуаля - приложение откроется! (В комплекте с значком файла, который я указал, хотя я понятия не имею, как.)
Теперь, если вы также хотите, чтобы deskopen проходил через любые параметры командной строки, вы можете вместо этого использовать эту слегка измененную версию:
Кроме того, я пытался использовать
"#{@:2}"
вместоshift
ING, но это продолжало давать мне «плохую замену» ...источник
"${@:1}"
вместоshift
, но это требуетbash
вместо того, чтобыsh
в вашем#!
shebang. ИМХО ваш оригинальный подход к смене проще и лучшеВ настоящее время нет приложения, которое делает то, что вы описываете в архивах 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.
источник
У меня нет немедленного решения, отвечающего требованию «использования стандартной команды» , но если вы хотите минимально проанализировать
.desktop
файлы или хотите создать псевдоним Bash, то должно работать следующее:awk -F= '/Exec=/{system($2); exit}' foo.desktop
Другой подход, который может быть интересным, состоит в том, чтобы создать
binfmt-misc
метод уровня ядра, который сопоставляет.desktop
файлы (см.grep -r . /proc/sys/fs/binfmt_misc/
те шаблоны, которые вы в настоящее время включили).В конце концов, что- то где-то должно будет проанализировать
.desktop
файлы, это просто вопрос того, насколько это «стандарт / стандарт».источник
awk
а не цепьgrep
с иsed
с.Exec=
строки: /Я взял сценарий из ответа Карло, приведенного выше, и попытался улучшить его для собственного использования на рабочем столе.
Эта версия скрипта позволит вам запускать любое приложение, как если бы вы вводили его в HUD, при условии, что оно, вероятно, будет первым результатом. Он также позволяет передавать файловые аргументы для файлов .desktop, которые не поддерживают URI.
источник
При попытке протестировать эти файлы я нашел самый простой способ проверить, что DM или менеджер сеансов будет делать то, что я ожидал, - открыть окружающий каталог в браузере папок пользовательского интерфейса, а затем дважды щелкнуть, чтобы открыть их.
Если вы находитесь в командной строке:
gvfs-open .
илиgnome-open .
откроете ее в настроенной папке браузера.Функция sed не будет отражать поведение DM, включая такие странные вещи, как побеги и цитаты, где вы действительно не хотели бы альтернативного поведения. Это не командная строка, но она действительно проверяла вещи. Я также нашел настройки
Terminal=true
полезными для отладки.источник
Этот SO ответ дал мне понять: не пытайтесь выполнить файл рабочего стола, запустите файл, указанный в файле рабочего стола.
Например, выполните /home/jsmith/Desktop/x11vnc.sh
источник
(Составлено из различных других ответов здесь)
В зависимости от вашей системы и различных ошибок, которые могут или не могут существовать в вашей системе, попробуйте следующее, пока одна из них не сработает:
xdg-open program_name.desktop
exo-open program_name.desktop
gtk-launch program_name.desktop
kioclient exec program_name.desktop
dex program_name.desktop
Обратите внимание, что в системах Ubuntu ваши пусковые установки «меню пуска» доступны в
/usr/share/applications/
.В качестве примера, чтобы показать, какие из перечисленных выше команд работают или не работают в моей системе Ubuntu 14.04, вот результаты следующих вызовов для меня:
xdg-open /usr/share/applications/eclipse_for_cpp.desktop
# Сбой из-за ошибки (пытается сохранить этот файл .desktop)exo-open /usr/share/applications/eclipse_for_cpp.desktop
# Работаетgtk-launch /usr/share/applications/eclipse_for_cpp.desktop
# Сбой с "gtk-launch: нет такого приложения"kioclient exec /usr/share/applications/eclipse_for_cpp.desktop
# Работаетdex /usr/share/applications/eclipse_for_cpp.desktop
# Сбой &sudo apt install dex
не может найти пакет dexисточник
Убедитесь, что скрипт, на который указывает файл вашего рабочего стола, также является исполняемым.
Если все еще не работает. Сделайте файл рабочего стола работающим в терминале, изменив его
Terminal=true
, и поместите его в скрипт bash. Запустите скрипт, чтобы перехватить вывод ошибок. Вернитесь назад, когда ошибки будут исправлены.источник
Ответ Хэмиша великолепен, но я хотел бы предложить более простую альтернативу, с меньшим количеством задействованного трубопровода:
$(awk -F= '/^Exec/||/^TryExec/ {print $2;exit}' /usr/share/applications/firefox.desktop)
В этом случае
awk
выполняется поиск строки, начинающейся сExec
, а затем мы просто печатаем поля после этой строки, используя цикл for, и=
печатаем поле 2, т. Е. Все, что идет после этого поля. Фигурные скобки на концах команд$(...)
являются подстановкой параметров, поэтому shell будет выполнять все, что возвращает команда awk; в этом случае он возвращает фактическую команду, которая идет послеExec=
.В некоторых редких случаях может быть более одного
=
знака, что все еще возможно. Для этого я предлагаюисточник
awk
и Serg =)TryExec
, может быть, вы должны проверить свою 2-ую команду =)awk
мой выбор оружия, когда дело доходит до обработки текста. Кроме того, его синтаксис близок кC
. Да, и уже добавилиTryExec
часть ^ _ ^%f
,%u
,%U
или что - то подобное за команду?