• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Script: Programme starten funktioniert nicht. (bash)

HPF-84E

Member
Hallo,

kurzes Vorwort: Ich beschäftige mich mit „Icewm" als Windowmanager.
Habe mich auch ganz gut eingearbeitet. Da ich aber keine Lust habe mir
Tray-Programme (Lautstärke, Bluetooth u.s.w.)mit „make" für das Panel zu
installieren hatte ich mir gedacht ich mache das einfach per Skript
welches ich dann z.B. mit Xterminal starten könnte. Dieses muss ich dann
nur noch deaktiviert in den autostart packen aber das ist dann ein anderes
Thema.

Ich bin ein blutiger Anfänger also seid bitte gnädig mit mir.

Script welches ich mir zusammengebastelt habe:
Code:
#!/bin/bash

echo "1_Bluetooth (a)
2_Soundcontrole (b)"

read -p "Programm 1 oder 2 starten? Geben Sie eine a oder b ein. Abbruch mit jeder anderen Taste.:" name
	if [ $name="a" ]
	then `blueberry &`
	elif [ $name="b" ] 
	then `pavucontrol &`
	else echo "exit"
	fi
Problembeschreibung:
Egal welche Eingabe ich mache, auch mehrere Zeichen, es wird immer das
erste Programm (Bluberry) gestartet. Anscheinend wird die Eingabe nicht
richtig erkannt. Ich kann bei einer richtigen Eingabe auch niemals das
2. Programm starten. Beide Programme lassen sich aber ohne weitere so in
einen Terminal starten also sind die Befehle ersteinmal richtig.
Das Skript selber wird auch nicht bemängelt von bash.

Terminalausgabe:
Code:
~> /bin/bash program_start.sh
Bluetooth (a)
Soundcontrole (b)
Programm 1 oder 2 starten? Geben Sie eine a oder b ein. Abbruch mit jeder anderen Taste.:b

(blueberry.py:3295): com.linuxmint.blueberry-WARNING **: 12:11:07.579: DE could not be detected!

Daher meine Bitte um Hilfe. Danke
 

marce

Guru
(a) es empfiehlt sich die Verwendung von case
(b) fehlende Leerzeichen - siehe z.B. https://openbook.rheinwerk-verlag.de/shell_programmierung/shell_006_003.htm#RxxKap00600304004E251F0121C6
 
OP
H

HPF-84E

Member
Hi,
erstmal Danke für deine Hilfe.

Ja, die Variablen mussten auch in Anführungszeichen dann meckert die Bash auch nicht über die Leerzeichen.

So funktioniert es jetzt ist aber noch nicht schön gelöst:
Code:
#!/bin/bash
echo  "######################Progammauswahl#############################"
echo "Bluetooth (a)
Soundcontrole (b)
Soundmixer (c)"

read -p "Geben Sie a, b oder c ein. Abbruch mit jeder anderen Taste.:" n
	if [ "$n" = "a" ]
		then `blueberry &`
		elif [ "$n" = "b" ] 
		then `pavucontrol &`
	fi
		if [ "$n" = "c" ]
		then `pulseaudio-equalizer-gtk & disown`
	else echo "exit"
	fi

Ich muss mir den heftigen Input aus deinen Link erstmal durchlesen. Vielleicht komme ich ja dann alleine auf die Lösung wie das Skript direkt nach einer korrekten Eingabe und starten des Programms auch das Terminal schließt.

Ach so; ich arbeite mit dem Texteditor Geany und der hat direkt die Testfunktion (Xterminal) mit Eingebaut. Top.
 

marce

Guru
ein Blick wert wäre evtl. dann gleich auch noch https://openbook.rheinwerk-verlag.de/shell_programmierung/shell_007_007.htm#RxxKap00700704004E781F0181BD

