ubuntuusers.de

wmctrl xdotools - selbstgeschriebener Programm Starter

Status: Gelöst | Ubuntu-Version: Ubuntu 18.04 (Bionic Beaver)
Antworten |

FreierBrokolli

Anmeldungsdatum:
28. Mai 2021

Beiträge: 10

Hallo ich bin gerade dabei mir ein Skript zu erstellen mit dem ich folgendes realisieren möchte:

Taste "X" steuert folgenden Prozess:

  • Wenn das zu startente Programm nicht bereits läuft - starte es

  • Wenn das Programm bereits läuft aber nicht fokusiert ist - fokusiere es

  • Wenn das Programm fokusiert ist (und läuft) - minimiere es.

Ich habe das ganze schon beinahe beisammen:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
!/bin/bash

#Get focused window

focused_wid=$(xdotool getactivewindow)

# Get list of windows with the name which we want to launch or minimize

xdotool search --name "$1" > /tmp/widids


# Check if the window is in the list (returns nothing if it's not)

focused_wid=$(awk -v var="$focused_wid" '$0 ~ var' /tmp/widids)


# Check if awk returned something

case "$focused_wid" in

    # If it didn't launch the program

    "") wmctrl -xa "$1" || "$2" & disown ;;

    # If did minimize the window

    *) xdotool windowminimize "$focused_wid" ;;

esac

Das ganze funktioniert solange das Programm seinen Namen im "Window Name" hat z.B: Ein Firefox Prozess hat immer den Namen Firefox enthalten aber z.B. der File Manager Nemo hat im Prozess nicht "Nemo" stehen - das heißt im Umkehrschluss für mich, dass Ich Nemo mit meinem obigen Skript nicht minimieren kann...

Ein Ansatz war bis jetzt, dass ich nicht über den Namen gehe sondern über die PID. Problem hierbei ist, dass xdotools mit ganzen Zahlen arbeitet und wmctrl mit Hexadezimal.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/bin/bash

# Get focused window PID

focused_wid=$(xprop -root | awk '/_NET_ACTIVE_WINDOW(WINDOW)/{print $NF}')

# LIST all windows PIDs

wmctrl -l | awk '{print $1}' > /tmp/widids



# AB hier ist der Code falsch bzw. nicht kombatibel. Ich verstehe die awk Zeile auch nicht ganz...

# Check if the window is in the list (returns nothing if it's not)

focused_wid=$(awk -v var="$focused_wid" '$0 ~ var' /tmp/widids)

# Check if awk returned something

case "$focused_wid" in

    # If it didn't launch the program

    "") wmctrl -xa "$1" || "$1" & disown ;;

    # If did minimize the window; Hier entsteht ein Problem weil xdotool die Hexadezimal nicht lesen kann

    *) xdotool windowminimize "$focused_wid" ;;

esac

Würde mich sehr freuen wenn mir jemand hier weiterhelfen könnte ☺

LG

Bearbeitet von ChickenLipsRfun2eat:

Aus dem Spamfilter gefischt.

ChickenLipsRfun2eat Team-Icon

Anmeldungsdatum:
6. Dezember 2009

Beiträge: 12067

Hallo!

Du suchst nur ein Tool zum umrechnen Dec/Hex? man bc ist dein Freund. Simple Beispiele:

1
2
3
4
user@emacsos[~/Projekte]› echo "ibase=10;obase=16;54321" | bc
D431
user@emacsos[~/Projekte]› echo "ibase=16;D431" | bc
54321

base=10 ist übrigens Standard, das muss man nicht angeben. Ist so nur anschaulicher.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13365

Die Shebang-Zeile muss so aussehen:

1
#!/bin/bash

FreierBrokolli

(Themenstarter)

Anmeldungsdatum:
28. Mai 2021

Beiträge: 10

Vielen dank für eure Antworten!

xdotool liefter mir z.B. als PID 2925. Ich schaffe es nun mit bc aber nicht diese Zahl in dieses Format zu bringen: 0x03000006.

echo 'obase=16; 2925' | bc lieftert mir z.B. B6D (Decimal zu Hex)

Ist das doch nicht möglich so wie ich mir das vorstelle?

ChickenLipsRfun2eat Team-Icon

Anmeldungsdatum:
6. Dezember 2009

Beiträge: 12067

Hallo!

Ich glaube du brauchst da eh die Window-ID, nicht die Prozess-ID. wmctrl Manpage sagt:

Toggle the 'stickiness' of a window with a specific window identity
wmctrl -i -r 0x0120002 -b add,sticky

Da dürfte das einfachste wohl sein, die Ausgabe von wmctrl -l zu parsen oder ggf. xwininfo. Welchen Fenstermanager verwendest du denn? ubuntu-desktop? Eventuell bietet dieser eine DBus-Methode an, die du nutzen kannst.

FreierBrokolli

(Themenstarter)

Anmeldungsdatum:
28. Mai 2021

Beiträge: 10

Hi,

stimmt, das wäre natürlich einfacher wenn ich gleich bei wmctrl bleiben könnte. Aber nach etwas googlen scheint es so als könnte man mit wmctrl nicht minimieren.

Weil add,sticky ruft ja nicht das gewünschte Verhalten hervor?

Heißt ich bin doch wieder beim umwandeln Hex/Dec oder?

Mein Fenstermanager ist openbox ☺

Mein aktueller Skriptansatz:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

#!/bin/bash

# Get focused window PID

focused_wid=$(xdotool getactivewindow getwindowpid)

# LIST all windows PIDs

wmctrl -l -p | awk '{print $3}' > /tmp/widids



# AB hier ist der Code falsch bzw. nicht kombatibel. Ich verstehe die awk Zeile auch nicht ganz...

# Check if the window is in the list (returns nothing if it's not)

focused_wid=$(awk -v var="$focused_wid" '$0 ~ var' /tmp/widids)

# Check if awk returned something

case "$focused_wid" in

    # If it didn't launch the program

    "") wmctrl -xa "$1" || "$1" & disown ;;

    # If did minimize the window; Hier entsteht ein Problem weil xdotool die Hexadezimal nicht lesen kann

    *)xdotool windowminimize "$focused_wid" ;;
esac

ChickenLipsRfun2eat Team-Icon

Anmeldungsdatum:
6. Dezember 2009

Beiträge: 12067

Ich habe heute leider ausschließlich reine Wayland-Systeme im Zugriff, daher kann ich nur Manpages lesen 😉 Morgen kann ich das aber gerne mal ausprobieren (hab beides noch nicht verwendet).

Deinen Code mal erklärdokumentiert:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
focused_wid=$(xdotool getactivewindow getwindowpid)
# speichert das aktive Fenster im WINDOW STACK und die
# Variable enthält die prozess-id des Fensters

#…

focused_wid=$(awk -v var="$focused_wid" '$0 ~ var' /tmp/widids)
# Der oben generierte Inhalt von $focused_wid (getwindowpid) wird zunächst übernommen, 
# an awk in einer Subshell( $() ) als Variable übergeben (-v var=…) und dann per RegEx (~)
# mit dem Inhalt von /tmp/widids abgeglichen. Das $0 wird von awk interpretiert!
# Das Ergebnis dieser awk-Abfrage landet in $focused_wid und überschreibt damit 
# das vorherige Ergebnis von getwindowpid

#…

ChickenLipsRfun2eat Team-Icon

Anmeldungsdatum:
6. Dezember 2009

Beiträge: 12067

Habe mir die Ausgaben mal angesehen. Da kommt das bei raus. bc funktioniert auch wie erwartet.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
plasma@neonvm[/tmp]> wmctrl -lp
0x02000015 -1 5454   x220 Desktop — Plasma
0x02000028 -1 5454   x220 Plasma
0x00600038  0 5803   x220 Neue Antwort › wmctrl xdotools - selbstgeschriebener Programm Starter › Shell und Programmieren › Fortgeschrittene Themen › Forum › ubuntuusers.de - Falkon
0x04200006  0 7405   x220 shared.kdbx - KeePassXC
0x02c00007 -1 5569   x220 tmp : bash — Yakuake
plasma@neonvm[/tmp]> echo 'obase=16;'$(xdotool getactivewindow) | bc
2C00007
plasma@neonvm[/tmp]> sleep 1;echo 'obase=16;'$(xdotool getactivewindow) | bc
600038
plasma@neonvm[/tmp]> 

