Führen diese GUI-basierten Anwendungen denselben Befehl auch im Hintergrund aus?
Ja und nein. Sie schreiben in die dconf
Einstellungsdatenbank, können jedoch unterschiedliche Methoden verwenden. In Python geschriebene Programme werden wahrscheinlich das gi.repository.Gio
Modul verwenden (ich weiß, weil ich es oft benutze) oder sie können es stattdessen gsettings
durch Aufrufen als externen Befehl verwenden subprocess.Popen(['gsettings','org.some.schema','some-key','value'])
, und es wird im Grunde genommen als Shell-Befehl ausgeführt. Ein AC-Programm wird etwas Ähnliches verwenden, wahrscheinlich eine gio.h
Bibliothek, oder es könnte sogar die exec()
Funktionsfamilie verwenden, um dasselbe wie Popen
in Python zu tun . Um also Ihre Titelfrage zu beantworten: "Führen GUI-basierte Anwendungen Shell-Befehle im Hintergrund aus?" Sie können es, aber wahrscheinlich ist es nicht notwendig, weil es eine Bibliothek für jede Sprache gibt, in der die App geschrieben ist, und wahrscheinlich wird es ein bisschen schneller sein, eine Bibliotheksfunktion zu verwenden, als einen neuen Prozess zu erzeugen.
Um Ihnen ein Beispiel zu geben, wie es mit Bibliotheken / Modulen gemacht wird, werfen Sie einen Blick auf den Quellcode meines Launcher-Listen-Indikators. Dort habe ich eine Funktion geschrieben, um eine Instanz der Gio.Settings
Klasse zu erstellen und sie dann zu verwenden, um den Unity-Launcher abhängig von der Art der Liste zu ändern, die Sie dort haben möchten.
Wie kann man einen Blick auf die interne Funktionsweise dieser Anwendungen werfen? Ich meine, gibt es eine Möglichkeit, die Befehle, die bei jedem Klick auf die Schaltfläche ausgeführt werden, tatsächlich anzuzeigen?
Nein. Wenn Sie sehen möchten, welcher Befehl in der Programmiersprache dieser App ausgegeben wird, indem Sie eine Taste drücken oder auf Fensterelemente klicken, ist dies nicht möglich. Lesen Sie den Quellcode der Anwendung, wenn Sie ihn erhalten können. Sie können dconf watch /
damit sehen, welche Einstellungen geändert werden, aber nicht, wie dies durchgeführt wird.
Technisch gesehen können Sie, wenn Sie wissen, wie man einen Debugger bedient, Speicheradressen liest und eine Assemblersprache beherrscht, wissen, was eine App auf CPU- und Speicherebene tut. Dies wird als Software-Reverse-Engineering bezeichnet und wird häufig von Sicherheitsexperten verwendet, um schädliche Software zu analysieren und Schwachstellen in legitimer Software zu erkennen.
Öffnen diese Anwendungen ein Terminal im Hintergrund und führen diese Befehle aus?
Nein, es ist kein Terminal angeschlossen. Viele Programme wissen, wo sich die dconf
Datenbank für den Benutzer befindet und schreiben dort. Es gibt auch einen Interprozess-Kommunikationsbus dbus
, in dem Programme Signale senden können, und ein Programm wird lauten: "Hey, das ist eine Nachricht für mich!"
Nachtrag
Können Anwendungen andere Anwendungen ausführen? Ja, das geschieht über Standard- fork()
und execve()
Systemaufrufe. Das Wesentliche beim Erstellen von Prozessen unter Linux und anderen * nix-Systemen basiert weitgehend auf diesen beiden. Der Shell-Mechanismus zum Ausführen von nicht eingebauten Befehlen nutzt dies besonders häufig. Wenn Sie interaktiv laufen
$ ls
Die Shell erstellt über einen neuen Prozess fork()
, execve()
der ausgeführt wird und gestartet wird ls
. Aufgrund dessen, wie execve()
dieser neue gegabelte Prozess sein wird ls
. Der pipe()
Systemaufruf hilft beim Zurücklesen der Ausgabe von ls
. Ich empfehle dringend, meine Antwort für Was ist der Unterschied zwischen Pipe und Umleitung , um zu verstehen, wie der Pipe-Mechanismus funktioniert - es ist nicht nur ein |
Operator, sondern tatsächlich ein Systemaufruf.
Können Anwendungen Shell-Befehle ausführen? Nein. Die Shell-Syntax wird nur von der Shell selbst verstanden. Sie können jedoch eine Shell mit einer Befehlszeilenoption starten -c
und entsprechende Befehle bereitstellen. Dies wird häufig für benutzerdefinierte Verknüpfungen verwendet, die in GNOME oder anderen Desktop-Umgebungen festgelegt wurden, da benutzerdefinierte Verknüpfungen auf ausführbaren Dateien ausgeführt werden und es keine Shell gibt, die die Syntax versteht. So würden Sie beispielsweise den Befehl bash -c 'xdotool key Ctrl+Alt+T'
indirekt ausführen xdotool
oder bash -c 'cd $HOME/Desktop; touch New_File'
eine neue Datei auf dem Desktop über eine Verknüpfung erstellen. Dies ist ein besonders interessantes Beispiel, da Sie eine Shell-Variable verwenden können, da Sie eine Shell explizit verwenden.