Eu tenho um arquivo de desktop para um aplicativo GTK que criei que tem a seguinte estrutura:
[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
Como você pode ver, tenho uma associação do tipo mime com o aplicativo, de modo que os arquivos com a extensão adequada podem ser clicados duas vezes e abertos no aplicativo. O caminho absoluto do arquivo é passado como um argumento de linha de comando e o aplicativo (escrito em C) captura argv[1]
(quando não é NULL) e usa isso para abrir o arquivo. O problema é que isso falha quando há espaço em branco no nome do arquivo. A linha Exec original que eu tinha era simplesmente:
Exec=sudo taskset -c 6 /home/user_name/path/to/app/./executable
Como eu não estava tentando redirecionar o stderr para um arquivo de log. Com esta linha exec, eu não precisava %f
na linha para que o programa C pegasse argv[1]
e nomes de arquivos com espaço em branco não fossem um problema. Descobri que redirecionar stderr na linha Exec só funcionava quando eu usava bash -c
, que de acordo com a página man, "executa os comandos de uma string". Agora não consigo capturar o arquivo a menos que %f
seja usado, mas falha quando há espaço em branco no nome do arquivo. Tentei usar aspas simples, aspas duplas e uma combinação infinita de outras coisas sem sucesso. Eu conheço duas soluções para isso: (1) eu poderia fazer com que a linha Exec execute um script em vez disso, ou (2) se eu usar %F
, todas as partes do nome do arquivo são passadas paraargv[2], argv[3]
etc., dependendo do número de espaços em branco no nome do arquivo. Eu teria que usar argc[]
e fazer um loop para capturar tudo argv[]
para concatenar tudo de volta no nome do arquivo real. Nenhuma dessas opções parece eloquente. Tem que haver uma maneira melhor que eu estou perdendo. Se houver uma maneira de redirecionar stderr sem bash -c
, isso pode ser uma solução. Ou talvez haja um comando bash como sed
ou tee
que possa ser usado? Basicamente, eu só quero uma linha Exec SOMENTE que capture um nome de arquivo com espaço em branco argv[1]
e ainda permita que o stderr redirecione para um arquivo.
Você pode passar o
%f
argumento como um parâmetro posicional para o shell colocando-o após sua string de comando e citando-o dentro da string de comando da maneira usual.Ex.
Essa técnica funciona até mesmo com o espaço reservado para vários arquivos %F:
Estou usando
sh
notbash
aqui, pois não parece haver nada específico do bash sobre o seu comando, no entanto, o mesmo se aplica embash
: