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
|
ChickenLipsRfun2eat
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12067
|
Hallo! Du suchst nur ein Tool zum umrechnen Dec/Hex? man bc ist dein Freund. Simple Beispiele: | 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
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12801
|
Die Shebang-Zeile muss so aussehen:
|
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
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
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
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12067
|
Habe mir die Ausgaben mal angesehen. Da kommt das bei raus. bc funktioniert auch wie erwartet.
| 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
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: | 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:
| #!/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. | ~/.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 | 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.
| 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
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: | 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: | $(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 IIDas 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. | 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
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12801
|
ChickenLipsRfun2eat schrieb:
Das obige Beispiel könntest du auch so schreiben: | $(pidof firefox) || firefox && exit 0
|
Das ist eine schlechte Idee, denn das führt zu Fehlern: | $ $(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: | 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
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) | $(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
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12801
|
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) | $(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: | pidof -q firefox || firefox
|
Dazu kommt noch, dass man den Firefox als graphisches Programm vermutlich gerne im Hintergrund starten will. Dann | pidof -q firefox || firefox &
|
Auch das kommt immer mit 0 zurück.
|