Почему файлы freedesktop .desktop не допускают относительных путей?

ПОЖАЛУЙСТА, не используйте регулярные выражения для работы с XML. Спецификация XML допускает множество вещей, которые просто плохо сочетаются с синтаксическим анализом на основе регулярных выражений.

Это ОЧЕНЬ ПЛОХАЯ ИДЕЯ, потому что вы создаете хрупкий код.Однажды исходный XML, который вы используете, может просто измениться на что-то другое, совершенно корректное (в том, что касается спецификации XML), и ваш нисходящий скрипт перестановки сломается.

Это именно то, что очень огорчает системных администраторов и программистов по техническому обслуживанию.

ПОЖАЛУЙСТА, используйте синтаксический анализатор XML. xmlstarlet - один из вариантов. И perl , и python также имеют параметры синтаксического анализа. Обе эти вещи обрабатывают странные случаи в XML (например, перенос строк, красивую печать и т. Д.) И гарантируют, что ваш исходящий XML действителен - важно выводить действительный XML, потому что недопустимый XML предполагается как фатальный условие.

В частности, удаление атрибута из вашего элемента HELLO :

#!/usr/bin/env perl
use strict;
use warnings;

use XML::Twig;

my $twig = XML::Twig -> new ( 'pretty_print' => 'indented_a' ) -> parse ( \*DATA );

foreach my $hello ( $twig -> findnodes ('//HELLO') ) {
    $hello -> del_att('xmlns:xsi');
}
$twig -> print;

__DATA__
<HELLO version="4.2" xmlns="http://www.bacd.org/HELLO-4_2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.bacd.org/HELLO-4_2 http://www.bacd.org/v4-2/hello-4-2.xsd">


    <!-- some data here  -->

</HELLO>

Примечание. Я «довольно напечатал» результат:

<HELLO
    version="4.2"
    xmlns="http://www.bacd.org/HELLO-4_2"
    xsi:schemaLocation="http://www.bacd.org/HELLO-4_2 http://www.bacd.org/v4-2/hello-4-2.xsd">
    <!-- some data here  -->
</HELLO>

Чтобы дать нам один пример того, почему синтаксический анализ на основе регулярных выражений является плохая идея - потому что это правильный XML.

Так и есть:

<HELLO version="4.2" xmlns="http://www.bacd.org/HELLO-4_2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.bacd.org/HELLO-4_2 http://www.bacd.org/v4-2/hello-4-2.xsd">
    <!-- some data here  -->
</HELLO>

И:

<HELLO
version="4.2"
xmlns="http://www.bacd.org/HELLO-4_2"
xsi:schemaLocation="http://www.bacd.org/HELLO-4_2 http://www.bacd.org/v4-2/hello-4-2.xsd"
>
    <!-- some data here  -->
</HELLO>

И:

<HELLO version="4.2" xmlns="http://www.bacd.org/HELLO-4_2" xsi:schemaLocation="http://www.bacd.org/HELLO-4_2 http://www.bacd.org/v4-2/hello-4-2.xsd"><!-- some data here  --></HELLO>

Но синтаксические анализаторы XML просты и удобны в использовании.

Чтобы упростить ваш код в один лайнер, например sed:

perl -0777 -MXML::Twig -e 'XML::Twig -> new ( pretty_print => "indented_a", twig_handlers => { "HELLO" => sub { $_ -> del_att("xmlns:xsi") }} ) -> parse ( <> ) -> print;'

Должно работать, если данные передаются на STDIN или через указание имени файла.

2
08.03.2018, 12:39
4 ответа

Para apreciar la situación, pregúntese: "¿Relativo a qué?". Los archivos .desktopson ​​para uso dentro de contextos GUI, para los cuales no se puede asumir ninguna ruta base sobre la cual construir una ruta absoluta a partir de cualquier ruta relativa que podría considerar colocar en el archivo .desktop.

Las rutas relativas solo son útiles cuando se pueden convertir a una ubicación definida (la ruta absoluta ), y eso requiere un punto de referencia. que no se puede asumir en ningún contexto de GUI genérico.

-3
27.01.2020, 22:18

Вы можете использовать встроенный сценарий оболочки для вычисления пути:

Exec=sh -e -c "exec \\"\\$(dirname \\"\\$0\\")/some_app\\"" %k

Да, требуется два уровня побега.

3
27.01.2020, 22:18

Для поля Execя предполагаю, что причина в том, что не очевидно, какой путь следует использовать в качестве базы. Например, вы ожидаете относительности к местоположению файла *.desktop, но я ожидаю относительности к значению Path. И эта двусмысленность может привести к ошибкам. Кроме того, Pathне является обязательным полем, поэтому становится сложнее, что должно произойти, когда Execполучил относительный путь, а Pathне определен. Более удобно вообще не поддерживать относительные пути и ожидать только абсолютные пути и двоичные файлы в каталогах %PATH%.

За Iconполе трактуется по-своему:

Icon to display in file manager, menus, etc. If the name is an absolute path, the given file will be used. If the name is not an absolute path, the algorithm described in the Icon Theme Specification will be used to locate the icon.

Между прочим, они (standards.freedesktop.org)не говорят о поддержке относительных путей, но на самом деле кажется, что *.desktopфайлы поддерживают это.

Если вы напишете ./перед именем файла -, исполняемый файл будет запущен в папке Path.

[Desktop Entry]
Name=TheApp
Type=Application
Path=/usr/lib/TheApp
Exec=./TheAppExecutable
1
27.01.2020, 22:18

Мне нужен был путь относительно домашнего каталога в моем firefox.desktop. Так что каждый пользователь получает свой собственный профиль firefox -запущенный, т.е. firefox-frankсидит в ~/Documents/...ака/home/frank/Documents/...

А это строка Exec -, которая работает:(благодаря ответу @timothy -baldwin выше)

Exec=sh -e -c "/usr/bin/firefox -profile \"/home/$(whoami)/Documents/chrome-profiles/firefox-$(whoami)\""
1
02.01.2021, 20:17

Теги

Похожие вопросы