Was übergibst du denn genau an Argumenten?

FreierBrokolli

(Themenstarter)

Anmeldungsdatum:
28. Mai 2021

Beiträge: 10

Hi,

danke für deinen ganzen Input! ☺

Bin wirklich kompletter Bash Laie. Nur damit du weißt woher das Chaos kommt 😀

Also ich habe das Skript jetzt nochmal etwas modifiziert und kann mir die Berechnungen nun ersparen aber sieh selbst:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/bin/bash
    # Get focused window
    focused_wid=$(xdotool getactivewindow)
# Get focused window class
    focused_wm_class=$(xprop -id $(xprop -root _NET_ACTIVE_WINDOW | cut -d ' ' -f 5) WM_CLASS)
    # And list of windows
    xdotool search --class . > /tmp/widids

    #folgende if abfrage soll mir verifiezeren, dass das minimieren nur gestartet wird wenn z.B. es sich um ein Firefox Fenster handelt.
if [[ "$1" == *"$focused_wm_class"* ]]
then
	# Check if the window is in the list (returns nothing if it's not)
	
   $focused_wid=$(awk -v var="$focused_wid" '$0 ~ var' /tmp/widids)
else
$focused_wid=""
fi
    # Check if awk returned something
    case "$focused_wid" in
        # If it didn't launch the program
        "") wmctrl -xa "$1" || "$2" & disown ;;
        # If did minimize the window
        *) xdotool windowminimize "$focused_wid" ;;
    esac

Die WM-Klasse hole ich mir, um eine zusätzliche Verifizierung zu haben, da ich mir nun mit "xdotool search --class . > /tmp/widids" alle Fenster in die Datei lade.

Wenn ich nun das Skript starte mit z.B. "bash runraisehide firefox firefox", dann gleicht er das Wort firefox mit dem aktiven Fenster ab (WM-Klasse). So möchte ich verhindern, dass ein Fenster minimiert wird, welches nicht angesprochen werden soll.

Leider wird im Moment noch jedes Fenster minimiert und ich schnalle nicht ganz wieso...

Update: Scheinbar liefert die Zeile "focused_wm_class=$(xprop -id $(xprop -root _NET_ACTIVE_WINDOW | cut -d ' ' -f 5) WM_CLASS)" keinen Output. Im Terminal funktioniert es :/

ChickenLipsRfun2eat Team-Icon

Anmeldungsdatum:
6. Dezember 2009

Beiträge: 12067

FreierBrokolli schrieb:

Bin wirklich kompletter Bash Laie. Nur damit du weißt woher das Chaos kommt 😀

Ich bemerke kein Chaos. Durch die Bash wurschtele ich mir auch eher schlecht als recht durch 😉
Also du übergibst als Argument zweimal firefox? Hast du mal ein Beispiel, bei dem das zweite Argument nicht gleich dem ersten ist?

Die WM-Klasse hole ich mir, um eine zusätzliche Verifizierung zu haben, da ich mir nun mit "xdotool search --class . > /tmp/widids" alle Fenster in die Datei lade.

Ja, das habe ich verstanden. Ich überlege nur, ob ich den Ansatz auch nehmen würde. An sich speichert xdotool ja die letzte Abfrage selbst intern, so dass sich das weiterverwenden lässt. Du hast ja Dank getactivewindow das gerade aktive Fenster im Zugriff, musst dich bei Verwendung dessen an sich nicht auf eventuell weitere offne Instanzen kümmern.
Wenn du das binary als Agument übergibst ( wie im Bsp. firefox ), sollte es ja reichen, wenn du $(pidof firefox) || firefox && exit 0 ausführst. Liest sich so: firefox muss eine pid haben ODER ausgeführt werden und das script beendet. Sobald du das mit "$1" machst, musst du aber sicherstellen, dass es ein Argument gibt.

Wenn es bereits einen Feuerfuchs (oder mehrere) gibt, wird die pid(-Liste) verworfen — bzw. müsste unter "$_" verfügbar sein — und der ODER-Zweig wird nicht ausgeführt.

Wenn ich nun das Skript starte mit z.B. "bash runraisehide firefox firefox", dann gleicht er das Wort firefox mit dem aktiven Fenster ab (WM-Klasse). So möchte ich verhindern, dass ein Fenster minimiert wird, welches nicht angesprochen werden soll.

Mir hilft es immer, wenn ich die Teile erst mal voneinander trenne und (geistig) Variablen ausfülle. Bspw so:

1
2
3
4
5
6
7
8
9
focused_wid=$(xdotool getactivewindow)
  # → lange Zahl

focused_wm_class=$(xprop -id $(xprop -root _NET_ACTIVE_WINDOW | cut -d ' ' -f 5) WM_CLASS)
  # → WM_CLASS(STRING) = "yakuake", "yakuake"
…
if [[ "$1" == *"$focused_wm_class"* ]]
# $1 ist das erste übergebene Argument, also in deinem Fall firefox
…

Auch beachten: Was passiert, wenn das tool ohne Argumente aufgerufen wird?

Leider wird im Moment noch jedes Fenster minimiert und ich schnalle nicht ganz wieso...

Du hast auf jeden Fall einen Dreher drin bei "$1" == *"$focused_wm_class"*. Das kann nicht stimmen, s.u.

Update: Scheinbar liefert die Zeile "focused_wm_class=$(xprop -id $(xprop -root _NET_ACTIVE_WINDOW | cut -d ' ' -f 5) WM_CLASS)" keinen Output. Im Terminal funktioniert es :/

Die funktioniert auch im Script. Schreib dir Debug-Ausgaben dafür:

1
2
3
4
5
6
#!/bin/bash
focused_wm_class=$(xprop -id $(xprop -root _NET_ACTIVE_WINDOW | cut -d ' ' -f 5) WM_CLASS)

printf 'DEBUG: if [[ "%s" == *"%s"* ]]; then \n' "$focused_wm_class" "$1"

if [[ ! "$focused_wm_class" == *"$1"* ]]; then printf "NO "; fi; echo match

FreierBrokolli

(Themenstarter)

Anmeldungsdatum:
28. Mai 2021

Beiträge: 10

Danke für die netten Worte!

Zwei Argumente benötige ich nur bei Flatpak Anwendungen z.B.

1
~/.scripts/run-raise.sh 'vscodium' 'flatpak run com.vscodium.codium'

Deinen zweiten Absatz habe ich leider nicht verstanden.

Nichtsdestotrotz habe ich aber nun ein funktionierendes Skript!!!! Zumindest fast 😀

Es funktioniert bei allen Apps außer Flatpaks

Der Code:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/bin/bash



    # Get focused window
    focused_wid=$(xdotool getactivewindow)
# Get focused window class
    focused_wm_class=$(cat /proc/$(xdotool getwindowpid $(xdotool getwindowfocus))/comm)
    # And list of windows
    xdotool search --class . > /tmp/widids

    
if [[ "$focused_wm_class" == *"$1"* ]];
then
	# Check if the window is in the list (returns nothing if it's not)
	
   $focused_wid=$(awk -v var="$focused_wid" '$0 ~ var' /tmp/widids)
  $(xdotool windowminimize "$focused_wid")
   
else
$(wmctrl -xa "$1" || "$2")
fi

Flatpaks lassen sich starten aber nicht minimieren. Ich vermute dass das Problem bei

1
focused_wm_class=$(cat /proc/$(xdotool getwindowpid $(xdotool getwindowfocus))/comm)

Hier spucken Flatpaks womöglich nichts aus. Zum debuggen war ich leider nicht schlau genug...

Aber mein Ansatz wäre jetzt sowieso diese obige Zeile zu ersetzen und wirklich die WM_CLASS zu holen, weil da oben hole ich mir den Prozessnamen oder so.

z.B.

1
2
winid=$(xdotool getactivewindow)
winclass=$(xprop -id "$winid" | grep WM_CLASS)

Das würde funktionieren aber dann funktioniert meine IF Abfrage nicht - bei dieser hätte ich nun auch eine Frage: if [[ "$focused_wm_class" == *"$1"* ]];

Diese Zeile sollte folgendes bedeuten: Wenn mein Argument (z.b: firefox) in dem String focused_wm_class vorkommt, dann führe die Minimierungsschritte aus. Also wichtig ist dass es eben true ist wenn mein Argument nur ein Teil des Text ist. Die WM_CLASS Könnte ja z.B. so heißen WM_CLASS(STRING) = "xterm", "XTerm" < Da sollte wäre jetzt mein Argument "xterm". Es würde also in dieser Textkette vorkommen = true

Wie ändere ich die If Abfrage, dass erkannt wird wenn "firefox" teil vom String "WM_CLASS(STRING) = "firefox-esr", "Firefox-Navigator"" ist?

ChickenLipsRfun2eat Team-Icon

Anmeldungsdatum:
6. Dezember 2009

Beiträge: 12067

Teil I

FreierBrokolli schrieb:

Deinen zweiten Absatz habe ich leider nicht verstanden.

Ein Programm hat immer einen Rückgabewert. 0 bedeutet dabei (in dem Fall) erfolgreich, ein Wert ungleich 0 irgendeinen Fehler. Wenn du also $(pidof PROGRAMM) ausführst, gibt das Programm zwar auf dem Terminal die PID oder Fehlermeldung aus, hat aber auch zusätzlich diese return value, den Rückgabewert.
Eine if-Abfrage braucht immer eine wahr/falsch-Bedingung um abzweigen zu können, in dem Fall nehme ich also den Rückgabewert. Das könntest du auch so schreiben:

1
pid=$(pidof michgibtesgarnicht);rwert=$?;echo "::$pid::$rwert::"

Die Ausgabe wäre dann „::::1::“, da $pid leer bleibt und $rwert den Rückgabewert 1 liefert (Fehler). Mit einem existenten Programm wäre das dann bspw. ein „::12345::0::“, da er eine Prozess-ID findet und den Rückgabewert 0 (erfolgreich) zurückgibt. Oder bei mehreren Instanzen die Liste der ids „::12345 12346 12347::0::“.

Das obige Beispiel könntest du auch so schreiben:

1
2
3
4
5
6
7
$(pidof firefox) || firefox && exit 0

# entspricht (fast¹)
if [ "$(pidof firefox)" == "" ]; then 
  firefox # ff starten
  exit 0  # erfolgreich beenden
fi

¹: Fast, weil im ersten Befehl firefox gestartet wird und nur wenn dieser erfolgreich gestartet wird, wird exit 0 ausgeführt. a && b prüft, ob beide Bedingungen wahr sind. Ist die erste falsch, wird die zweite gar nicht mehr beachtet, weil es insgesamt nicht mehr wahr werden kann, so funktioniert auch die Kurzschreibweise. Wenn firefox schon eine PID hat, dann ist der Ausdruck auf jeden Fall wahr, egal ob das nach dem oder (||) wahr oder falsch ist. Daher wird der zweite Teil gar nicht erst ausgeführt.

Kommst du damit zurecht?


Teil II

Das würde funktionieren aber dann funktioniert meine IF Abfrage nicht - bei dieser hätte ich nun auch eine Frage: if [[ "$focused_wm_class" == *"$1"* ]]; \ … \ 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.

1
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.


Teil III

…Zum debuggen war ich leider nicht schlau genug...

Das hat mit schlau weniger was zu tun, eher mit dem Ansatz und dem (Vor-)Wissen. Du kannst dir fast alle Informationen einfach ausgeben lassen, bau dir notfalls Hilfsvariablen ein oder schreib echo vor eine Zeile, um sie nicht auszuführen, sondern zu sehen, was passiert.

Das einzige, was du in dem Fall nicht machen darfst, ist separat nochmal xdotool aufrufen, um die im WINDOW STACK gespeicherte Fenster-ID nicht zu verwenden (und damit daraus zu löschen).

Wenn du Fragen dazu hast, wie du einen konkreten Teil ausgeben lassen kannst, frag ruhig.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13365

ChickenLipsRfun2eat schrieb:

Das obige Beispiel könntest du auch so schreiben:

1
$(pidof firefox) || firefox && exit 0

Das ist eine schlechte Idee, denn das führt zu Fehlern:

1
2
3
$ $(pidof bash) || echo or
8305: command not found
or

Die Shell versucht nämlich das, was da zurückgeliefert wird (also eine PID, wenn ein passender Prozess gefunden wird) auszuführen. Besser ist:

1
pidof -q firefox || firefox && exit 0

Das && exit 0 am Ende ergibt aber nur Sinn, wenn da noch weitere Anweisungen folgen, die nicht ausgeführt werden sollen, wenn der firefox gelaufen ist und mit OK zurückkommt.

ChickenLipsRfun2eat Team-Icon

Anmeldungsdatum:
6. Dezember 2009

Beiträge: 12067

rklm schrieb:

Das ist eine schlechte Idee, denn das führt zu Fehlern … && exit 0 am Ende ergibt aber nur Sinn…

Danke! Das mit -q hatte ich tatsächlich verdrängt. Danke für die Korrektur!

Ich nutze das bspw. so: (Kommentare für den TE)

1
2
3
$(pidof -q sway) || exit 0  # Wenn der Fenstermanager sway nicht läuft, beende kommentarlos.
swaymsg '[app_id="IRC"] focus' && exit 0  # Wenn das Terminal für IRC schon läuft, wechsle hin und beende, ansonsten
swaymsg 'workspace irc; exec alacritty --class IRC -t IRC;[app_id="IRC"] focus'  # starte das Terminal und wechsle hin

Das obige war nur die Erklärung zu dem, was ich davor geschrieben hatte, deswegen habe ich da auch nichts ausprobiert… Sollte ich wohl immer tun 😉 Und exit 0 nehme ich in dem Fall, weil es ja kein Fehler ist, dass das Programm schon läuft (oben firefox, bei mir sway), es hat nur lediglich nichts zu tun.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13365

ChickenLipsRfun2eat schrieb:

rklm schrieb:

Das ist eine schlechte Idee, denn das führt zu Fehlern … && exit 0 am Ende ergibt aber nur Sinn…

Danke! Das mit -q hatte ich tatsächlich verdrängt. Danke für die Korrektur!

Du hast sie unten nur halb aufgenommen.

Ich nutze das bspw. so: (Kommentare für den TE)

1
2
3
$(pidof -q sway) || exit 0  # Wenn der Fenstermanager sway nicht läuft, beende kommentarlos.
swaymsg '[app_id="IRC"] focus' && exit 0  # Wenn das Terminal für IRC schon läuft, wechsle hin und beende, ansonsten
swaymsg 'workspace irc; exec alacritty --class IRC -t IRC;[app_id="IRC"] focus'  # starte das Terminal und wechsle hin

Ja, aber das ist Quark. Die Command Substitution ist da fehl am Platz!

Das obige war nur die Erklärung zu dem, was ich davor geschrieben hatte, deswegen habe ich da auch nichts ausprobiert… Sollte ich wohl immer tun 😉

Ja, das ist enorm hilfreich. 😉

Und exit 0 nehme ich in dem Fall, weil es ja kein Fehler ist, dass das Programm schon läuft (oben firefox, bei mir sway), es hat nur lediglich nichts zu tun.

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:

1
pidof -q firefox || firefox

Dazu kommt noch, dass man den Firefox als graphisches Programm vermutlich gerne im Hintergrund starten will. Dann

1
pidof -q firefox || firefox &

Auch das kommt immer mit 0 zurück.

Antworten |