O que faz um ponto de exclamação no início de um valor nos arquivos de configuração do KDE?

2

Em ~/.kde/share/config/kdeglobals , o valor para o navegador da web padrão começa com um ponto de exclamação. Qual é o propósito do ponto de exclamação?

[General]
BrowserApplication[$e]=!sensible-browser
    
por Vince 13.12.2013 / 04:15

2 respostas

4

Vamos apenas perguntar o código fonte. Se você não está interessado nos detalhes, basta pular para o final para ver o resultado:

Existe um KCM para definir os aplicativos padrão. Vamos procurar seu nome:

$ kcmshell4 --list | ack -i default
componentchooser           - Choose the default components for various services

NOTA: Os 5 passos seguintes são específicos do Gentoo, mas podem ser aplicados a qualquer outra distribuição ou podem ser substituídos navegando manualmente pelos repositórios de código do KDE!

Vamos procurar no sistema de arquivos por arquivos pertencentes ao componentchooser :

$ find /usr -name "*componentchooser*"
/usr/lib64/kde4/kcm_componentchooser.so
/usr/share/doc/HTML/en/kcontrol/componentchooser
/usr/share/doc/HTML/de/kcontrol/componentchooser
/usr/share/kde4/services/componentchooser.desktop
/usr/share/apps/kcm_componentchooser
/usr/share/locale/de/LC_MESSAGES/kcmcomponentchooser.mo

Agora vamos consultar o gerenciador de pacotes (no nosso caso o Portage do Gentoo) e pedir o pacote que contém qualquer um desses arquivos:

$ find /usr -name "*componentchooser*" | xargs qfile
kde-base/kdelibs (/usr/share/apps/kcm_componentchooser)
kde-base/kcontrol (/usr/share/apps/kcm_componentchooser)
kde-base/kcontrol (/usr/share/kde4/services/componentchooser.desktop)
kde-base/kcontrol (/usr/share/doc/HTML/en/kcontrol/componentchooser)
kde-base/kcontrol (/usr/lib64/kde4/kcm_componentchooser.so)
kde-base/kde-l10n (/usr/share/locale/de/LC_MESSAGES/kcmcomponentchooser.mo)
kde-base/kde-l10n (/usr/share/doc/HTML/de/kcontrol/componentchooser)

Como estamos procurando o código-fonte que realmente grava o valor para o navegador padrão, devemos examinar o arquivo .so que contém o código real, enquanto os outros arquivos apenas fornecem documentação ( /usr/share/doc/[…] ), meta-informação ( […].desktop ) e strings de tradução ( /usr/share/locale/[…] ).

Isso significa que teremos que dar uma olhada no pacote que fornece o arquivo objeto compartilhado ( .so ), que é kde-base/kcontrol no Gentoo.

Primeiro, temos certeza de que o tarball de origem está presente em nosso sistema de arquivos, pedindo ao Portage para baixá-lo para este pacote ( --nodeps garante, somente as fontes desse pacote são baixadas, mas não para nenhuma dependência):

$ emerge --fetchonly --nodeps kde-base/kcontrol
>>> Fetching (1 of 1) kde-base/kcontrol-4.11.4
 * kde-runtime-4.11.4.tar.xz SHA256 SHA512 WHIRLPOOL size ;-) ...    [ ok ]

Nesse caso, o arquivo já estava presente e apenas as somas de verificação foram verificadas.

Agora vamos descompactar este arquivo em um local temporário para examiná-lo ainda mais:

$ cd /tmp
$ tar xf /usr/portage/distfiles/kde-runtime-4.11.4.tar.xz

O resultado é o diretório kde-runtime-4.11.4 no qual vamos mudar agora:

$ cd kde-runtime-4.11.4

Este diretório contém agora muitos componentes pertencentes ao pacote kde-runtime do KDE SC. Estamos interessados no componente kcontrol :

$ cd kcontrol

Agora, precisamos identificar o arquivo que contém o código-fonte para gravar o navegador padrão em kdeglobalsrc . Existem diferentes maneiras de fazer isso:

  1. Navegue pela estrutura de diretórios e tente encontrar o arquivo pelo nome.
  2. Procure um arquivo cujo nome contenha algo como componentchooser e examine seu código-fonte
  3. Verifique o código-fonte e localize diretamente o arquivo que grava o valor BrowserApplication .

O caminho mais curto para o nosso objetivo é a opção '3', e é isso que faremos:

$ ack BrowserApplication
componentchooser/componentchooserbrowser.cpp
50:    QString exec = config.readPathEntry( QLatin1String("BrowserApplication"), QString("") );
92:    config.writePathEntry( QLatin1String("BrowserApplication"), exec); // KConfig::Normal|KConfig::Global

Então, obviamente, na linha '92' do arquivo componentchooser/componentchooserbrowser.cpp , esse é o valor que está sendo escrito, então vamos dar uma olhada mais de perto:

 80 void CfgBrowser::save(KConfig *)
 81 {
 82     KConfigGroup config(KSharedConfig::openConfig("kdeglobals"), QLatin1String("General") );
 83     QString exec;
 84     if (radioExec->isChecked())
 85     {
 86         exec = lineExec->text();
 87         if (m_browserService && (exec == m_browserExec))
 88             exec = m_browserService->storageId(); // Use service
 89         else if (!exec.isEmpty())
 90             exec = '!' + exec; // Literal command
 91     }
 92     config.writePathEntry( QLatin1String("BrowserApplication"), exec); // KConfig::Normal|KConfig::Global
 93     config.sync();
 94
 95     KGlobalSettings::self()->emitChange(KGlobalSettings::SettingsChanged);
 96
 97     emit changed(false);
 98 }

Na linha '92', a chave BrowserApplication é escrita e seu valor está na variável exec . O ponto de exclamação é adicionado à string de comando na linha '90', mas não há nenhum comentário elaborado no código nessa linha, o que explicaria por que isso é feito, então vamos dar uma olhada na lógica de código que leva à adição um ! na frente do valor BrowserApplication :

  • A linha '86' define exec como a string fornecida pelo campo de entrada
  • Verificações de linha '87', se a variável de membro m_browserService é verdadeira e se o conteúdo da variável exec é o mesmo que a variável de membro m_browserExec .
    • m_browserService é definido ( 0 ou 1 ) pelo método CfgBrowser :: selectBrowser quando o navegador padrão é selecionado, navegando na árvore de aplicativos em vez de inserir o nome do executável diretamente como string. Caso o navegador seja selecionado navegando na árvore de aplicativos, o conteúdo do campo de entrada é o nome do arquivo *.desktop dos aplicativos.
    • m_browserExec é o nome do arquivo *.desktop ao selecionar o navegador por meio da árvore de aplicativos.
    • Caso as duas instruções sejam avaliadas como TRUE , exec será definido como o resultado de storageId (o nome da entrada *.desktop ).
    • Caso contrário, o nome do arquivo executável é definido, mas é prefixado por um ! .

Para resumir:

O ponto de exclamação para a entrada BrowserApplication em kdeglobalsrc é usado para distinguir entre um nome binário real a ser executado para iniciar o navegador ou o nome do arquivo *.desktop de um navegador.

    
por 13.12.2013 / 22:12
-1

É mais provável que seja um recall do último comando executado com o mesmo nome. Um pouco de pesquisa me levou a esse script que levantou a suspeita de que o ponto de exclamação é algo como um feitiço de bash.

Esta discussão sobre um ponto de exclamação parece relevante.

Isso provavelmente significa que o bash espera um nome de comando completo que comece com sensible-browser .

    
por 13.12.2013 / 07:18