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$ lso 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
-cda 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 comandoxdotooloubash -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.


