Выход из пробелов в .desktop Исполнительной строке файла с “ударом-c”

У меня есть файл на рабочем столе для приложения 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 перенаправлять в файл.

0
задан 8 November 2019 в 18:49

1 ответ

Можно передать %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.
1
ответ дан 22 December 2019 в 00:03

Другие вопросы по тегам:

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