Ich hoffe ich werde dafür nicht verhauen, aber ein par einfache Dinge bekomme ich einfach nicht vernünftig recherchiert.
Ersteinmal, ich habe ein Bash-Script erstellt. Dieses öffnet ein Terminalfenster und führt einen simplen Befehl aus. Da mir einerseits Rückmeldungen wichtig sind und ich generell Spaß an vernünftig designten Programmen habe, soll das Fenster nicht sofort wieder verschwinden.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #!/bin/bash bashallstart () { sudo systemctl start eins.timer \ zwei.timer \ drei.timer \ vier.timer \ fünf.timer \ } echofirst () { echo "$(tput bold)$(tput setaf 202) START all Timers$(tput sgr0)" } echosecond () { echo "$(tput bold)$(tput setaf 2) ALL Timers $(tput blink)$(tput setaf 2)████$(tput sgr 0)$(tput bold)$(tput setaf 2) started $(tput bold)$(tput blink)$(tput setaf 2)████$(tput sgr 0)" } echofirst && bashallstart && echosecond && sleep 5 && kill -9 $PPID |
Das Fenster zeigt einen Titel (welche Aufgabe es hat), in der zweiten Zeile kommt die notwendige Sudo Passwortabfrage, und wenn alles durch ist, wird das mit einer dritten Zeile bestätigt und nach 5 Sekunden schließt sich das Fenster automatisch.
Nun habe ich schonmal festgestellt, dass man das Fenster nicht mit "exit" geschlossen bekommt. Bei normaler Terminal Benutzung klappt es, aber innerhalb eines Bash-Scripts nicht (obwohl ich viele Scripte im Internet finde, wo "exit" am Ende drin stand). Daher löse ich das per "kill -9 $PPID". Oder gibt es sauberere Lösungen? Und wieso schließt "exit" bei manueller Eingabe das Fenster aber nicht im Script?
Desweiteren möchte ich das Fenster, nachdem das Script durchgelaufen ist (um den Workflow zu erhöhen und weil X anklicken und Tastenkombinationen lästig sind) das Fenster zusätzlich zu den 5 Sekunden auch manuell per beliebiger Taste schließen. Am besten per Leertaste oder einem beliebigem Buchstaben aber ohne danach zusätzlich Enter drücken zu müssen.
Und weil das noch nicht genug ist, möchte ich einen rückwärts laufenden Ladebalken in einer extra Zeile, der mir anzeigt wann das Fenster sich schließt. Ich weiß nicht wie man das am saubersten löst. "echo -ne \b" funktionert nicht zusammen mit "sleep 0.1". Und sämtliche Lösungen wo es daraum geht, einfach nur die aktuelle Zeile durch eine neue zu ersetzen (einen langen Ladebalken durch einen etwas kürzeren) sind hochkompliziert. Ich habe das vor Jahrzehnten damals in Dos unter Windows schon gemacht und weiß dass das zumindest dort deutlich einfacher zu lösen war. Allerdings ist das schon lange her und vieleicht bin ich nur noch nicht auf die richtige Lösung gestoßen.
Mir ist auch aufgefallen, dass eine Funktion scheinbar immer ÜBER dessen "Verknüpfung" stehen muss. Also
1 2 3 4 5 6 7 | #!/bin/bash bla () { irgendeinbefehl } bla |
funktioniert. Aber:
1 2 3 4 5 6 7 | #!/bin/bash bla bla () { irgendeinbefehl } |
funktioniert hingegen nicht. Warum ist das so? (das macht halt das Script etwas unübersichtlicher, wenn die "wichtigen" Sachen ganz unten stehen müssen) Dass die Funktion erst "in den Speicher geladen werden muss", damit sie anschließend aufgerufen werden kann, kann ich mir nicht ganz vorstellen, weil in den Scripten sowieso teils kreuz und quer gesprungen wird und die Scripte vor Ausführung doch ohnehin erstmal komplett geladen werden?
Bearbeitet von sebix:
Besseren Titel gesetzt.