Xdg open что такое
Используйте xdg-open, чтобы открыть URL с новым процессом
Странно, это работает так из коробки на моем Debian. Попробуйте запустить его в фоновом режиме:
Вы можете превратить это в функцию, добавив следующие строки в ваш
Затем вы можете просто запустить, open http://www.google.com и он будет работать в фоновом режиме.
Можно создать псевдоним для этого. Мне нравится detach более, так nohup как по умолчанию закрывает stdin stdout и stderr, поэтому его вызов будет чище.
xdg-open ждет завершения программы Это по замыслу. Если программа является программой текстового режима, она должна оставаться на переднем плане в терминале. Даже если программа с графическим интерфейсом, это поведение полезно в том случае, если xdg-open используется из сценария, и сценарий хочет выполнить что-то после того, как файл был отредактирован (например, отправить новую версию куда-нибудь или иным образом сделать что-то с новой версией).
Если вы не хотите ждать, бегите xdg-open в фоновом режиме. Вы можете запустить любую команду оболочки в фоновом режиме, поставив в конце амперсанд.
С некоторыми программами xdg-open возвращается сразу. На самом деле происходит то, что xdg-open вызывающая программа немедленно возвращается. Обычно это происходит с программами с графическим интерфейсом, которые открывают все файлы в одном экземпляре: когда вы запускаете их второй раз, они посылают сообщение запущенному экземпляру, чтобы сообщить ему об открытии файла, и немедленно завершают работу.
Default applications (Русский)
Зачем нужны типы MIME: Благодаря им программа «узнает», как поступить с некоторым файлом, например есть файл с расширением .pdf ОС должна «знать», чем открыть и как поступить с данным файлом. Как раз типы MIME сообщают ОС об этом.
Существует множество приложений,способных обрабатывать данные одного определенного типа, поэтому пользователи и даже некоторые пакеты собирают списки приложений по умолчанию для каждого #типа MIME. Хотя изначально Arch Linux не определяет приложения по умолчанию, окружение рабочего стола может это сделать. Также некоторые окружения рабочего стола предоставляют графический интерфейс или файловый менеджер, которые могут интерактивно настраивать приложения по умолчанию. Если вы не используете окружение рабочего стола, вам может потребоваться установить дополнительное программное обеспечение для удобного управления приложениями по умолчанию.
Contents
Типы MIME
Перед установкой приложения по умолчанию для каждого типа файла, тип файла должен быть обнаружен. Существует два распространенных способа проверить это:
База данных MIME
Файлы в /usr/share/mime/ не должны редактироваться напрямую, однако их можно сохранить в отдельную базу данных для каждого пользователя в
Новый тип MIME
This article or section needs expansion.
В этом примере определяется новый тип MIME application/x-foobar и присваивается любому файлу с расширением .foo. Просто создайте следующий файл:
А затем обновите базу данных MIME
Конечно, это никак не повлияет, если ярлыки приложения не связаны с типом MIME. Вам может потребоваться создать новые #Ярлыки приложений или отредактировать #mimeapps.list.
Ярлыки приложений
Файлы в /usr/share/applications/ не должны редактироваться напрямую, можно поддерживать отдельную базу данных для каждого пользователя в
Установка приложений по умолчанию
Настройка приложений по умолчанию зависит от используемого лаунчера. К сожалению, существует несколько несовместимых стандартов, и многие программы даже имеют свои собственные форматы.
Наиболее распространенные стандарты описаны ниже для ручного редактирования. Также существует несколько #Утилит, которые могут сделать работу, которая может или не может реализовать следующие стандарты.
Переменные окружения
Стандарт XDG
/.config/mimeapps.list
/.local/share/applications/mimeapps.list
/usr/share/applications/mimeapps.list
/.config/mimeapps.list при записи в него, что приведет к поломке любых символических/жестких ссылок.
Формат
Рассмотрим следующий пример:
Каждый раздел назначает один или несколько ярлыков приложений типам MIME.
Каждый раздел является необязательным и может быть опущен, если он не нужен.
mailcap
The factual accuracy of this article or section is disputed.
Формат mailcap(4) [устаревшая ссылка 2020-05-22] используется почтовыми программами, такими как mutt и sylpheed для открытия нетекстовых файлов. Чтобы эти программы использовали xdg-open, отредактируйте
Утилиты
Хотя можно настроить приложения по умолчанию и типы MIME путем прямого редактирования #mimeapps.list и #База данных MIME, существует множество инструментов, которые могут упростить процесс. Эти инструменты также важны, поскольку приложения могут делегировать открытие файлов этими инструментами, а не пытаться реализовать стандарт типа MIME.
Если вы используете окружение рабочего стола, вы должны сначала проверить, предоставляет ли он свою собственную утилиту. Она должна быть предпочтительнее этих альтернатив.
xdg-utils
Альтернативы xdg-open
perl-file-mimeinfo
Самое главное, что приложения #xdg-utils на самом деле вызывают mimetype вместо file для обнаружения типа MIME, если он не обнаруживает ваше окружение рабочего стола. Это важно, потому что file не следует за стандартом XDG.
mimeo
Однако большая разница с xdg-utils заключается в том, что mimeo также поддерживает пользовательские «файлы ассоциаций», которые допускают более сложные ассоциации. Например, передача определенных аргументов командной строки на основе регулярного выражения соответствует:
xdg-utils-mimeo AUR исправляет xdg-utils так что xdg-open возвращается в mimeo, если окружение рабочего стола не обнаружено.
whippet
В дополнение к стандарту #mimeapps.list, whippet также может использовать базу данных SQlite ассоциаций весового приложения/типа MIME/регулярных выражений для определения, какое приложение использовать.
Собственные замены
Пакет | Особенности |
---|---|
linopen AUR | Разрешает правила регулярного выражения, может указывать запасное приложение для открывания файлов |
mimi-git AUR | Может изменять аргументы команды для каждого типа MIME |
busking-git AUR | Аналогично mimi, но при этом поддерживает правила регулярных выражений |
sx-open AUR | Использует простой конфигурационный файл на основе оболочки пользователя (shell) |
lsdesktopf
lsdesktopf AUR предоставляет несколько способов поиска в базе данных MIME и ярлыков MIME на рабочем столе.
Решение проблем
Если файл не открывается вашим желаемым приложением по умолчанию, существует несколько возможных причин. Вам может потребоваться проверить каждый случай.
Для связывания приложений с типами MIME требуются ярлыки приложений. Убедитесь, что такая запись существует и может использоваться для открытия (вручную) файлов в приложении.
Отсутствует ассоциация
Нет приложения по умолчанию
Если ярлык приложения связан с типом MIME, его просто нельзя установить как значение по умолчанию. Измените #mimeapps.list, чтобы установить связь по умолчанию.
Нестандартная ассоциация
Приложения могут игнорировать или частично реализовывать стандарт XDG. Проверьте использование устаревших файлов, таких как
This article or section needs expansion.
Окружения рабочего стола и файловые менеджеры, поддерживающие программы запуска спецификаций в соответствии с определением в файлах .desktop. Смотрите раздел Ярлыки приложений#Ярлык приложения.
Это может произойти, например, если в переменной Exec отсутствуют внутренние параметры, необходимые для открытия файла или того, как приложение отображается в меню. Переменная Exec обычно начинается с % ; чтобы узнать поддерживаемые параметры в настоящее время смотрите exec-переменные.
В следующей таблице перечислены основные записи переменных файлов .desktop которые влияют на запуск приложения, если у него есть тип MIME, связанный с ним.
Автоматический вход в Lync конференции в Linux
Для меня эта фраза сродни hello world, так как я добрался наконец до своей первой публикации. Долго откладывал этот замечательный момент, так как и писать было не о чем, а обсасывать то, что уже по куче раз обсосано, тоже не хотелось. Вообще для своей первой публикации хотелось что-то оригинальное, полезное другим и содержащее какой-то челленж и решение проблем. И вот я уже могу поделиться этим. Теперь обо всем по порядку.
Вступление
Началось все с того, что некоторое время назад я на рабочем компе накатил себе Linux Mint. Многие наверняка знают, что Pidgin с плагином Sipe вполне годная замена Microsoft Lync (сейчас называется Skype for business) для Linux систем. В силу специфики работы мне часто приходится участвовать в sip-конференциях, и в бытность виндузятника вход в конференции был элементарным: получаем приглашение по почте, кликаем на ссылку входа, готово мы внутри.
При переходе на темную сторону Linux все несколько усложнилось: вход в конференции в Pidgin конечно же тоже есть, но там для этого нужно в свойствах вашего sip-аккаунта выбрать пункт присоединения к конференции в меню и в открывшемся окне вставить ссылку на конференцию либо ввести имя организатора и conf id. И через какое-то время я начал задумываться: «а нельзя ли как-то это упростить». Ага, скажете вы, на кой черт тебе это понадобилось, сидел бы себе на винде и в ус не дул.
Шаг 1. Исследование
«Втемяшится в башку какая блажь — колом ее оттудова не выбьешь» — так говорил Некрасов в своем произведении «Кому на Руси жить хорошо».
Итак, раз уж мысль попала в голову, то через какое-то время возникла и первая идея для реализации. Казалось все просто — нужно перехватывать обращение к ссылкам meet.company.com/user/confid — поставить у себя на тачке локальный процесс веб-приложения на 127.0.0.1 и в /etc/hosts занести статическую запись для домена компании, через который производится вход в конференции, указывающий на localhost. Дальше этот веб-сервер должен обработать пришедшую ему ссылку и как-то передать внутрь Pidgin (сразу скажу, что на этом этапе у меня не было еще понимания как мне это ему вообще отдать). Решение конечно попахивает костылями, но мы же программисты, костыли нас не пугают (щютка).
Потом случайно я как-то открыл ссылку на приглашение в Google Chrome (а обычно я всегда использую Mozilla Firefox). И на мое удивление веб-страничка выглядела совсем иначе — не было формы ввода пользовательских данных и сразу после входа на страницу выходил запрос на открытие чего-то через xdg-open. Ради интереса нажимаю «да» и выходит сообщение об ошибке — ссылка lync15:confjoin?url=https://meet.company.com/user/confid не может быть открыта. Хмм. Что это за xdg-open такой и что ему нужно для того, чтобы такие ссылки открывались? Вскрытие чтение документации показало, что это обработчик графической оболочки, который помогает запускать ассоциированные приложения либо с протоколами для uri scheme, либо с определенными типами файлов. Ассоциации настраиваются через сопоставление mime-type. Итак, мы видим, что у нас запускается поиск сопоставленного приложения для uri scheme с именем lync15 и ссылка передается в xdg-open, который дальше по идее должен передать ее какому-то приложению, которое отвечает за данный тип ссылок. Которого у нас, конечно, в системе нет. А раз нет, то как поступают в мире опенсорса? Правильно, мы напишем его сами.
запускаю xdg-open из консоли с передачей той же ссылки, какая идет из браузера и… облом. Снова говорит что не может обработать ссылку.
Как оказалось я не обновил каталог ассоциированных mime-type с моим приложением. Делается это простой командой:
которая просто редактирует файл
Попытка номер 2 с вызовом xdg-open — и снова неудача. Ничего, трудности нас не пугают, а только подогревают интерес. И вооружившись всей мощью баша (т.е. трассировкой) ныряем с головой в отладку. Тут важно отметить, что xdg-open является просто шелл-скриптом.
Анализируя вывод после трассировки становится немного понятно, что дальше управление передается в exo-open. А это уже бинарный файл и разбираться почему он возвращает неуспешный код возврата при передаче ему ссылки в аргументе уже сложнее.
Пробежав по внутренностям xdg-open я выяснил, что он анализирует разные параметры окружения и передает управление дальше либо каким-то инструментам для открывания файлов\ссылок специфичных для конкретного DE, либо у него имеется fallback в виде функции open_generic
Быстро впиливаю сюда небольшой хак с анализом переданного аргумента и если там находится наша специфическая подстрока lync15:, то передаем сразу управление в функцию open_generic.
Попытка номер 3 и вы думаете заработало? Ага, сейчас, как же. Но сообщение об ошибке уже поменялось, это уже прогресс — сейчас он мне говорил что файл не найден и в виде файла писал мне ту самую ссылку, переданную в виде аргумента.
На этот раз дело оказалось в функции is_file_url_or_path, которая анализирует передана на вход ссылка на файл file:// либо путь до файла или что-то иное. И проверка не работала верно из-за того что наш префикс (url scheme) имеет цифры, а регулярное выражение проверяется только набор символов, состоящий из :alpha: точки и тире. После консультация со стандартом rfc3986 для uniform resource identifier стало понятно что на этот раз Майкрософт ничего не нарушает (хотя у меня была такая версия). Просто класс символов :alpha: содержит только буквы латинского алфавита. Быстро меняю проверку по регулярке на alphanumeric. Готово, вы восхитительны, все наконец запускается, управление после всех проверок отдается в наш скрипт-приложение, на консоль выводится наша ссылка, все как полагается. После этого начинаю подозревать, что все проблемы у exo-open тоже из-за валидации формата ссылки из-за цифр в схеме. Для проверки гипотезы меняю регистрацию mime-type у приложения на просто схему lync и вуаля — все работает и без переопределения функции open_xfce. Но нам это никак не поможет, потому что веб-страница для входа в конференцию создает именно ссылку с lync15.
Итак, первая часть пути пройдена. Мы умеем перехватывать вызов ссылки и дальше ее нужно как-то обработать и передать внутрь Pidgin. Для того чтобы понять как оно работает внутри при вводе данных по ссылке в меню «присоединения к конференции» я склонировал гит репозиторий проекта Sipe и приготовился снова нырять в код. Но тут меня к счастью привлекли скрипты в каталоге contrib/dbus/:
Шаг 2. Реализация обработчика для автоджойна
Раз уж есть готовые примеры на перл, то я решил просто использовать sipe-join-conference-with-uri.pl и немного доработать под себя. Писать на перл я умею, поэтому особых сложностей это не доставило.
После тестирования скрипта отдельно, я вписал его вызов в файл lync.desktop. И это была победа! При входе на страницу присоединения к конференции и разрешения запуска xdg-open всплывающее окно конференции из Pidgin открывалось автоматически. Как же я ликовал.
Воодушевленный успехом, я решил сделать то же самое и для своего основного браузера Mozilla Firefox. При входе через лису открывается страничка для авторизации и еще в самом низу есть кнопка join using office communicator. Она-то и привлекла мое внимание. При клике на нее в браузере происходит переход по адресу:
на что он мне любезно говорит, что не знает как ее открыть и, возможно, у меня нет ассоциированного приложения для такого протокола. Ну это мы уже проходили.
Быстренько регистрирую свое приложение-скрипт еще и для uri-схемы conf и… ничего не происходит. Браузер продолжает жаловаться, что нет приложения, которое обрабатывает мои ссылки. При этом вызов из консоли xdg-open с параметрами работает превосходно.
«Set custom protocol handler in firefox» — с этим вопросом я вышел в Интернет. Прошерстив несколько обсуждений на stackoverflow (а куда же без него), вроде ответ нашелся. Нужно создать специальный параметр в about:config (конечно заменив foo на conf):
Создаем, открываем ссылку и… не тут-то было. Браузер как ни в чем ни бывало говорит что не знает наше приложение.
Читаю официальную документацию по регистрации протокола у Mozilla, есть вариант прописать асоциации в самом gnome desktop (заменив конечно foo на conf):
Регистрирую, открываю браузер… и снова борода.
Тут на глаза попадается строчка из документации:
Next time you click a link of protocol-type foo you will be asked which application to open it with.
— Семен Семеныч
— Ааа
Мы же не кликаем по ссылке, а просто веб-страница делает смену window.location через javascript. Пишу простой html файл со ссылкой на conf протокол, открываю в браузере, кликаю по ссылке — Yos! Открывается окно с вопросом в каком приложении нужно открыть нашу ссылку и там в списке у нас уже есть наше приложение Lync — мы же его честно зарегистрировали всеми возможными способами. Там же в окошке есть галочка «запомнить выбор и всегда открывать ссылки в нашем приложении», отмечаем, нажимаем ок. И это вторая победа — окно конференции открывается. При этом уже открытие конференций работает и не только при клике на ссылку, а и при переходе из нужной нам страницы присоединения в конференцию.
Потом я проверил, удаление параметров network.protocol-handler.expose.conf никак не повляло на работу протокола в лисе. Ссылки продолжали работать.
Заключение
Я залил все свои наработки в репозиторий на гитхаб, ссылки на все ресурсы будут в конце статьи.
Мне будет интересно получить обратную связь от тех кто захочет воспользоваться моими наработками. Сразу отмечу, что я все делал разработку только под свою систему Linux Mint, поэтому какие-то другие дистрибутивы или десктопы могут не заработать в том варианте. Вернее я даже почти уверен в этом, потому что я пропатчил в xdg-open только 1 функцию, относящуюся только к моему DE. Если вы захотите добавить поддержку других систем или декстопов, пишите мне пул-реквесты в гитхабе.
Русские Блоги
Используйте команду xdg-open для эффективного открытия файлов в Ubuntu
Оригинальный текст впервые был опубликован на личном сайте:Спасаться бегством
Публичный номер: [DreamHub]
Как правило, вы можете использовать команды для управления различными текстовыми файлами в терминале. Но если вам нужно манипулировать некоторыми нетекстовыми файлами, такими как pdf , doc И т.д. Обычная практика:
Проблема с этим методом заключается в том, что он громоздок и неэффективен в использовании, особенно когда путь к файлу глубокий и в нескольких папках много файлов. Итак, как я могу повысить свою операционную эффективность?
В этой статье представлены три разных подхода, которые вы можете выбрать в соответствии со своими потребностями:
Метод 1: управление файлами nautilus
После открытия файлового менеджера дважды щелкните мышью, чтобы открыть целевой файл.
Метод 2: откройте команду напрямую
Большинство программ можно вызвать из командной строки для запуска, поэтому непосредственно вызывайте соответствующее приложение, чтобы открыть соответствующий файл. Например
Метод 3: xdg-open
Сравните два вышеуказанных метода:
Итак, вот лучшие xdg-open команда! Вам не нужно использовать два вышеуказанных метода!
установка
использование
xdg-open Использование очень простое. Просто передайте параметры прямо в файл, который нужно открыть, что эквивалентно двойному щелчку мыши для открытия. Система автоматически вызовет соответствующую программу в соответствии с типом файла, например
Если вы укажете путь, используйте файловый менеджер, чтобы открыть
Вы также можете передать URL
Если вы чувствуете, что команда длиннее, чтобы было удобнее, вы можете подумать о добавлении чего-то, что вам подходит. alias :
Всё как у больших. Автозагрузка приложений в оконных менеджерах linux
Как-то раз, листая сообщения в профильном systemd чате, в телеграм, я наткнулся на следующий кусок man systemd.special …
Переменные XDG, freedesktop.org, desktop-файлы и autostart
Пользователям полноценных линуксовых графических окружений (KDE, Gnome, Mate etc) прекрасно известна возможность автозапуска приложений при логине пользователя в систему, разработанную инициативной группой Freedesktop.org (ранее X Desktop Group, или XDG), подобная той, что существует, например, в Windows. Данный функционал обеспечивается обычными *.desktop файлами, но лежащими по определённым путям:
Если в этих переменных семейства XDG directories не указано иное, или эти переменные отсутствуют (так происходит в большинстве классических дистрибутивов, привет NixOS!), будут использованы значения по умолчанию.
Итак, с директориями определились. Файлы в них можно:
Всё хорошо. Одно плохо. Это не работает, как минимум, в Leftwm, Spectrwm, xmonad, bspwm, dwm (без патчей точно) и, разумеется, в любимом i3wm. Просто потому, что у них отсутствует session manager. И вот тут мы переходим к самому интересному. Встречайте! systemd!
Systemd как спасательный круг тайловых (и не очень) оконных менеджеров
Эта глава будет самой объёмной. Тут мы разберёмся кто и как может помочь разобрать залежи desktop файлов, кто, как и когда их запустит, и при чём тут вообще systemd. Поехали!
▍ Developers, developers, developers! Генераторы, генераторы, генераторы!
Systemd, как известно, это не только система инициализации, логгирования событий, но и набор готовых дополнительных утилит, готовых сервисов с их юнитами, система управления сетью, and more… Среди прочего systemd может выступать в качестве системного менеджера для пользовательских сервисов — юнитов, работающих в пространстве пользователя. То есть после логина пользователя в систему запускается ещё один экземпляр /usr/lib/systemd только уже от пользователя и позволяет запускать юниты в пространстве пользователя, с наследованием его окружения и правами.
Всё хорошо и замечательно, но есть одно но. Если есть сервисы, их должен кто-то вовремя запустить. То есть запустить ровно тогда, когда будет запущена графическая оболочка… Если посмотреть, произвольный такой юнит, мы увидим там упоминание target-а graphical-session.target (Юнит на основе десктоп файла апплета управления Bluetooth cat /run/user/1000/systemd/generator.late/app-blueman@autostart.service ):
И что же со всем этим делать и как быть? Как получить заветный target?
▍ Графическая оболочка тоже сервис. Подсматриваем в Gnome
Ладно, чёрт с ним, идём смотреть в *.desktop файл xsessions( cat /usr/share/xsessions/gnome.desktop )…
… и понимаем, что попали несколько серьёзнее чем хотелось бы и что гном, в данном случае, нам мало чем поможет. Он изначально заточен под работу с systemd. Идём в эти наши интернеты.
▍ Выходим на финишную прямую. Пишем враппер, юнит и наконец удачно стартуем
Не буду затягивать и утомлять читателя подробностями того, как и где приходилось выуживать информацию по крупицам. Это были и маны и ArchWiki и чёрт его знает что ещё. Лучше сразу приведу готовые, в меру откомментированные файлы.
Итак, копируем дефолтный /usr/share/xsessions/i3.desktop в /usr/share/xsessions/i3-systemd.desktop и немного модифицируем.
Теперь нам нужно написать враппер i3-service который будет подготавливать окружение и запускать i3wm в качестве сервиса. Ну и, разумеется, сам i3.service файл тоже должен быть написан. Итак враппер /usr/local/bin/i3-service :
Ну и наконец вишенка на нашем торте, сам /etc/systemd/user/i3.service :
Что в итоге?
Ну и вообще, приятно быть первооткрывателем. Ибо в процессе гугления и чтения манов, готового рецепта обнаружено не было. Так что любители wm, не относящиеся к systemd хейтерам. Пробуйте. За месяц использования был замечен ровно один косяк. Не работает gvgs-* функционал в pcman-fm, если его запустить хоткеем из i3 Но если запустить из rofi, волшебным образом всё начинает работать. Возможно я забыл импортировать какую-то переменную в d-bus Ну и, чтоб не копипастить, ссылка на гитхаб.