staging.inyokaproject.org

Wie findet man heraus, welches Programm hinter einem Bildschirmfenster steckt?

Status: Gelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

trollsportverein

Avatar von trollsportverein

Anmeldungsdatum:
21. Oktober 2010

Beiträge: Zähle...

Noch etwas awk im Spiel:

notify-send "$(xprop | grep WM_CLASS | awk '/WM_CLASS/{print $NF}' | sed 's/"//g')"

Das auf ein Tastenkürzel legen. Und dann das Tastenkürzel nutzen und mit der Maus auf das Element klicken.

4-Elster-4

(Themenstarter)

Anmeldungsdatum:
23. Oktober 2014

Beiträge: Zähle...

Marant-- schrieb:

sed betrachte ich lieber von Weitem mit Respekt. ☺

...

notify-send gibt über "xyz" "xyz" aus. Also Befehle, die sich auf Ausgabe beziehen gehören in "xyz".

Das mit "xyz" verstehe ich nicht. Was ist da gemeint?

var1=1;var2=2;var3=3;var4=4
notify-send "Text mit $var1" "$var2 $var3 $var4"

Marant--

Anmeldungsdatum:
4. April 2022

Beiträge: Zähle...

Soll einfach für Inhalt(mglw. verkettung),(also Text,Variablen,Befehle) stehen. Probiere es doch aus:

notify-send Das ist ein Test
notify-send Das ist "ein Test"
notify-send "Das ist" "ein Test"
notify-send "Das ist" nochmal "ein Test"
notify-send Test "1\n2\n3"

2 davon sind OK.

https://wiki.ubuntuusers.de/Benachrichtigungsdienst/

Nehme mal als Bsp. den Post von @trollsportverein(sorry @t., ist gerade im Sichtfeld) 2*

notify-send "$(xprop | grep WM_CLASS | awk '/WM_CLASS/{print $NF}' | sed 's/"//g')" "$(xprop | grep WM_CLASS | awk '/WM_CLASS/{print $NF}' | sed 's/"//g')"

also notify-send "xyz" "xyz"; ergibt 2 getrennte Abfragen/Ausgaben.

Keine Ahnung, wie ich das anders hätte schreiben können.

4-Elster-4

(Themenstarter)

Anmeldungsdatum:
23. Oktober 2014

Beiträge: Zähle...

seahawk1986 schrieb:

4-Elster-4 schrieb:

...

Du brauchst eine zusätzliche Process Substitution , damit notify-send nur das Ergebnis vorgesetzt bekommt - die beiden sed-Befehle kann man dann noch zusammenziehen:

1
notify-send $(sed -r -e 's/,//g;s/"//g' <<< "${QQ[2]}")

Aus einem Terminal liefert mir

1
QQ=($(xprop | grep WM_CLASS)); notify-send $(sed -r -e 's/,//g;s/"//g' <<< "${QQ[2]}")

genau den Programmnamen, der zum angeklickten Fenster gehört.

So kann ich es aber noch nicht auf eine Taste legen, denn dann kommt

