Что Вы видите, что что-то не делается право (Человеческая ошибка). Пример: Я создал файл с 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
Насколько я знаю в изменениях времени, когда считанный назван и измененное время, когда запись сделана (запишите вызов).
] Согласно [] 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 и, вероятно, другими операционными системами. Вы также можете указать абсолютный путь к скрипту, созданному для регистрации его аргументов и действий так, как Вам нужно.[
]. Если скрипт находится в той же директории, что и файл .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, используемой окружением рабочего стола. Имя или путь исполняемой программы может не содержать знака равенства ("="). Аргументы разделяются пробелом.
Способ запуска программы (здесь представлен 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
или -для других программ замените при необходимости
Как указано в Спецификация ввода рабочего стола , %k
или другие коды полей не должны использоваться внутри аргумента в кавычках. Однако есть способы скопировать выражение с пробелом в переменную без использования кавычек:
Exec=k=$(echo %k) && "$(dirname "$k")"/run.sh