Esses aplicativos baseados em GUI também executam o mesmo comando em segundo plano?
Sim e não. Eles escrevem no dconf
banco de dados de configurações, mas podem estar usando maneiras diferentes de fazer isso. Os programas escritos em Python provavelmente usarão o gi.repository.Gio
módulo (eu sei porque o uso muito) ou podem usar gsettings
como um comando externo chamando subprocess.Popen(['gsettings','org.some.schema','some-key','value'])
, e basicamente serão executados como um comando shell. O programa AC usará algo semelhante, provavelmente uma gio.h
biblioteca, ou pode até usar a exec()
família de funções para fazer o mesmo Popen
que em python. Então, para responder à sua pergunta do título: "O aplicativo baseado em GUI executa comandos do shell em segundo plano?" Eles podem, mas provavelmente não é necessário porque existe uma biblioteca para qualquer idioma em que o aplicativo esteja escrito e provavelmente será um pouco mais rápido usar uma função de biblioteca do que gerar um novo processo.
Para dar uma amostra de como isso é feito com bibliotecas / módulos, fique à vontade para dar uma olhada no código-fonte do meu indicador da lista de iniciantes. Lá, escrevi uma função para criar uma instância da Gio.Settings
classe e depois usá-la para modificar o iniciador do Unity, dependendo do tipo de lista que você deseja ter lá.
Como dar uma espiada no trabalho interno desses aplicativos? Quero dizer, existe alguma maneira de realmente olhar para os comandos que estão sendo executados a cada clique do botão?
Não. Se você deseja ver qual comando é emitido na linguagem de programação desse aplicativo, ao pressionar um botão ou clicar nos elementos da janela, isso não é possível. Leia o código fonte do aplicativo, se for possível obtê-lo. Você pode usar dconf watch /
para ver quais configurações estão sendo alteradas, mas não como são feitas.
Tecnicamente, se você souber operar um depurador, ler endereços de memória e conhecer alguma linguagem assembly, poderá saber o que um aplicativo faz no nível da CPU e da memória. Isso é conhecido como engenharia reversa de software e é frequentemente usado por profissionais de segurança para analisar software malicioso e descobrir vulnerabilidades em software legítimo.
Esses aplicativos abrem um terminal em segundo plano e executam esses comandos?
Não, não há terminal conectado. Muitos programas sabem onde o dconf
banco de dados do usuário está localizado e gravam nele. Há também um barramento de comunicação entre processos conhecido como dbus
, onde os programas podem enviar sinais, e um programa será como "Ei, isso é uma mensagem para mim!"
Termo aditivo
Os aplicativos podem executar outros aplicativos? Sim, isso é feito por meio de chamadas padrão fork()
e do execve()
sistema. A essência da criação de processos no Linux e em outros sistemas * nix é amplamente baseada nesses dois. O mecanismo do shell para executar comandos não integrados usa muito isso em particular. Quando você executa interativamente
$ ls
o shell criará um novo processo via fork()
, esse processo será executado execve()
e será iniciado ls
. Por causa de como será execve()
esse novo processo bifurcado ls
. A pipe()
chamada do sistema é o que ajudará a ler a saída de ls
. Eu sugiro fortemente que leia minha resposta para Qual é a diferença entre canal e redirecionamento para entender como o mecanismo de canal funciona - não é apenas |
operador, mas na verdade um syscall.
Os aplicativos podem executar comandos do shell? Não. A sintaxe do shell é entendida apenas pelo próprio shell. O que você pode fazer, no entanto, é iniciar um shell com uma -c
opção de linha de comando e fornecer os comandos apropriados. Isso geralmente é usado para atalhos personalizados definidos no GNOME ou em outros ambientes da área de trabalho, já que atalhos personalizados operam em executáveis e não há shell para entender a sintaxe. Assim, como exemplo, você faria bash -c 'xdotool key Ctrl+Alt+T'
para executar indiretamente o xdotool
comando ou bash -c 'cd $HOME/Desktop; touch New_File'
criar um novo arquivo na área de trabalho via atalho. Este é um exemplo particularmente interessante, pois você pode usar uma variável de shell, pois está usando um shell explicitamente.
Espionando o que acontece
A maior parte do que esses editores de configurações fazem pode ser assistida executando
em um terminal.
gsettings
Também na maioria das vezes, para alcançar o que você vê acontecendo com o comando acima, esses aplicativos precisarão editar o
dconf
banco de dados (mais abaixo). Isso pode ser feito diretamente , usando as opções cli do dconf (o que não é preferido) ou executando osgsettings
comandos correspondentes , como o que você mencionou.Para executar esses comandos, nenhuma janela de terminal é necessária, como você pode ver nos exemplos.
Sobre, gsettings, dconf e o banco de dados dconf
gsettings
é o front end do cli quedconf
, por sua vez, edita odconf
banco de dados, onde a maioria das configurações está armazenada, em formato binário. Veja também esta boa resposta .O
dconf
banco de dados, a propósito, também pode ser editado a partir da GUI pelodconf
editor, que está nos repositórios:Amostras de trabalho
uma. Em python
Para mostrar o que acontece sob o capô, abaixo de uma amostra de trabalho para alternar a posição do iniciador da GUI em um único botão (alternar):
file.py
execute-o pelo comando:
...e divirta-se.
b. Ícone do iniciador
Mesmo um iniciador simples pode fazer o trabalho na GUI:
setlauncher.desktop
Para uso permanente, armazene-o
~/.local/share/applications
(para uso local) ou~/usr/share/applications
para todos os usuários.fonte