Do these GUI-based applications also execute the same command in the background?
Sim e não. Eles escrevem no banco de dados dconf
de configurações, mas podem estar usando maneiras diferentes de fazer isso. Programas escritos em Python provavelmente usarão o módulo gi.repository.Gio
(eu sei porque eu uso muito) ou eles podem usar gsettings
como um comando externo chamando subprocess.Popen(['gsettings','org.some.schema','some-key','value'])
, e ele basicamente será executado como um comando shell. Um programa em C usará algo semelhante, provavelmente uma biblioteca gio.h
, ou pode até usar a família de funções exec()
para fazer o mesmo que o Popen
em python. Então, para responder à sua pergunta do título: "O aplicativo baseado em GUI executa comandos shell em segundo plano?" Eles podem, mas provavelmente não é necessário porque há uma biblioteca para qualquer linguagem em que o aplicativo é 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 é feito com bibliotecas / módulos, sinta-se à vontade para dar uma olhada no código-fonte do meu indicador da lista de ativadores. Eu escrevi uma função para criar uma instância da classe Gio.Settings
e usá-la para modificar o iniciador do Unity, dependendo do tipo de lista que você deseja ter.
How to have a peep at the internal working of these applications? I mean, is there any way of actually looking at the commands that are being executed at every click of button?
Não. Se você quiser ver qual comando é emitido na linguagem de programação do aplicativo, ao pressionar um botão ou clicar nos elementos da janela, não será 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 isso é feito.
Tecnicamente, se você souber como operar um depurador, ler endereços de memória e conhecer alguma linguagem de montagem, saberá o que um aplicativo faz no nível de CPU e memória. Isso é conhecido como engenharia reversa de software e é freqüentemente usado por profissionais de segurança para analisar softwares mal-intencionados e descobrir vulnerabilidades em softwares legítimos.
Do these applications open up a terminal in the background and execute these commands?
Não, não há terminal conectado. Muitos programas sabem onde o banco de dados dconf
do usuário está localizado e escrevem lá. Há também um barramento de comunicação entre processos conhecido como dbus
, onde os programas podem enviar sinais e um programa como "Ei, essa é uma mensagem para mim!"
Adendo
-
As aplicações podem executar outras aplicações? Sim, isso é feito por meio de chamadas de sistema padrão
fork()
eexecve()
. 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 embutidos usa muito em particular. Quando você corre interativamente$ ls
o shell criará um novo processo via
fork()
, esse processo executaráexecve()
, que iniciaráls
. Por causa de comoexecve()
esse novo processo bifurcado seráls
. A chamada do sistemapipe()
é o que ajudará a ler a saída dels
. Eu sugiro strongmente ler minha resposta para Qual é a diferença entre pipe e redirecionamento para entender como o mecanismo de pipe funciona - não é só|
operator, mas na verdade um syscall. -
Os aplicativos podem executar comandos do shell? Não. A sintaxe da shell só é entendida pela própria shell. O que você pode fazer, no entanto, é iniciar um shell com um comutador
-c
da linha de comandos e fornecer comandos apropriados. Isso geralmente é usado para atalhos personalizados definidos no GNOME ou em outros ambientes de área de trabalho, já que atalhos personalizados operam em executáveis e não há shell para entender a sintaxe. Assim, como exemplo, você executariabash -c 'xdotool key Ctrl+Alt+T'
para executar indiretamente o comandoxdotool
oubash -c 'cd $HOME/Desktop; touch New_File'
para criar um novo arquivo na área de trabalho por meio de um atalho. Este é um exemplo particularmente interessante, pois você pode usar uma variável shell, já que você está usando um shell explicitamente.