... und wie gesagt: case anstatt Hunderte von if (https://openbook.rheinwerk-verlag.de/shell_programmierung/shell_006_007.htm#RxxKap00600704004E291F02C172)
 

abgdf

Guru
Bin nicht sicher, ob Du die Backticks ("`") richtig einsetzt.
"case" kann man machen, ich persönlich mag hunderte von "if"s lieber, aber das ist Geschmackssache. Also:
Code:
#!/bin/bash

echo  "###################### Progammauswahl #############################"
echo "Bluetooth (a)
Soundcontrole (b)
Soundmixer (c)"

read -p "Geben Sie a, b oder c ein. Abbruch mit jeder anderen Taste.: " n
if [ "$n" = "a" ]; then
    echo 'blueberry &'
elif [ "$n" = "b" ]; then
    echo 'pavucontrol &'
elif [ "$n" = "c" ]; then
    echo 'pulseaudio-equalizer-gtk & disown'
else
    echo "exit"
fi
Geany ist ja auch ein (kleines) IDE.
Vielleicht komme ich ja dann alleine auf die Lösung wie das Skript direkt nach einer korrekten Eingabe und starten des Programms auch das Terminal schließt.
Mit dem "&" nach einem Befehl, startet man diesen in einer neuen Shell.
Wenn man "exit" im Terminal eingibt, wird dieses geschlossen.
Wenn man ein Skript mit "source ./script.sh" startet, werden die Befehle so ausgeführt, als hätte man sie eingetippt. Ist dann ein "exit" im Skript, wird das Terminal geschlossen.
 
OP
H

HPF-84E

Member
abgdf schrieb:
Bin nicht sicher, ob Du die Backticks ("`") richtig einsetzt.
"case" kann man machen, ich persönlich mag hunderte von "if"s lieber, aber das ist Geschmackssache. Also:
Code:
#!/bin/bash

echo  "###################### Progammauswahl #############################"
echo "Bluetooth (a)
Soundcontrole (b)
Soundmixer (c)"

read -p "Geben Sie a, b oder c ein. Abbruch mit jeder anderen Taste.: " n
if [ "$n" = "a" ]; then
    echo 'blueberry &'
elif [ "$n" = "b" ]; then
    echo 'pavucontrol &'
elif [ "$n" = "c" ]; then
    echo 'pulseaudio-equalizer-gtk & disown'
else
    echo "exit"
fi
Geany ist ja auch ein (kleines) IDE.
Vielleicht komme ich ja dann alleine auf die Lösung wie das Skript direkt nach einer korrekten Eingabe und starten des Programms auch das Terminal schließt.
Mit dem "&" nach einem Befehl, startet man diesen in einer neuen Shell.
Wenn man "exit" im Terminal eingibt, wird dieses geschlossen.
Wenn man ein Skript mit "source ./script.sh" startet, werden die Befehle so ausgeführt, als hätte man sie eingetippt. Ist dann ein "exit" im Skript, wird das Terminal geschlossen.

Das müsste ich auch überprüfen aber so habe ich ja erst einmal ein funktionierendes Skript:
Code:
#!/bin/bash
echo  "######################Progammauswahl#############################"
echo "Bluetooth (a)
Soundcontrole (b)
Soundmixer (c)"

read -p "Geben Sie ein a,b oder c 
ein. Abbruch mit jeder anderen Taste.:" n
	if [ "$n" = "a" ]
		then `blueberry &`
		elif [ "$n" = "b" ] 
		then `pavucontrol &`
	fi
		if [ "$n" = "c" ]
		then `pulseaudio-equalizer-gtk &`
	else echo "exit"
	fi
clear

Beim schließen des gestarteten Programm wird auch xterm geschlossen. Kann man mit leben aber schön ist anders.
Nicht da du da wieder dein Perl mit reinschmeisst. :D

marce schrieb:
ein Blick wert wäre evtl. dann gleich auch noch https://openbook.rheinwerk-verlag.de/shell_programmierung/shell_007_007.htm#RxxKap00700704004E781F0181BD

... und wie gesagt: case anstatt Hunderte von if (https://openbook.rheinwerk-verlag.de/shell_programmierung/shell_006_007.htm#RxxKap00600704004E291F02C172)

Ja, damit habe ich mich jetzt 2 Tage beschäftigt. Mit „dialog" hatte ich so meine Problemchen zu Anfang. Dann hatte ich mich im Kreis gedreht und musste mich ja dann doch mit „case" beschäftigen. Jetzt habe ich was zusammen gebastelt.
Da funktioniert aber der letzte Befehl bei „blueberry" nicht. :???: Warum auch immer. Auf „startpar" bin ich durch Zufall gestoßen. :eek:ps:
Wenn Ihr eine bessere Lösung habt dann immer her damit. Mir raucht jetzt gerade ein bisschen der Kopf. :lol:

Ergebnis mit „case-funktion":
Code:
#!/bin/bash

prog=`dialog --menu "Programmauswahl" 0 0 0 \
	 "Buetooth" "" "Sound" "" "Mixer" "" 3>&1 1>&2 2>&3`
dialog --clear
	case "$prog" in
		Bluetooth)
		command="blueberry"  ;;
		Sound)
		command="pavucontrol"  ;;
		Mixer)
		command="pulseaudio-equalizer-gtk"  ;;
	esac
startpar -n $command
clear
exit

Das ist jetzt ziemlich zusammen gestaucht. Aber wie gesagt die letzte Zeile treibt mich jezt irgendwie in den Wahnsinn. :D
 
OP
H

HPF-84E

Member
Ich glaube ich habe es soweit hinbekommen.
Bei „blueberry" war es nur ein Rechtschreibfehler. ;) s.o.
„startpar" war auch nur eine dumme Idee und habe ich wieder raus geschmissen. s.o.

So wie das Skript jetzt aussieht funktioniert es super. Das xterm-fenster schließt sich auch wenn ich die Anwendung beende. :D

Code:
#!/bin/bash

prog=`dialog --colors --menu "Programmauswahl" 0 0 0 \
	 "Bluetooth" "" "Sound" "" "Mixer" "" 3>&1 1>&2 2>&3`
dialog --clear
	case "$prog" in
		Bluetooth)
		command="blueberry"  ;;
		Sound)
		command="pavucontrol"  ;;
		Mixer)
		command="pulseaudio-equalizer-gtk"  ;;
	esac
$command
clear
exit

Wenn nicht noch einer Ideen oder Verbesserungsvorschläge hat stelle ich später auf gelöst.
Danke für eure Unterstützung. :thumbs:
 

abgdf

Guru
HPF-84E schrieb:
Nicht da du da wieder dein Perl mit reinschmeisst. :D
Die Versuchung war schon groß. :)
HPF-84E schrieb:
Code:
#!/bin/bash
prog=`dialog --menu "Programmauswahl" 0 0 0 \
	 "Buetooth" "" "Sound" "" "Mixer" "" 3>&1 1>&2 2>&3`
dialog --clear
	case "$prog" in
		Bluetooth)
		...
Die Einrückung von "case" ist nicht richtig. Eingerückt werden das Innere von Code- oder z.B. Funktionsblöcken. Hier läuft das zwar, aber in einer Sprache wie insbesondere Python, in der die Einrückungen von Bedeutung sind, würde das einen Fehler geben. (Ich sehe gerade, Python vor Version 3.10 (wie viele Andere benutze ich 2.7) kennt kein "case". Das war wohl der Grund, warum mir das nicht so geläufig war.)
 
OP
H

HPF-84E

Member
Hallo

abgdf schrieb:
Die Einrückung von "case" ist nicht richtig. Eingerückt werden das Innere von Code- oder z.B. Funktionsblöcken. Hier läuft das zwar, aber in einer Sprache wie insbesondere Python, in der die Einrückungen von Bedeutung sind, würde das einen Fehler geben. (Ich sehe gerade, Python vor Version 3.10 (wie viele Andere benutze ich 2.7) kennt kein "case". Das war wohl der Grund, warum mir das nicht so geläufig war.)

So wie ich da verstanden habe kann man beim Bash-skripting ruhig das Einrücken mit der Tabulatur-Taste benutzen um das Skript selber übersichtlich zu halten. Einen Direkten Hinweis zu „echten" Programmiersprachen, das sowas zu Problemen führen kann, habe ich nicht gelesen. Ich kann aber deinen Hinweis dahingehen nachvollziehen. Ein sauberes arbeiten von Anfang an kann nicht schaden.

Ich habe es aber auch zu gemeint mit der Tab.-Taste. Ist so auch gar nicht in der ober verlinkten Anleitung vorhanden gewesen. Danke für den Hinweis.


Code:
#!/bin/bash
prog=`dialog --menu "Programmauswahl" 0 0 0 \
	 "Buetooth" "" "Sound" "" "Mixer" "" 3>&1 1>&2 2>&3`
dialog --clear
case "$prog" in
	Bluetooth)
	...

Ich arbeite die oben verlinkte Anleitung einfach mal ab. Ich liege ja eh mit einem Schienbeinbruch auf der Couch.
Ich weiß aber jetzt schon das ich beim Thema „Reguläre Ausdrücke" wieder ein an den Nerven bekomme. :irre:
Ich möchte das Skript ja auch noch ein wenig weiter Ausbauen. Mal sehen wie weit ich komme.
 

abgdf

Guru
HPF-84E schrieb:
Ich arbeite die oben verlinkte Anleitung einfach mal ab. Ich liege ja eh mit einem Schienbeinbruch auf der Couch.
Oh je, na dann, gute Besserung!

So richtig gefallen hatten mir die verfügbaren Tutorials zu bash alle nicht so richtig, deshalb hatte ich mal selbst eine Seite dazu geschrieben, die ich für Dich nochmal hier hochlade.

Da ich ja kein großer Freund von bash bin, sollte es eigentlich Leute geben, die sowas noch besser und genauer schreiben können. Aber ich finde wie gesagt nur wenige Seiten, die das machen. Der "Advanced Bash-Scripting Guide" ist sicher genau, wird im Detail aber auch reichlich ... wie soll ich sagen ... seltsam ... verrückt. :irre: :)
 
OP
H

HPF-84E

Member
abgdf schrieb:
Oh je, na dann, gute Besserung!

So richtig gefallen hatten mir die verfügbaren Tutorials zu bash alle nicht so richtig, deshalb hatte ich mal selbst eine Seite dazu geschrieben, die ich für Dich nochmal hier hochlade.