Tastenkürzel »<Super>y« konnte nicht gestartet werden
Kindprozess »QQ=($(xprop« konnte nicht ausgeführt werden (Datei oder Verzeichnis nicht gefunden).

Wenn ich das alles aber in ein Skript stecke

1
2
3
4
#!/bin/bash
# ********************** Programmname.sh **************************
QQ=($(xprop | grep WM_CLASS))
notify-send $(sed -r -e 's/,//g;s/"//g' <<< "${QQ[2]}")

und das per bash -c '<Pfad zum Skript>' über das Tastenkürzel aufrufe, dann liefert es genau den Namen des Programms, dem das Fenster gehört, das man mit der Maus anklickt.

Damit ist die Hauptaufgabe aus meinem Fragenkomplex »Welches Programm hinter einem Bildschirmfenster steckt?« gelöst.

Wahrscheinlich kann man mit ähnlichen Mitteln sogar das Kommando und den Pfad zum fraglichen Programm oder die PID oder die Version des Programms per Skript herausbekommen.

Die Aufgabe, dafür zu sorgen, daß ein Dialog eines GUI-Anwendungsprogramms temporär in der englischen Sprachvariante erscheint, um in einer Fehlermeldung darauf bezugzunehmen, läßt sich vielleicht nicht so einfach realisieren. Mit diesen vielen Teilschritten haben wir ein nützliches Resultat! Danke an alle, die dazu beigesteuert haben!

(Das mit der zusätzlichen Process Substitution habe ich nicht ganz verstanden - aber es wirkt!Formatierter Text Haben Sie ein Link auf eine Stelle, wo so was genauer erklärt wird?)

Marant--

Anmeldungsdatum:
4. April 2022

Beiträge: Zähle...

Wahrscheinlich kann man mit ähnlichen Mitteln sogar das Kommando und den Pfad zum fraglichen Programm oder die PID oder die Version des Programms per Skript herausbekommen.

notify-send "$(xprop | grep WM_CLASS | awk '/WM_CLASS/{print $NF}' | sed 's/"//g')" "$(ps -Flwwp $(xprop _NET_WM_PID | cut -d' ' -f3))"

Bitte schön. Gibt Beides aus. Allerdings noch Provisorium, es muss momentan 2* geklickt werden und gefiltert/geschnitten werden muss auch noch. Kannst auch das von @seahawk1986 (für 1. Teil) einsetzen, momentan ist das von @trollsportverein drin. Für mich war's das für Heute.

Mglw. erbarmt sich Jmd.

4-Elster-4

(Themenstarter)

Anmeldungsdatum:
23. Oktober 2014

Beiträge: 109

Marant-- schrieb:

Soll einfach für Inhalt(mglw. verkettung),(also Text,Variablen,Befehle) stehen. Probiere es doch aus:

notify-send Das ist ein Test
notify-send Das ist "ein Test"
notify-send "Das ist" "ein Test"
notify-send "Das ist" nochmal "ein Test"
notify-send Test "1\n2\n3"

2 davon sind OK.

https://wiki.ubuntuusers.de/Benachrichtigungsdienst/

Nehme mal als Bsp. den Post von @trollsportverein(sorry @t., ist gerade im Sichtfeld) 2*

notify-send "$(xprop | grep WM_CLASS | awk '/WM_CLASS/{print $NF}' | sed 's/"//g')" "$(xprop | grep WM_CLASS | awk '/WM_CLASS/{print $NF}' | sed 's/"//g')"

also notify-send "xyz" "xyz"; ergibt 2 getrennte Abfragen/Ausgaben.

Keine Ahnung, wie ich das anders hätte schreiben können.

Danke für die Erklärung und das Link. Jetzt hab ich das verstanden. Das modifizierte awk-Beispiel braucht auch zwei Klicks auf das Fenster, um das es geht, eins für die erste, eins für die zweite Abfrage und Ausgabe.

Marant--

Anmeldungsdatum:
4. April 2022

Beiträge: 744

Manche in ps gelistet mit Pfad, manche ohne, wieso eigentlich?

Jedenfalls, brauchbar ist es.

notify-send "$(ps $(xprop _NET_WM_PID | cut -d' ' -f3) | tail -1)"

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

4-Elster-4 schrieb:

(Das mit der zusätzlichen Process Substitution habe ich nicht ganz verstanden - aber es wirkt!Formatierter Text Haben Sie ein Link auf eine Stelle, wo so was genauer erklärt wird?)

Da bin ich durcheinander gekommen - $(BEFEHL) ist eine Command Substitution: https://www.gnu.org/software/bash/manual/html_node/Command-Substitution.html - bei der Process Substitution leitet man die Aus- bzw. Eingabe in eine benannte geöffnete Datei bzw. Named Pipe weiter und bekommt den Pfad zu dieser zurück: https://www.gnu.org/software/bash/manual/html_node/Process-Substitution.html

Marant-- schrieb:

Manche in ps gelistet mit Pfad, manche ohne, wieso eigentlich?

ps listet standardmäßig den Befehl, der ausgeführt wurde, um das Programm zu starten - wenn das Programm im PATH ist, kann man es ohne Pfadangabe aufrufen, ansonsten muss man einen Pfad angeben.

Marant--

Anmeldungsdatum:
4. April 2022

Beiträge: 744

seahawk1986 schrieb:

ps listet standardmäßig den Befehl, der ausgeführt wurde,

Stimmt. Also, ob mit Pfad gestartet, oder ohne. Danke!

standardmäßig

Schalter um Pfad immer zu zeigen scheint es offb. nicht zu geben. Notfalls könnte man vllt.

which <anwendung>

integrieren, aber das deckt auch nicht alle Fälle ab.

Marant--

Anmeldungsdatum:
4. April 2022

Beiträge: 744

notify-send -t 10000 -i dialog-information "$(xprop | grep WM_CLASS | awk '/WM_CLASS/{print $NF}' | sed 's/"//g') --> $(which $(xprop | grep WM_CLASS | awk '/WM_CLASS/{print $NF}' | sed 's/"//g' | tr '[:upper:]' '[:lower:]'))" "$(ps $(xprop _NET_WM_PID | cut -d' ' -f3) | tail -1)"

3* klicken, $2 von WM_CLASS momentan 2* um zu Testen

geä.

4-Elster-4

(Themenstarter)

Anmeldungsdatum:
23. Oktober 2014

Beiträge: 109

Marant-- schrieb:

Manche in ps gelistet mit Pfad, manche ohne, wieso eigentlich?

Jedenfalls, brauchbar ist es.

notify-send "$(ps $(xprop _NET_WM_PID | cut -d' ' -f3) | tail -1)"

Danke für den tollen Vorschlag! Als bash-Anfänger habe ich einen Nachmittag gebraucht, zu verstehen, wie er funktioniert. Dabei habe ich was dazugelernt.

notify-send kürzt die lange Ausgabe von ps allerdings ziemlich sinnlos.

Oben haben Sie ein Beispiel mit Zeilenumbrüchen gezeigt. Das brachte mich auf die Idee, alles vor dem Programmaufruf wegzuschneiden und dann im Ergebnis die Leerzeichen durch \n zu ersetzen. Ich habe das in Schritten - erst mal mit echo statt notify-send - ausprobiert. Durch Ausprobieren habe ich gefunden: Das 18. Feld ist der Programmaufruf (bei mir: mit Pfad):

a@w:~$ echo "$(ps $(xprop _NET_WM_PID | cut -d' ' -f3) | tail -1)" | cut -d' ' -f18- | sed -r -e 's/ /\n/g'
/opt/libreofficedev7.6/program/soffice.bin
--writer
--splash-pipe=5
a@w:~$ 

Hier erscheinen die einzelnen Ausgaben schön untereinander. Wenn ich aber echo noch durch notify-send ersetze, ist das wieder so, als hätten alle Operationen nach den in doppelten Gänsefüßchen eingeschlossenen gar nicht stattgefunden.

Wenn ich das Ergebnis all dieser Bemühungen per Pipe an notify-send schicke, passiert das:

a@w:~$ echo "$(ps $(xprop _NET_WM_PID | cut -d' ' -f3) | tail -1)" | cut -d' ' -f18- | sed -r -e 's/ /\n/g' | notify-send 
No summary specified.
a@w:~$ 

Dummerweise ist "summary" zwar in man notify-send erwähnt, aber nicht beschrieben. Ich habe dann noch das versucht:

a@w:~$ echo "$(ps $(xprop _NET_WM_PID | cut -d' ' -f3) | tail -1)" | cut -d' ' -f18- | sed -r -e 's/ /\n/g' | xargs notify-send
Unbekannte Option --writer
a@w

notify-send kann einen einen oder zwei Argumente haben kann. Deshalb habe ich noch versucht, das erste Leerzeichen nicht zu ersetzen, in der Hoffnung daß notify-send nun zwei Argumente bekommt:

a@w:~$ echo "$(ps $(xprop _NET_WM_PID | cut -d' ' -f3) | tail -1)" | cut -d' ' -f18- | sed -r -e 's/ /\n/2g' 
/opt/libreofficedev7.6/program/soffice.bin --writer
--splash-pipe=5
a@w:~$

Mit echo liefert das das Erwartete. Aber mit notify-send nicht:

a@w:~$ echo "$(ps $(xprop _NET_WM_PID | cut -d' ' -f3) | tail -1)" | cut -d' ' -f18- | sed -r -e 's/ /\n/2g' | xargs notify-send 
Unbekannte Option --writer
a@w:~$ echo "$(ps $(xprop _NET_WM_PID | cut -d' ' -f3) | tail -1)" | cut -d' ' -f18- | sed -r -e 's/ /\n/2g' | notify-send 
No summary specified.
a@w:~$ 

Marant--

Anmeldungsdatum:
4. April 2022

Beiträge: 744

| xargs -I{} notify-send {}

Frage nicht, nicht auf meinem Mist gewachsen.

4-Elster-4

(Themenstarter)

Anmeldungsdatum:
23. Oktober 2014

Beiträge: 109

Marant-- schrieb:

| xargs -I{} notify-send {}

Frage nicht, nicht auf meinem Mist gewachsen.

Das habe ich damit (erst mal mit echo) probiert:

a@w:~$ echo "$(ps $(xprop _NET_WM_PID | cut -d' ' -f3) | tail -1)" | cut -d' ' -f18- | sed -r -e 's/ /\n/g' # das liefert mehrere Zeilen
/opt/libreofficedev7.6/program/soffice.bin
--writer
file:///home/a/Schreibtisch/_Xubuntu_Versuche.odt
--splash-pipe=5
a@w:~$ echo "$(ps $(xprop _NET_WM_PID | cut -d' ' -f3) | tail -1)" | cut -d' ' -f18- | sed -r -e 's/ /\n/g' | xargs -I{} notify-send {} # Fehlermeldungen!
Unbekannte Option --writer
Unbekannte Option --splash-pipe=5
a@w:~$ 

Der zweite Versuch hat oben rechts zwei separate Meldungen erzeugt.

  1. /opt/libreofficedev7.6/program/soffice.bin

  2. file:///home/a/Schreibtisch/_Xubuntu_Versuche.odt

Wahrscheinlich habe ich Ihren Vorschlag nicht richtig verstanden. In man xargs fand ich:

-I replace-str Replace occurrences of replace-str in the initial-arguments with names read from standard input. Also, unquoted blanks do not terminate input items; instead the separator is the newline character. Implies -x and -L 1.

Ich habe deshalb versucht, den Pfad zum Programm in String $Q1 zu bekommen und den Rest in einen zweiten $QR. Das mache ich, indem ich die Ausgabe erst in ein Array $QQ lenke und davon einmal das erste Element nehme und dann den Rest. Die einzelnen Teilschritte funktionieren, nur der letzte nicht und da liegt es vielleicht am falschen Gebrauch von xargs:

a@w:~$ QQ=($(echo "$(ps $(xprop _NET_WM_PID | cut -d' ' -f3) | tail -1)" | cut -d' ' -f17-))
a@w:~$ echo ${QQ[@]}
/opt/libreofficedev7.6/program/soffice.bin --writer file:///home/a/Schreibtisch/_Xubuntu_Versuche.odt --splash-pipe=5
a@w:~$ Q1=${QQ[0]}                           # 1. Element
a@w:~$ echo $Q1
/opt/libreofficedev7.6/program/soffice.bin
a@w:~$ unset QQ[0]                           # 1. Element. entf, die anderen bleiben
a@w:~$ echo $QQ[*] | sed -r -e 's/ /\n/g'    # der ganze Rest umgebrochen
[*]
a@w:~$ echo ${QQ[*]} | sed -r -e 's/ /\n/g'  # der ganze Rest umgebrochen
--writer
file:///home/a/Schreibtisch/_Xubuntu_Versuche.odt
--splash-pipe=5
a@w:~$ notify-send $Q1                       # zeigt Benachr. mit dem Pfad zum Prog.                       
a@w:~$ notify-send $QR                       # das geht nicht
Unbekannte Option --writer
a@w:~$ notify-send $Q1 $QR                   # und das leider auch nicht!
Unbekannte Option --writer
a@w:~

Wie bekommt man das denn dann nun richtig an notify-send?

Marant--

Anmeldungsdatum:
4. April 2022

Beiträge: 744

Bsp.

echo "$(ps $(xprop _NET_WM_PID | cut -d' ' -f3) | tail -1)" | xargs -I{} notify-send {}
echo $(ps $(xprop _NET_WM_PID | cut -d' ' -f3) | tail -1) | xargs -I{} notify-send {}
ps $(xprop _NET_WM_PID | cut -d' ' -f3) | tail -1 | xargs -I{} notify-send {}

Würde Dir empfehlem einzelne Script Fragen so kurz wie mögl. zu halten und _hier_ zu stellen.

Marant--

Anmeldungsdatum:
4. April 2022

Beiträge: 744

#