ubuntuusers.de

shell script funktioniert im terminal, aber nicht in 'Conky' (conky.conf)

Status: Gelöst | Ubuntu-Version: Ubuntu MATE 22.04 (Jammy Jellyfish)
Antworten |

pilzgrow

Avatar von pilzgrow

Anmeldungsdatum:
25. März 2008

Beiträge: 635

Frohe Ostern liebe Leute, ich möchte mit folgendem kleinen script den 'status' vom Program 'radiotray' in meinem 'Conky' anzeigen:

1
2
3
4
5
6
7
8
 #!/bin/sh
set -x;
state=$(qdbus net.sourceforge.radiotray /net/sourceforge/radiotray net.sourceforge.radiotray.getCurrentRadio);
if [[ $state == *"(not playing)" ]] ;
then echo "Bereit" ;
else echo $state ;
fi
 

Im terminal gibt das script wie erwartet "Bereit" aus:

1
2
3
4
5
6
7
pilzgrow@pilzgrow-system:~$
 '/home/pilzgrow/.config/conky/state.sh' 
+++ qdbus net.sourceforge.radiotray /net/sourceforge/radiotray net.sourceforge.radiotray.getCurrentRadio
++ state='Psyradio-alternativ (not playing)'
++ [[ Psyradio-alternativ (not playing) == *\(\n\o\t\ \p\l\a\y\i\n\g\) ]]
++ echo Bereit
Bereit

Ich binde das script mit

 ${execi 2 ~/.config/conky/state.sh} 

in die conky.conf ein

Conky -D gibt dann :

pilzgrow@pilzgrow-system:~$ Conky -D
...
+ qdbus net.sourceforge.radiotray /net/sourceforge/radiotray net.sourceforge.radiotray.getCurrentRadio
+ state=Psyradio-alternativ (not playing)
+ [[ Psyradio-alternativ (not playing) == *(not playing) ]]
/home/pilzgrow/.config/conky/state.sh: 4: [[: not found
+ echo Psyradio-alternativ (not playing)
...

aus - die 'if'-Bedingung wird nicht ausgewertet und '$state' ausgegeben. Wo ist hier mein Denk-/ Syntax Fehler?

TK87

Anmeldungsdatum:
8. Juli 2019

Beiträge: 301

Wohnort: Aachen

Moin und ebenfalls frohe Ostern @all.

pilzgrow schrieb:

1
 #!/bin/sh

[[ ]] gibt es bei sh nicht. Dafür musst du schon eine andere Sprache (z.B. bash, zsh, ...) verwenden.

Gruß Thomas

pilzgrow

(Themenstarter)
Avatar von pilzgrow

Anmeldungsdatum:
25. März 2008

Beiträge: 635

Hi TK87,

Danke für Deine Antwort. Wenn ich das script mit

${execi 2 /bin/bash ~/.config/conky/state.sh }

in die 'conky.conf' einbinde, funktioniert es, wie gewünscht - Wieder was gelernt.

TK87

Anmeldungsdatum:
8. Juli 2019

Beiträge: 301

Wohnort: Aachen

pilzgrow schrieb:

Wenn ich das script mit

${execi 2 /bin/bash ~/.config/conky/state.sh }

in die 'conky.conf' einbinde, funktioniert es,

Den Shebang im Skript zu ändern hätte eigentlich schon gereicht. Sinnigerweise benennt man das Skript aber dann auch mit der Endung .bash, damit man zukünftig nicht selbst wieder drüber stolpert.

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4773

Wohnort: Berlin

@pilzgrow: Neben dem falschen She-Bang sind da auch ein Haufen überflüssiger Semikolons im Quelltext. Shell-Skript ist nicht C/C++/Java oder welche Sprachen auch sonst noch ein Semikolon als Abschluss einer Anweisung benutzen und brauchen. In Shell-Skripten ist das ein Trenner zwischen Anweisungen in der gleichen Zeile. Falls danach keine weitere Anweisung kommt, macht das Semikolon keinen Sinn.

Um das $state beim echo würde ich noch doppelte Anführungszeichen setzen und noch ein -- davor setzen, damit die Shell da nicht vorher noch Sachen mit macht, und damit etwas was wie Optionen aussieht, nicht von echo interpretiert wird. Beziehungsweise ist printf an der Stelle besser/sicherer als echo.

Ungetestet:

1
2
3
4
5
#!/bin/bash
set -x
state=$(qdbus net.sourceforge.radiotray /net/sourceforge/radiotray net.sourceforge.radiotray.getCurrentRadio)
[[ $state == *"(not playing)" ]] && state=Bereit
printf %s "$state"

TK87

Anmeldungsdatum:
8. Juli 2019

Beiträge: 301

Wohnort: Aachen

Marc_BlackJack_Rintsch schrieb:

1
printf %s "$state"

Da fehlt noch der Zeilenumbruch am Ende

1
2
3
4
printf "%s\n" "$state"

# oder alternativ
printf %s\\n "$state"

Zudem könnte man das set -x noch gleich mit in den Shebang packen

1
#!/bin/bash -x

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13323

TK87 schrieb:

Zudem könnte man das set -x noch gleich mit in den Shebang packen

1
#!/bin/bash -x

Kann man, aber der Vorteil der verwendeten Variante (set -x) ist, dass das auch funktioniert, wenn das Script explizit mit einer Shell aufgerufen wurde. Gemeint ist so etwas wie

1
$ bash das_script

Ich mache typischerweise dieses in meinen Skripten am Anfang:

1
[ -z "$DEBUG" ] || set -x

Dann kann man das Skript so aufrufen, um Debug-Ausgaben zu bekommen

1
$ DEBUG=x bash das_script

Das schöne ist, dass diese Variable über das Environment vererbt wird, so dass man Debug-Ausgaben auch von Skripten bekommt, die vom ersten Skript aufgerufen werden (sofern sie dasselbe Muster verwenden).

Antworten |