AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / ubuntu / Perguntas / 1187316
Accepted
Leigh K
Leigh K
Asked: 2019-11-09 07:49:15 +0800 CST2019-11-09 07:49:15 +0800 CST 2019-11-09 07:49:15 +0800 CST

Escapando espaços no arquivo .desktop Exec line com "bash -c"

  • 772

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 %fna 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 %fseja 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 sedou teeque 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.

gnome bash mime-type .desktop
  • 1 1 respostas
  • 804 Views

1 respostas

  • Voted
  1. Best Answer
    steeldriver
    2019-11-09T08:39:42+08:002019-11-09T08:39:42+08:00

    Você pode passar o %fargumento 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.

    Exec=sh -c 'somecommand "$1" 2>> /path/to/stderr.log' sh %f
    

    Essa técnica funciona até mesmo com o espaço reservado para vários arquivos %F:

    Exec=sh -c 'somecommand "$@" 2>> /path/to/stderr.log' sh %F
    

    Estou usando shnot bashaqui, pois não parece haver nada específico do bash sobre o seu comando, no entanto, o mesmo se aplica em 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

relate perguntas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Existe um comando para listar todos os usuários? Também para adicionar, excluir, modificar usuários, no terminal?

    • 9 respostas
  • Marko Smith

    Como excluir um diretório não vazio no Terminal?

    • 4 respostas
  • Marko Smith

    Como descompactar um arquivo zip do Terminal?

    • 9 respostas
  • Marko Smith

    Como instalo um arquivo .deb por meio da linha de comando?

    • 11 respostas
  • Marko Smith

    Como instalo um arquivo .tar.gz (ou .tar.bz2)?

    • 14 respostas
  • Marko Smith

    Como listar todos os pacotes instalados

    • 24 respostas
  • Martin Hope
    Flimm Como posso usar o docker sem sudo? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    led-Zepp Como faço para salvar a saída do terminal em um arquivo? 2014-02-15 11:49:07 +0800 CST
  • Martin Hope
    ubuntu-nerd Como descompactar um arquivo zip do Terminal? 2011-12-11 20:37:54 +0800 CST
  • Martin Hope
    TheXed Como instalo um arquivo .deb por meio da linha de comando? 2011-05-07 09:40:28 +0800 CST
  • Martin Hope
    Ivan Como listar todos os pacotes instalados 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    David Barry Como determino o tamanho total de um diretório (pasta) na linha de comando? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher "Os seguintes pacotes foram retidos:" Por que e como resolvo isso? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford Como os PPAs podem ser removidos? 2010-07-30 01:09:42 +0800 CST

Hot tag

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve