Viper73
Anmeldungsdatum: 26. April 2014
Beiträge: 48
|
Hallo zusammen, ich bin gerade dabei mich mit scripts (bash) zu beschäftigen, also noch ein ziemlicher Anfänger.
Ich habe mein erstes Scrpit geschrieben und möchte zwei Programme gleichzeitig öffnen. Der Name der Datei ist: testscript
#!/bin/bash
# Kommentar
echo „Hallo $USER!“
echo „Befehl wird ausgeführt“
gedit
firefox
echo "Fertig" Das ganze starte ich mit einem Desktop Entry
[Desktop Entry]
Name=testbefehl
Exec=/home/BENUTZER/Schreibtisch/testscript
Terminal=true
Type=Application Das ganze funktioniert im Prinzip auch, nur das nur das erste Programm ausgeführt wird, dann ist fertig und es passiert nichts weiter. Wie bekomme ich das script dazu weiterzumachen und nicht beim ersten Programm starten aufzuhören? Wenn ich statt zweier Programme nur mehrere Texte zur Ausgabe schicke klappt das ganze. Wie gesagt, bin noch total am Anfang, das oben habe ich mir stundenlang im Internet zusammengereimt, aber nun stoße ich an meine Grenzen und finde keine Lösung. Wäre toll wenn mir hier jemand weiterhelfen könnte. Gruß, Viper
|
ChickenLipsRfun2eat
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12067
|
Hallo! Die Befehle werden immer nacheinander abgearbeitet. Solange also firefox aktiv ist, wartet dein Script auf dessen Ende, bevor es den nächsten Befehl ausführt. Du kannst mit dem kaufmännischen Und (&) Prozesse in den Hintergrund schicken. Also firefox &
gedit schickt firefox in den Hintergrund (siehe dazu auch fg und bg ) und startet gedit.
|
Viper73
(Themenstarter)
Anmeldungsdatum: 26. April 2014
Beiträge: 48
|
Erstmal vielen Dank, das funktioniert nun soweit. Nun stört mich nur noch das gedit wohl so an das script gebunden ist, das, wenn man gedit schließt das script auch beendet/geschlossen wird. So kommt es mir jedenfalls vor. Ich möchte aber das über das Script die beiden Programme gestartet werden, das Script fleissig weitere Befehle abarbeitet und es egal ist ob ich eines der beiden Programme schließe. Was ich also möchte:
- beide Programme starten, dem Script ist egal ob ich diese schließe und macht einfach weiter mit den Befehlen
- das Terminal soll geöffnet bleiben wenn ich das Programm (gedit) beende damit ich ggf. Fehlermeldungen oder weitere Texte darin sehe
|
ChickenLipsRfun2eat
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12067
|
Dann setz doch gedit auch in den Hintergrund. Was ist denn dein Ziel? Also welche Befehle willst du abarbeiten? Eventuell brauchst du ja auch eine Schleife für deinen Fall... Sieh dir dazu mal den Shell/Bash-Skripting-Guide für Anfänger an.
|
Seebär
Anmeldungsdatum: 2. Mai 2009
Beiträge: 833
|
Viper73 schrieb: Nun stört mich nur noch das gedit wohl so an das script gebunden ist, das, wenn man gedit schließt das script auch beendet/geschlossen wird. So kommt es mir jedenfalls vor.
Das kommt dir richtig vor. Prinzip ist: Terminal öffnen, damit "hat man" eine shell. Da ein Script ausführen, das läuft dann (im Normalfall) in einer sub-shell. Das script ist ans Terminal gebunden. Willst Du das nicht, dann mit nohup starten. Bsp so.
| nohup ./myscript.sh parameter parameter2 &
|
Ausgaben werden dann per Default in nohup.out umgeleitet (was änderbar ist), um stderr müsste man sich dann noch kümmern, wenn nötig. Aber das reicht erst mal, wobei ich den Aufruf von gedit und ff in einem Script in Folge für relativ sinnfrei halte (ist vmtl. nur eine Demo?).
|
Viper73
(Themenstarter)
Anmeldungsdatum: 26. April 2014
Beiträge: 48
|
@Seebär
was du da schreibt versteh ich schon nicht mehr, ich kann mit "nohup.out" "stderr" usw. kann ich nichts anfangen, da muß ich erstmal ein bisschen recherchieren... Werde ich aber auch tun, vielleicht sind das ja nützliche Infos die ich nur nicht verstehe 😉 Ich denke mit nohup muß ich mich beschäftigen soweit ich es verstanden habe. @all
Was ich möchte ist eine Desktop Verknüpfung die beim Klicken folgende zwei Befehle ausführt (Achtung: mit Admin Rechten und daher Passwortabfrage).
Um mich hier ranzutasten habe ich mit dem Script im Beispiel begonnen damit ich auch lerne/verstehe was ich hier mache.
Habe nämlich schon gelesen das das mit den Admin Rechten noch kompliziert (für meine Verhältnisse) wird da ich dann das Terminal dazu bringen muß mir die Passwortabfrage zu bringen (und ob ich lieber sudo oder gksudo nehme): sudo modprobe -r rtl8723be
sudo modprobe rtl8723be ant_sel=1 Mit meinem Beispiel will ich eben zwei Programme starten die ich dann immer sowieso parallel nutzen möchte. Ist eher eine Spielerei um etwas zu lernen, das eigentliche Ziel ist es mir eine "Windows *.bat" Datei basteln zu können mit der ich Programme starten kann, Häufig verwendete Befehle per Doppelklick ausführen kann usw. Aber in erster Linie möchte ich erstmal die beiden oberen Befehle per Doppelklick und Passworteingabe (Admin) ausführen.
|
ChickenLipsRfun2eat
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12067
|
Hallo! Ein Browser eignet sich definitiv nicht, um Adminrechte zu testen... bleiben da bei gedit oder sowas. Für oft benutzte Konsolenbefehle eignet sich Yakuake oder Guake in Verbindung mit dem oben erwähnten Alias. F12 drücken, Kürzel eingeben, fertig. Beispiel für die Systemaktualisierung:
Mit gedit die Datei ~/.bash_aliases öffnen. Dort folgende Zeile eintragen: alias upd='sudo apt update && sudo apt full-upgrade && sudo apt autoremove' oder per Copy and Paste echo "alias upd='sudo apt update && sudo apt full-upgrade && sudo apt autoremove'" >> ~/.bash_aliases Ein Terminal öffnen und upd eingeben. sudo-Passwort eingeben. Den Ausgaben auf dem Bildschirm folgen.
Dein Beispiel zeigt, dass du ein Kernelmodul für die Netzwerkkarte neu laden willst. Wieso willst du das so tun? /edit: Sieh dir auch noch .desktop-Dateien an!
|
frostschutz
Anmeldungsdatum: 18. November 2010
Beiträge: 7782
|
Du kannst mehrere Sachen in den Hintergrund schicken und dann warten. programm1 &
programm2 &
wait # bis programm1 und programm2 fertig/beendet worden sind das Terminal soll geöffnet bleiben wenn ich das Programm (gedit) beende
Die lausige Lösung wäre nach dem wait noch ein sleep 99999 oder sowas zu machen. Aber eigentlich musst du das dem Terminal selber sagen, daß es offen bleiben soll. (xterm -hold ) Speziell bei firefox wird das Beispiel nicht unbedingt so klappen, da firefox eine Anwendung ist die sich selber in den Hintergrund schickt. Wenn schon ein Fenster offen ist dann geht einfach ein neues Fenster auf, du bekommst im Shellscript nicht mit wann dieses geschlossen wird.
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
Viper73 schrieb: sudo modprobe -r rtl8723be
sudo modprobe rtl8723be ant_sel=1
Dies wäre jetzt genau ein Beispiel, wo man das Pferd besser anders herum aufzieht, ganz ohne "parallelen" Befehlsaufruf. Wenn Du in Deinem Starter eine Untershell startest, kannst Du beide Befehle direkt dort nacheinander aufrufen: [Desktop Entry]
Name=rtl8723_(ant_1)
Exec=sudo sh -c 'modprobe -r rtl8723be; modprobe rtl8723be ant_sel=1'
Terminal=true
Type=Application Dadurch dass Du bereits die Untershell mit Root-Rechten startest, reicht 1 Passwortabfrage für alle Befehle In diesem Fall macht der 2. Befehl sowieso erst Sinn, nachdem der 1. Befehl gelaufen ist. Von daher würde ein Parallelaufruf hier höchstens noch Probleme verursachen.
Das zeigt sehr schön: es ist sehr nützlich, zuerst zu planen und nachzudenken, und erst danach den Code zu schreiben. LG, track
|
Viper73
(Themenstarter)
Anmeldungsdatum: 26. April 2014
Beiträge: 48
|
Ich bin gerade wieder am rumprobieren und teste eure ganzen Vorschläge. @track
dein Beispiel gefällt mir sehr gut. Nur möchte ich nicht das das Terminal Fenster sofort automatisch wieder zugeht. So sehe ich ja nicht ob die Befehle erfolgreich durchgeführt wurden oder ob es ggf. eine Fehlermeldung gab. Kann man da noch irgendwie anhängen das der Desktop Entry auf einen Tastendruck warten muß bevor sich das Fenster schließt? @frostschutz
dein "wait" funktioniert auch sehr gut, das teste ich ebenfalls etwas intensiver. @ChickenLipsRfun2eat
bei einem Notebook gibt es Probleme mit dem wlan Treiber, den wirft es irgendwie immer wieder raus. Ich habe dann im Netz gefunden das eben diese Befehle das wlan wieder herholen. Ohne dies findet es keine wlan Netzwerke.
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
Viper73 schrieb: ... Kann man da noch irgendwie anhängen das der Desktop Entry auf einen Tastendruck warten muß bevor sich das Fenster schließt?
Klar kann man: einfach den nötigen Text ausgeben und genau 1 Zeichen lesen. Dann ist jeder Tastendruck recht: [Desktop Entry]
Name=rtl8723_(ant_1)
Exec=sudo sh -c 'modprobe -r rtl8723be; modprobe rtl8723be ant_sel=1; echo [Taste]; read -n1'
Terminal=true
Type=Application
LG, track
|
Viper73
(Themenstarter)
Anmeldungsdatum: 26. April 2014
Beiträge: 48
|
|
ChickenLipsRfun2eat
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12067
|
Hallo! Du könntest ja im Netzwerk-Unterforum mal nach einer Lösung zu diesem Problem fragen. Sowas lässt sich sicher automatisieren, bzw. richtig einstellen.
|