Da ich ja kein großer Freund von bash bin, sollte es eigentlich Leute geben, die sowas noch besser und genauer schreiben können. Aber ich finde wie gesagt nur wenige Seiten, die das machen. Der "Advanced Bash-Scripting Guide" ist sicher genau, wird im Detail aber auch reichlich ... wie soll ich sagen ... seltsam ... verrückt. :irre: :)

Danke. Das schlimmste habe ich ja überstanden. :/

Ich finde das ganze Bashskripten schon ein bisschen chaotisch das es ja auch viele verschiedene Shells gibt und das eine Skript nicht unter einer anderen Shell lauffähig sein muss. Das ist halt alles noch aus den Anfangstage der Computer wo viele Programmierer und auch Firmen ihren eigenen Kram gemacht haben.
Linux ist halt nicht gleich UNIX und bei UNIX muss auch nicht alles gleich sein.


Aber jetzt ist mir mal was anderes aufgefallen:

Ich habe festgestellt das „xterm" anders reagiert als andere Terminals.
Ich habe ja zusätzlich zu meinen XFCE4 noch Icewm an laufen. Unter Xfce4
ist natürlich das Xfce4-Terminal voreingestellt in der Variable „$term".
Bei Icewm ist es halt „xterm". Genau damit habe ich ein Problem: Da als
Beispielprogramm in meinen Skript „Blueberry" als Blutooth-Verwaltung
vorkommt ist mir aufgefallen das dieses Programm nicht starten will mit
xterm unter Icewm. Aber auch nur dieses Programm macht Probleme.

Lass ich das Bashskript in einen anderen Terminal laufen egal mit welchen
wm ist alles in Ordnung.

Als Fehlermeldung kommt nur das der Desktop nicht gefunden werde konnte.
Gebe ich blueberry & in xterm unter icewm ein ohne Skript habe ich auch
keine Probleme.
Screenshot


Daher jetzt meine Frage: Liegt es an Icewm und/oder auch an xterm selber
oder doch an meinen Skript welches aber doch sonst ohne Probleme läuft.
Es wird beim Testen in Geany ein Fehlercode 0 angezeigt genauso in jedem
anderen Terminal.

Danke
 

stka

Guru
In der Auflage des Rheinwerk-Buches ist so einiges nicht korrekt oder funktioniert in der aktuellen Version von dialog nicht mehr oder anders. In der (noch) aktuellen Version ist das besser beschrieben. Auch kann "case" in der aktuellen Version der bash noch viel mehr. Viele if-Konstrukte sind auf jeden Fall fehleranfälliger als ein case. Bei Python fehlt mir das case immer wieder.
 
OP
H

HPF-84E

Member
stka schrieb:
In der Auflage des Rheinwerk-Buches ist so einiges nicht korrekt oder funktioniert in der aktuellen Version von dialog nicht mehr oder anders. In der (noch) aktuellen Version ist das besser beschrieben. Auch kann "case" in der aktuellen Version der bash noch viel mehr. Viele if-Konstrukte sind auf jeden Fall fehleranfälliger als ein case. Bei Python fehlt mir das case immer wieder.

Ich werde mich jetzt nicht Tagelang mit debuggen beschäftigen. Da kann ich besser die vorhandene Rheinwerk-Auflage durcharbeiten. Ich habe ja bei 0 angefangen und hatte Ratzfatz ein funktionierendes Skript gehabt. Also kein Beinbruch.
Die Lösung kommt bestimmt automatisch und noch andere Ideen zum basteln.
Daher einfach mal weitermachen.
 

abgdf

Guru
HPF-84E schrieb:
Als Fehlermeldung kommt nur das der Desktop nicht gefunden werde konnte.
Gebe ich blueberry & in xterm unter icewm ein ohne Skript habe ich auch
keine Probleme.
Bist Du sicher, daß diese Fehlermeldung das bedeutet? Also, daß der Desktop nicht gefunden wird? Ich würde jedenfalls mal gucken, welcher auszuführende Befehl überhaupt von Deinem "dialog" zurückkommt.
Ich glaube auch nicht, daß xterm hier das Problem ist. Eher vielleicht, daß der Benutzer nicht die Rechte hat, Fenster aufzumachen oder sowas ("Xauthority" oder sowas, müßte ich mich auch mal näher mit befassen). Oder vielleicht, daß ein KDE- oder Gnome-Programm gestartet werden soll, aber die dazu nötigen Pakete nicht vorhanden sind. Das könnte man beheben.
Aber wie gesagt: An xterm liegt es glaube ich nicht. xterm ist cool. :)
stka schrieb:
Bei Python fehlt mir das case immer wieder.
Offenbar gibt es das ab Python 3.10.
 
Oben