Ich bin erst vor 2 Tagen von Windows auf Ubuntu 16.04 migriert. Mir gefällt die Art und Weise, wie wir den Unity Desktop anpassen können. Ich spiele nur mit dem Look and Feel der Desktop-Umgebung herum. Genau wie in Windows wollte ich, dass sich der Launcher am unteren Bildschirmrand befindet. Beim Googeln habe ich einen Befehl gefunden, der so lautet:
gsettings set com.canonical.Unity.Launcher launcher-position Bottom
Außerdem gibt es das Unity-Tweak-Tool und den dconf-Editor, um die Arbeit zu erledigen. Aber das ist der GUI-Ansatz, um Dinge zu erledigen.
Meine Fragen sind:
- Führen diese GUI-basierten Anwendungen denselben Befehl auch im Hintergrund aus?
- Wie kann man einen Blick auf die interne Funktionsweise dieser Anwendungen werfen? Ich meine, gibt es eine Möglichkeit, die Befehle zu sehen, die bei jedem Klick auf eine Schaltfläche ausgeführt werden?
- Öffnen diese Anwendungen ein Terminal im Hintergrund und führen diese Befehle aus?
Die Antwort hier zeigt, wie Sie den Standarddateideskriptor des Prozesses erhalten. Aber ich habe nichts in der Ausgabe bekommen.
Außerdem die strace -p pid -o output.txt
Befehl wirft eine riesige Menge an Text in die Datei.
Kurz gesagt, ist es dasselbe, Dinge mit GUI-Anwendungen zu tun, als Dinge von der Befehlszeile aus zu tun?
Akzeptierte Antwort:
Führen diese GUI-basierten Anwendungen denselben Befehl auch im Hintergrund aus?
Ja und nein. Sie schreiben in die dconf
Datenbank mit Einstellungen, aber sie könnten dazu verschiedene Methoden verwenden. In Python geschriebene Programme verwenden wahrscheinlich gi.repository.Gio
Modul (ich weiß, weil ich es oft benutze) oder sie können stattdessen gsettings
verwenden als externer Befehl durch Aufrufen von subprocess.Popen(['gsettings','org.some.schema','some-key','value'])
, und es wird im Grunde als Shell-Befehl ausgeführt. Ein C-Programm verwendet etwas Ähnliches, wahrscheinlich eine gio.h
Bibliothek, oder es könnte sogar die exec()
verwenden Familie von Funktionen, die dasselbe tun wie Popen
tut in Python. Um Ihre Titelfrage zu beantworten:„Führen GUI-basierte Anwendungen Shell-Befehle im Hintergrund aus?“ Sie können, 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 etwas schneller sein, eine Bibliotheksfunktion zu verwenden, als einen neuen Prozess zu erzeugen.
Um Ihnen ein Beispiel dafür zu geben, wie es mit Bibliotheken/Modulen gemacht wird, können Sie sich gerne den Quellcode meines Launcher-Listenindikators ansehen. Dort habe ich eine Funktion geschrieben, um eine Instanz der Gio.Settings
zu erstellen -Klasse und verwenden Sie sie dann, 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 zu sehen, die bei jedem Klick auf eine Schaltfläche ausgeführt werden?
Nein. Wenn Sie sehen möchten, welcher Befehl in der Programmiersprache dieser App ausgegeben wird, wenn Sie eine Schaltfläche drücken oder auf Fensterelemente klicken, ist dies nicht möglich. Lesen Sie den Quellcode der Anwendung, wenn es möglich ist, ihn zu erhalten. Sie können dconf watch /
verwenden um zu sehen, welche Einstellungen geändert werden, aber nicht, wie es gemacht wird.
Technisch gesehen, wenn Sie wissen, wie man einen Debugger bedient, Speicheradressen liest und einige Assemblersprachen beherrscht, können Sie wissen, was eine App auf CPU- und Speicherebene tut. Dies wird als Software-Reverse-Engineering bezeichnet und wird häufig von Sicherheitsexperten verwendet, um bösartige Software zu analysieren und Schwachstellen in legitimer Software zu entdecken.
Öffnen diese Anwendungen ein Terminal im Hintergrund und führen diese Befehle aus?
Nein, es ist kein Terminal angeschlossen. Viele Programme wissen, wo die dconf
Datenbank für den Benutzer befindet und dort schreiben. Es gibt auch einen Interprozess-Kommunikationsbus namens dbus
, wo Programme Signale senden können und ein Programm wie „Hey, das ist eine Nachricht für mich!“
Nachtrag
-
Können Anwendungen andere Anwendungen ausführen? Ja, das geht über Standard
fork()
undexecve()
Systemaufrufe. Die Essenz der Erstellung von Prozessen unter Linux und anderen *nix-Systemen basiert größtenteils auf diesen beiden. Der Shell-Mechanismus zum Ausführen von nicht integrierten Befehlen verwendet dies insbesondere häufig. Wenn Sie interaktiv laufen$ ls
die Shell erstellt einen neuen Prozess über
fork()
, führt dieser Prozessexecve()
aus wodurchls
gestartet wird . Aufgrund dessen, wieexecve()
dieser neue gegabelte Prozess wirdls
sein . Diepipe()
Der Systemaufruf hilft dabei, die Ausgabe vonls
zurückzulesen . Ich empfehle dringend, meine Antwort auf Was ist der Unterschied zwischen Pipe und Umleitung zu lesen, um zu verstehen, wie der Pipe-Mechanismus funktioniert – es ist nicht nur|
Operator, sondern eigentlich ein Systemaufruf. -
Können Anwendungen Shell-Befehle ausführen? Nein. Die Shell-Syntax wird nur von der Shell selbst verstanden. Was Sie jedoch tun können, ist, eine Shell mit einem Befehlszeilenbefehl
-c
zu starten wechseln 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, um die Syntax zu verstehen. Als Beispiel würden Sie alsobash -c 'xdotool key Ctrl+Alt+T'
ausführen umxdotool
indirekt auszuführen Befehl oderbash -c 'cd $HOME/Desktop; touch New_File'
um eine neue Datei auf dem Desktop per Verknüpfung zu erstellen. Dies ist ein besonders interessantes Beispiel, da Sie eine Shell-Variable verwenden können, da Sie explizit eine Shell verwenden.