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.
Ausspionieren, was passiert
Die meisten Funktionen dieser Einstellungseditoren können durch Ausführen von überwacht werden
in einem Terminal.
gEinstellungen
In den meisten Fällen müssen diese Anwendungen die
dconf
Datenbank (weiter unten) bearbeiten, um das zu erreichen, was Sie mit dem obigen Befehl sehen . Dies kann entweder direkt erfolgen , indem Sie die cli-Optionen von dconf verwenden (was nicht bevorzugt wird), oder indem Sie die entsprechendengsettings
Befehle wie den von Ihnen erwähnten ausführen.Zum Ausführen dieser Befehle wird kein Terminalfenster benötigt, wie Sie in den Beispielen sehen können.
About, gsettings, dconf und die Datenbank dconf
gsettings
ist das Cli-Frontend fürdconf
, das seinerseits diedconf
Datenbank, in der die meisten Einstellungen gespeichert sind, im Binärformat bearbeitet . Siehe auch diese nette Antwort .Die
dconf
Datenbank kann übrigens auch über die GUI mit demdconf
Editor bearbeitet werden , der sich in den Repositorys befindet:Arbeitsproben
ein. In Python
Um Ihnen zu zeigen, was unter der Haube passiert, klicken Sie unterhalb eines Arbeitsbeispiels auf eine einzelne Schaltfläche, um Ihre Startposition über die grafische Benutzeroberfläche umzuschalten:
file.py
starte es mit dem Befehl:
...und Spaß haben.
b. Startsymbol
Selbst ein einfacher Launcher kann die Aufgabe über die GUI erledigen:
setlauncher.desktop
Zum dauerhaften Gebrauch in
~/.local/share/applications
(für den lokalen Gebrauch) oder~/usr/share/applications
für alle Benutzer aufbewahren.quelle