¿Estas aplicaciones basadas en GUI también ejecutan el mismo comando en segundo plano?
Si y no. Escriben en la dconf
base de datos de configuraciones, pero podrían estar usando diferentes formas de hacerlo. Los programas escritos en Python probablemente usarán el gi.repository.Gio
módulo (lo sé porque lo uso mucho) o en su lugar pueden usarlo gsettings
como un comando externo llamando subprocess.Popen(['gsettings','org.some.schema','some-key','value'])
, y básicamente se ejecutará como un comando de shell. El programa de AC usará algo similar, probablemente una gio.h
biblioteca, o incluso podría usar la exec()
familia de funciones para hacer lo mismo Popen
que en Python. Entonces, para responder a la pregunta del título: "¿La aplicación basada en GUI ejecuta comandos de shell en segundo plano?" Pueden, pero es probable que no sea necesario porque hay una biblioteca para cualquier idioma en el que esté escrita la aplicación, y es probable que sea un poco más rápido usar una función de biblioteca que generar un nuevo proceso.
Para darle una muestra de cómo se hace con las bibliotecas / módulos, no dude en consultar el código fuente de mi indicador de lista de iniciadores. Allí he escrito una función para crear una instancia de la Gio.Settings
clase y luego usarla para modificar el iniciador de Unity dependiendo del tipo de lista que desee tener allí.
¿Cómo echar un vistazo al funcionamiento interno de estas aplicaciones? Quiero decir, ¿hay alguna forma de ver realmente los comandos que se ejecutan con cada clic del botón?
No. Si desea ver qué comando se emite en el lenguaje de programación de esa aplicación cuando presiona un botón o hace clic en los elementos de la ventana, entonces no es posible. Lea el código fuente de la aplicación, si es posible obtenerlo. Puede usar dconf watch /
para ver qué configuraciones se están cambiando, pero no cómo se hace.
Técnicamente, si sabe cómo operar un depurador, leer direcciones de memoria y sabe algo de lenguaje ensamblador, entonces puede saber qué hace una aplicación a nivel de CPU y memoria. Esto se conoce como ingeniería inversa de software y es utilizado frecuentemente por profesionales de seguridad para analizar software malicioso y descubrir vulnerabilidades en software legítimo.
¿Estas aplicaciones abren una terminal en segundo plano y ejecutan estos comandos?
No, no hay terminal conectada. Muchos programas saben dónde se encuentra la dconf
base de datos para el usuario y escriben allí. También hay un bus de comunicación entre procesos conocido como dbus
, donde los programas pueden enviar señales, y un programa será como "¡Hola, ese es un mensaje para mí!"
Apéndice
¿Pueden las aplicaciones ejecutar otras aplicaciones? Sí, eso se hace a través de llamadas estándar fork()
y del execve()
sistema. La esencia de crear procesos en Linux y otros sistemas * nix se basa en gran medida en estos dos. El mecanismo de shell para ejecutar comandos no incorporados lo utiliza mucho en particular. Cuando corres interactivamente
$ ls
el shell creará un nuevo proceso a través de fork()
, ese proceso se ejecutará execve()
y comenzará ls
. Por cómo execve()
será ese nuevo proceso bifurcado ls
. La pipe()
llamada al sistema es lo que ayudará a leer la salida de ls
. Sugiero leer mi respuesta para Cuál es la diferencia entre tubería y redirección para comprender cómo funciona el mecanismo de tubería: no es solo un |
operador, sino una llamada al sistema.
¿Pueden las aplicaciones ejecutar comandos de shell? No. La sintaxis de Shell solo se entiende por la propia shell. Sin embargo, lo que puede hacer es iniciar un shell con un -c
interruptor de línea de comandos y proporcionar los comandos adecuados. Esto se usa a menudo para accesos directos personalizados establecidos en GNOME u otros entornos de escritorio, ya que los accesos directos personalizados operan en ejecutables y no hay un shell para comprender la sintaxis. Por lo tanto, como ejemplo, haría bash -c 'xdotool key Ctrl+Alt+T'
ejecutar indirectamente el xdotool
comando o bash -c 'cd $HOME/Desktop; touch New_File'
crear un nuevo archivo en el escritorio a través de un acceso directo. Este es un ejemplo particularmente interesante ya que puede usar una variable de shell, ya que está utilizando un shell explícitamente.
Espiando lo que pasa
La mayor parte de lo que hacen estos editores de configuración se puede ver ejecutando
en una terminal
gsettings
Además, la mayoría de las veces, para lograr lo que ve que sucede con el comando anterior, estas aplicaciones deberán editar la
dconf
base de datos (más adelante). Esto se puede hacer directamente , usando las opciones cli de dconf (que no se prefiere), o ejecutando losgsettings
comandos correspondientes , como el que usted menciona.Para ejecutar estos comandos, no se necesita una ventana de terminal, como puede ver en los ejemplos.
Acerca de, gsettings, dconf y la base de datos dconf
gsettings
es la interfaz de usuario de clidconf
, que a su vez edita ladconf
base de datos, donde se almacena la mayoría de las configuraciones, en formato binario. Vea también esta buena respuesta .La
dconf
base de datos, por cierto, también se puede editar desde la GUI pordconf
editor, que está en los repositorios:Muestras de trabajo
a. En pitón
Para mostrarle lo que sucede debajo del capó, debajo de una muestra de trabajo para alternar su posición de iniciador desde la GUI en un solo botón (alternar):
file.py
ejecútelo con el comando:
...y divertirse.
si. Icono de lanzador
Incluso un simple iniciador puede hacer el trabajo desde la GUI:
setlauncher.desktop
Para uso permanente, almacénelo en
~/.local/share/applications
(para uso local) o~/usr/share/applications
para todos los usuarios.fuente