Получение текущего пути в .desktop команде EXEC

Что Вы видите, что что-то не делается право (Человеческая ошибка). Пример: Я создал файл с vi, Вы будете видеть что в = mt:

truss -v lstat -t lstat ls -l count_files.awk
lstat64("count_files.awk", 0xFFBFF5B8)          = 0
    d=0x04010003 i=58647 m=0100755 l=1  u=0     g=0     sz=674
        at = Feb 20 14:05:56 CET 2013  [ 1361365556.951290423 ]
        mt = Feb 20 14:05:58 CET 2013  [ 1361365558.532478282 ]
        ct = Feb 20 14:05:58 CET 2013  [ 1361365558.532478282 ]
    bsz=1024  blks=3     fs=zfs
-rwxr-xr-x   1 root     root         674 Feb 20 14:05 count_files.awk

Теперь я открою файл снова с vi, но выходом, делающим: q!

Заметьте, что в не равно mt.

truss -v lstat -t lstat ls -l count_files.awk
lstat64("count_files.awk", 0xFFBFF648)          = 0
    d=0x04010003 i=58647 m=0100755 l=1  u=0     g=0     sz=674
        at = Feb 20 14:07:58 CET 2013  [ 1361365678.550493967 ]
        mt = Feb 20 14:05:58 CET 2013  [ 1361365558.532478282 ]
        ct = Feb 20 14:05:58 CET 2013  [ 1361365558.532478282 ]
    bsz=1024  blks=3     fs=zfs
-rwxr-xr-x   1 root     root         674 Feb 20 14:05 count_files.awk

Теперь давайте сделаем все еще другой тест: Откройте файл с vi и выходом, но вместо: q! позволяет сделайте: wq! (хотя мы не изменились, что-либо, vi все еще сохранит содержание в файл),

truss -v lstat -t lstat ls -l count_files.awk
lstat64("count_files.awk", 0xFFBFF5F8)          = 0
    d=0x04010003 i=58647 m=0100755 l=1  u=0     g=0     sz=674
        at = Feb 20 14:09:26 CET 2013  [ 1361365766.879205630 ]
        mt = Feb 20 14:09:28 CET 2013  [ 1361365768.147368630 ]
        ct = Feb 20 14:09:28 CET 2013  [ 1361365768.147368630 ]
    bsz=1024  blks=3     fs=zfs
-rwxr-xr-x   1 root     root         674 Feb 20 14:09 count_files.awk

Насколько я знаю в изменениях времени, когда считанный назван и измененное время, когда запись сделана (запишите вызов).

6
30.04.2018, 07:10
4 ответа
[

] Согласно [] Desktop Entry Specification[]:[

] [
] [

]Коды полей не должны использоваться внутри цитируемого аргумента[

] [
] [

] Следовательно, ваш []%k[] дается буквально команде []bash[]. Изменение строки []Exec[] на следующую позволяет избежать этого:[

] [
Exec=bash -c '"$(dirname "$1")"/run.sh' dummy %k
] [

]Вышеуказанное работает локально, а также работает, если в пути есть пробел. Для скрипта []манекену [] присвоено значение []bash[] как его []$0[] (то, что он думает название скрипта), а расширение []%k[] доступно в виде []$1[]. Вложенные слои цитирования необходимы, чтобы соответствовать спецификации и не занимать место.[

] [

] Обратите внимание, что []%k[] не обязательно расширяется до локального пути к файлу - это может быть URI папки, или пустой, и действительно портативный скрипт должен учитывать и эти случаи. []%k[] также не является универсально поддерживаемым, так что Вам нужно будет иметь некоторые ограничения на системы, на которых Вы ожидаете его использовать в любом случае.[

] [
] [

]Что касается отладки, Вы можете использовать обычную оболочку перенаправления под KDE:[

] [
Exec=bash -c ... > /tmp/desktop.log
] [

]Это не стандартизированное поведение, и оно не работает под GNOME и, вероятно, другими операционными системами. Вы также можете указать абсолютный путь к скрипту, созданному для регистрации его аргументов и действий так, как Вам нужно.[

].
6
27.01.2020, 20:27

