У меня есть файл на рабочем столе для приложения GTK, которое я создал, который имеет следующую структуру:
[Desktop Entry]
Version=1.0
Name=My GTK Application
Comment=Desktop File
Exec=bash -c 'sudo taskset -c 6 /home/user_name/path/to/app/./executable %f 2>> /home/user_name/path/to/app/LogFiles/stderr.log'
Icon=/home/user_name/path/to/app/Images/icon.png
Terminal=false
Type=Application
Categories=Utility;Application;
MimeType=application/x-myapp;
Name[en_US]=GTK Application
Как Вы видите, у меня есть связь типа пантомимы с приложением, таким образом, что по файлам с надлежащим расширением можно дважды щелкнуть и открыть в приложении. Полный путь файла передается как параметр командной строки и приложение (записанный в C) получения argv[1]
(когда это не является ПУСТЫМ), и использование, что для открытия файла. Проблема состоит в том, что это перестало работать, когда существует пробел в имени файла. Исходная Исполнительная строка, которую я имел, была просто:
Exec=sudo taskset -c 6 /home/user_name/path/to/app/./executable
Так как я не пытался перенаправить stderr к файлу журнала. С этой исполнительной строкой мне не было нужно %f
на строке для программы C для захвата argv[1]
и имена файлов с пробелом не были проблемой. Я нашел, что перенаправление stderr на Исполнительной строке только работало, когда я использовал bash -c
, который согласно странице справочника, "выполняет команды от строки". Теперь я не могу получить файл если %f
используется, но это перестало работать, когда существует пробел в имени файла. Я попытался использовать одинарные кавычки, двойные кавычки и бесконечную комбинацию других вещей напрасно. Я знаю о двух обходных решениях для этого: (1) у меня могла быть Исполнительная строка, выполняют сценарий вместо этого, или (2) если я использую %F
вместо этого, затем все части имени файла передаются argv[2], argv[3]
и так далее, в зависимости от количества пробелов в имени файла. Я должен был бы затем просто использовать argc[]
и цикл до получения весь из argv[]
связать все назад вместе в фактическое имя файла. Ни одна из этих опций не кажется красноречивой. Должен быть лучший способ, которым я отсутствую. Если существует способ перенаправить stderr без bash -c
, это могло бы быть решением. Или возможно существует команда удара как sed
или tee
это может использоваться? В основном я просто хочу Исполнительную строку ТОЛЬКО, которая получит имя файла с пробелом в argv[1]
и все еще позвольте stderr перенаправлять в файл.
Можно передать %f
аргумент как позиционный параметр к оболочке путем размещения его после командной строки и кавычки он в командной строке обычным способом.
Напр.
Exec=sh -c 'somecommand "$1" 2>> /path/to/stderr.log' sh %f
Эта техника даже работает с %F многофайловым заполнителем:
Exec=sh -c 'somecommand "$@" 2>> /path/to/stderr.log' sh %F
Я использую sh
нет bash
здесь с тех пор, кажется, нет ничего определенного для удара относительно Вашей команды, однако то же применяется в bash
:
-c If the -c option is present, then commands are read from the
first non-option argument command_string. If there are argu‐
ments after the command_string, the first argument is
assigned to $0 and any remaining arguments are assigned to
the positional parameters. The assignment to $0 sets the
name of the shell, which is used in warning and error mes‐
sages.