ChickenLipsRfun2eat
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12067
|
rklm schrieb: Ja, aber das ist Quark. Die Command Substitution ist da fehl am Platz!
Ich teste das die Tage noch mal, ob es auch ohne geht (bei laufendem WM klappt es ohne). Vermutlich wäre korrekter den Rückgabewert mit "$?" zu prüfen und eventuelle Ausgaben umzuleiten?
Du musst Dir die Logik klar machen: der exit 0 wird nur ausgeführt, wenn Firefox nicht läuft, dann gestartet wird und mit Exit-Status 0 zurückkommt. Die ganze Logik, die Du da hast, macht nicht das, was Du vermutlich möchtest. So kommt er immer mit 0 aus der Zeile heraus:
Richtig. „Egal ob startbar oder nicht, beende immer mit 0.“, war das eigentliche Ziel. Dafür müsste ich aber einfach nur ;exit 0 oder || nehmen. Ich mutmaße mal, dass ich da geistig bei set -euo pipefail war, bei dem ich in Subshells öfter mal true zurückgeben muss, damit der Fehler-Rückgabewert nicht das Script beendet. Ich kann es dir jetzt auch nicht mehr wirklich erklären, was ich mir da gedachte hatte 😇
Dazu kommt noch, dass man den Firefox als graphisches Programm vermutlich gerne im Hintergrund starten will…
Ich weiß nicht, wie das beim firefox ist, da ich den nicht verwende, aber qutebrowser und falkon starten automatisch separat, ohne die Konsole zu blockieren. Möglicherweise liegt das an meinem Setup, damals musste ich auch immer das & verwenden, um separate Prozesse in den Hintergrund zu schicken. Gerade gestestet auf (K)Ubuntu20.04-Basis mit sway (aus den Quellen), das & unterdrückt lediglich den Errorcode 127 bis der Job zurückkehrt (also sichtbar ab der nächsten Eingabe). Ich kann dir jetzt aber nicht sagen, ob es an Wayland, der Terminal-Implementierung oder sonstwas liegt. Wenn ich was mit & in den Hintergrund schicke, muss ich ja noch ein disown ausführen, um den Prozess nicht mit abzuschiessen, oder nicht?
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12801
|
ChickenLipsRfun2eat schrieb: rklm schrieb: Ja, aber das ist Quark. Die Command Substitution ist da fehl am Platz!
Ich teste das die Tage noch mal, ob es auch ohne geht (bei laufendem WM klappt es ohne). Vermutlich wäre korrekter den Rückgabewert mit "$?" zu prüfen und eventuelle Ausgaben umzuleiten?
NEIN! Du musst einfach nur "$(" und ")" weglassen.
Du musst Dir die Logik klar machen: der exit 0 wird nur ausgeführt, wenn Firefox nicht läuft, dann gestartet wird und mit Exit-Status 0 zurückkommt. Die ganze Logik, die Du da hast, macht nicht das, was Du vermutlich möchtest. So kommt er immer mit 0 aus der Zeile heraus:
Richtig. „Egal ob startbar oder nicht, beende immer mit 0.“, war das eigentliche Ziel. Dafür müsste ich aber einfach nur ;exit 0 oder || nehmen.
Nein, Du brauchst den exit da nicht. Wenn Du Exit-Status 0 zurückgeben willst, selbst, wenn Du Firefox gestartet hast und er mit einem Fehler zurückgekommen ist, dann eine dieser Varianten: | pidof -q firefox || firefox || true
pidof -q firefox || firefox || :
pidof -q firefox || firefox || exit 0
pidof -q firefox || firefox; exit 0
|
Deine Variante leistet das nicht. Ich halte das allerdings auch für den falschen Ansatz, weil der einen Fehler unterdrückt.
Ich mutmaße mal, dass ich da geistig bei set -euo pipefail war, bei dem ich in Subshells öfter mal true zurückgeben muss, damit der Fehler-Rückgabewert nicht das Script beendet. Ich kann es dir jetzt auch nicht mehr wirklich erklären, was ich mir da gedachte hatte 😇
Das ist natürlich schlecht - vor allem für jemanden, der Hilfe sucht und dann womöglich nachfragt, was eine bestimmte Lösung bezwecken soll oder wie sie funktioniert.
Dazu kommt noch, dass man den Firefox als graphisches Programm vermutlich gerne im Hintergrund starten will…
Ich weiß nicht, wie das beim firefox ist, da ich den nicht verwende,
Bei mir geht er nicht selbständig in den Hintergrund.
aber qutebrowser und falkon starten automatisch separat, ohne die Konsole zu blockieren. Möglicherweise liegt das an meinem Setup, damals musste ich auch immer das & verwenden, um separate Prozesse in den Hintergrund zu schicken. Gerade gestestet auf (K)Ubuntu20.04-Basis mit sway (aus den Quellen), das & unterdrückt lediglich den Errorcode 127 bis der Job zurückkehrt (also sichtbar ab der nächsten Eingabe). Ich kann dir jetzt aber nicht sagen, ob es an Wayland, der Terminal-Implementierung oder sonstwas liegt. Wenn ich was mit & in den Hintergrund schicke, muss ich ja noch ein disown ausführen, um den Prozess nicht mit abzuschiessen, oder nicht?
Nicht generell. disown nimmt einen Job aus der Job Control der Shell. Wenn er im Hintergrund läuft, bekommt er sowieso keine Events vom Terminal, die aus Tastendrücken resultieren. Siehe Manpage der bash zu Job Control.
|
ChickenLipsRfun2eat
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12067
|
rklm schrieb: ChickenLipsRfun2eat schrieb:
…müsste ich aber einfach nur ;exit 0 oder || nehmen.
| pidof -q firefox || firefox || exit 0
pidof -q firefox || firefox; exit 0
|
Das meinte ich damit.
Deine Variante leistet das nicht. Ich halte das allerdings auch für den falschen Ansatz, weil der einen Fehler unterdrückt.
Jein. In dem Fall ist das ja richtig. Wenn das Programm nicht verfügbar ist, muss ich das Script abbrechen, da alles Weitere im Script sinnlos wäre. Es ist aber kein „Fehler“ das Programm nicht installiert zu haben und das auslösende Script soll deswegen ja auch nicht abbrechen. Den Rest nehme ich mir natürlich zu Herzen (die $() sind schon weg), möchte aber hier den Rahmen auch nicht sprengen. Es geht ja eigentlich™ noch um wmctrl . Danke für die Infos und Korrekturen!
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12801
|
ChickenLipsRfun2eat schrieb: rklm schrieb:
Deine Variante leistet das nicht. Ich halte das allerdings auch für den falschen Ansatz, weil der einen Fehler unterdrückt.
Jein. In dem Fall ist das ja richtig. Wenn das Programm nicht verfügbar ist, muss ich das Script abbrechen, da alles Weitere im Script sinnlos wäre. Es ist aber kein „Fehler“ das Programm nicht installiert zu haben und das auslösende Script soll deswegen ja auch nicht abbrechen.
Das klingt widersprüchlich: Du sagst, dass "alles Weitere im Script sinnlos wäre" aber auch, "das auslösende Script soll deswegen ja auch nicht abbrechen". Wenn ein Skript davon abhängt, dass ein Programm läuft oder erfolgreich gestartet werden kann, dann ist es doch egal, ob es nicht gestartet werden kann, weil es fehlt, oder mit einer Fehlermeldung zurückkommt. Ich müsste wohl Dein ganzes Skript sehen um zu verstehen, was Du da vorhast. Aber vermutlich sind wie hier wirklich schon off-topic.
|
ChickenLipsRfun2eat
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12067
|
rklm schrieb: …"alles Weitere im Script sinnlos wäre" aber auch, "das auslösende Script soll deswegen ja auch nicht abbrechen".…
Ja, ein Script, welches ein anderes aufruft. Aber ist an der Stelle wirklich weit weg vom Thema 😉
|
FreierBrokolli
(Themenstarter)
Anmeldungsdatum: 28. Mai 2021
Beiträge: Zähle...
|
ChickenLipsRfun2eat schrieb:
… \
Wie ändere ich die If Abfrage, dass erkannt wird wenn "firefox" teil vom String "WM_CLASS(STRING) = "firefox-esr", "Firefox-Navigator"" ist?
Genau mit der Abfrage. | wmclass='WM_CLASS(STRING) = "firefox-esr", "Firefox-Navigator"';app="firefox"; if [[ "$wmclass" == *"$app"* ]]; then echo enthalten; else echo nicht enthalten; fi
|
Die Abfrage stimmt also. Falls das nicht klappt, lass dir testweise die Strings ausgeben, die verarbeitet werden (wie im obigen Beispiel). Beachte, dass das case-sensitive ist, also Groß- und Kleinschreibung wichtig ist. Firefox würde klappen, fireFox hingegen nicht. Sollte in deiner Abfrage aber keine Rolle spielen, da du ja die Prozessnamen verwendest.
Vielen Dank!!! Wird mit deiner Abfrage nicht kontrolliert ob 'WM_CLASS(STRING) = "firefox-esr", "Firefox-Navigator"' in "firefox" vorkommt? Es sollte grundsätzlich ja umgekehrt sein. Gibt es einen Befehl um die If Abfrage unabhängig von der Großschreibung zu machen? Ich möchte nämlich weg vom Prozessnahmen und hin zur WM_Class, weil dann funktionieren auch die Flatpaks ☺
|
ChickenLipsRfun2eat
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12067
|
FreierBrokolli schrieb: Wird mit deiner Abfrage nicht kontrolliert ob 'WM_CLASS(STRING) = "firefox-esr", "Firefox-Navigator"' in "firefox" vorkommt? Es sollte grundsätzlich ja umgekehrt sein. Gibt es einen Befehl um die If Abfrage unabhängig von der Großschreibung zu machen?
Liest sich eher so:
if [[ "asdfghjk" == *"d"* ]]; then echo jup; fi WENN [ ["asdfghjk" enthält "„irgendwas“ d “irgendwas"] == WAHR]; dann gib jup aus. Wie genau das in der Bash umgesetzt ist, weiß ich auch nicht. In C kann ich das darstellen; da prüft man Zeichenketten Zeichen für Zeichen. Also sowas wie 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 | #include <stdio.h>
#include <string.h>
int main( int argc, char **argv ) {
if( ! argv[1] ) { // falls kein Argument übergeben wurde
printf( "Zeichen als Argument eingeben!\n" );
return 127;
}
char ausdruck[] = "asdfghjk";
char suchzeichen = argv[1][0]; // das erste Zeichen des ersten Argumentes
for( size_t i=0; i < strlen( ausdruck ); ++i ) {
if( ausdruck[i] == suchzeichen ) {
printf( "%c gefunden an Stelle %lu\n", suchzeichen, i );
return 0;
}
}
printf( "Zeichen %c wurde nicht gefunden.\n", suchzeichen );
return 1;
}
|
Die Funktion hat einen festen Suchstring (könnte man natürlich auch als Argument übergeben) und sucht dann das erste Zeichen der Eingabe. Wenn du das kompilierst, etwa so: | gcc zeichen.c
./a.out Hier wird das erste Zeichen genommen und der Rest weggeworfen
# Ausgabe ist dann „Zeichen H wurde nicht gefunden.“
|
Das C-Beispiel müsste um den String „firefox“ zu finden bspw. zunächst ermitteln, wo sich das 'f' befindet. Wenn es keins gibt, ist die Aussage falsch. Ansonsten wird geprüft, ob an Position von 'f' + 1 ein 'i' steht. Wenn nicht, falsch, ansonsten weiter, etc. Die Bash hat also den Ausdruck „WM_CLASS…etc.“ und den Vergleichsstring mit Platzhaltern vorne und hinten, muss also innerhalb des Ausdruckes die Zeichenkette suchen.
Ich möchte nämlich weg vom Prozessnahmen und hin zur WM_Class, weil dann funktionieren auch die Flatpaks ☺
Wenn es eine WM_Class gibt. Also theoretisch müsstest du dann eins nach dem anderen prüfen. Wenn WM_Class, dann prüfe auf diese, wenn nicht, prüfe auf PID, etc.
Nachtrag / Anmerkung: Die C-Funktion kann nur mit Standardzeichen umgehen. Bei Umlauten, etc. kommen schlecht lesbare Resultate raus 😉 Dafür müsste man das ganze etwas aufbauschen und mit wchar_t, etc. arbeiten.
|
FreierBrokolli
(Themenstarter)
Anmeldungsdatum: 28. Mai 2021
Beiträge: 10
|
Tut mir leid für die späte Rückmeldung aber das Skript lief ja schon ☺ Vielen Dank für die Hilfe @ChickenLipsRfun2eat! Im Moment nutze ich mein Skript, weils genau das macht was ich will. Für alle die das selbst ausprobieren wollen - Ich habe in der Zwischenzeit eine fertige Lösung gefunden: https://github.com/mkropat/jumpapp -m -- if a single window is already open and in focus - minimize it Thread wurde von mir als gelöst markiert.
|