Если скрипт находится в той же директории, что и файл .desktop, просто используйте относительные пути. Нет причин возиться с bash -c или модифицировать ваш $PATH и тем более dirname:

[Desktop Entry]
Type=Application
Terminal=true
Name=RunMe
Exec=./run.sh

Пока ваш run.sh находится в том же каталоге, что и файл .desktop и имеет правильную строку shebang:

#!/usr/bin/env bash

Он должен работать где угодно. Использование #!/usr/bin/env bash вместо #!/bin/bash гарантирует, что какая бы из bash не находилась в пользовательском $PATH будет использована и сделает ваш скрипт полностью портативным.


ПРИМЕЧАНИЕ: @MichaelHomer указал в комментариях на то, что относительные пути работают не во всех средах рабочего стола. Я попробовал это на Cinnamon, и это работало, как и ожидалось, поэтому, предположительно, это должно работать и на других средах на базе Gnome. Похоже, что спецификации freedesktop.org предполагают использование полного пути:

Ключ Exec должен содержать командную строку. Командная строка состоит из исполняемой программы с одним или несколькими аргументами. Исполняемая программа может быть указана либо полным путем, либо только именем исполняемого файла. Если полный путь не указан, то исполняемый файл просматривается в переменной окружения $PATH, используемой окружением рабочего стола. Имя или путь исполняемой программы может не содержать знака равенства ("="). Аргументы разделяются пробелом.

1
27.01.2020, 20:27

Способ запуска программы (здесь представлен bash-скрипт, но он может быть адаптирован для любой другой программы ), которая имеет путь относительно родительского каталога файла.desktop (, проверенного на Gnome, KDE, Xfce, LXDE, LXQt, MATE, Cinnamon, Budgieсреды рабочего стола):

Гном:

Exec=gnome-terminal -e "bash -c 'cd \"$(dirname "\"%k\"")\"; bash "./relative_file_path.sh" parameter1 parameterN'"

Гном -новее:

Exec=gnome-terminal -- bash -c 'cd \"$(dirname "\"%k\"")\"; bash "./relative_file_path.sh" parameter1 parameterN'

КДЕ:

Exec=konsole -e "bash -c 'cd $(printf '"%s"' "$(dirname "%k")"); bash "./relative_file_path.sh" parameter1 parameterN'"

Xfce:

Exec=xfce4-terminal -e "bash -c 'cd \"$(dirname "\"%k\"")\"; bash "./relative_file_path.sh" parameter1 parameterN'"

LXDE:

Exec=bash -c 'cd "%k"&&bash "./relative_file_path.sh" parameter1 parameterN'

LXQt:

Exec=bash -c 'cd "%k"&&bash "./relative_file_path.sh" parameter1 parameterN'

ПОМОЩНИК:

Exec=mate-terminal -e "bash -c 'cd \"$(dirname "\"%k\"")\"; bash "./relative_file_path.sh" parameter1 parameterN'"

Корица:

Exec=gnome-terminal -e "bash -c 'cd \"$(dirname "\"%k\"")\"; bash "./relative_file_path.sh" parameter1 parameterN'"

Волнистый попугайчик:

Exec=tilix -e "bash -c 'cd \"$(dirname "\"%k\"")\"; bash "./relative_file_path.sh" parameter1 parameterN'"

Пример файла.desktop для кода Exec, показанного выше (, за исключением LXDEи LXQt-, для которых замените Terminal=falseнаTerminal=true):

[Desktop Entry]
Version=1.0
Name=Name to display
Comment=A comment
Exec=...
Icon=utilities-terminal
Terminal=false //does not show the initial launcher app (terminal) window
Type=Application
Categories=Application;

Для python3 замените bash "./relative_file_path.sh" parameter1 parameterNна python3 "./file_content_search.py" parameter1 parameterNили -для других программ замените при необходимости

0
27.01.2020, 20:27

Как указано в Спецификация ввода рабочего стола , %kили другие коды полей не должны использоваться внутри аргумента в кавычках. Однако есть способы скопировать выражение с пробелом в переменную без использования кавычек:

Exec=k=$(echo %k) && "$(dirname "$k")"/run.sh
1
19.04.2021, 15:50

Теги

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