Autor Thema: Fragen zur Bash  (Gelesen 2803 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

Offline gosia

  • Held Mitglied
  • *****
  • Beiträge: 992
  • Dankeschön: 168 mal
  • Desktop: Openbox + xfce
  • Grafikkarte: Intel HD 4000
  • Grafikkartentreiber: i915 (free)
  • Kernel: 4.9 Artix
  • Prozessor: Intel Core i5-3210M
  • Skill: Durchschnitt
  • Zweig: stable
Re: Fragen zur Bash
« Antwort #30 am: 27. Juni 2017, 13:27:47 »
Hallo Norman,
Ich hab nochmal eine Frage, und zwar, wie ich ich Systeminformationen so visualisieren kann:
Wenn das mit einem reinen bash-Skript programmiert wurde, dann würde ich dieses Skript auch brennend gern studieren. Wo hast Du das her?
Aber so allgemein zu grafischen Ausgaben mit der bash. Sieh dir mal dialog/xdialog an:
https://wiki.ubuntuusers.de/Dialog/
http://openbook.rheinwerk-verlag.de/shell_programmierung/shell_007_007.htm#RxxKap00700704004E781F018172
kdialog
https://wiki.ubuntuusers.de/KDialog/
und Zenity
https://help.gnome.org/users/zenity/stable/index.html.de
und yad
https://wiki.ubuntuusers.de/yad/
Die Reihenfolge entspricht auch ungefähr der wachsenden Komplexität, bzw. den wachsenden Fähigkeiten.
Weitere Seiten bitte selbst ergoogeln. Aber Dialog, XDialog, KDialog, Zenity und yad düften so die wichtigsten Vertreter für grafische Ausgaben mittels bash sein (Ergänzungen willkommen).
Wer sowas ohne diese Hilfsmittel nur mit bash hinbekommt ist bestimmt ein bash-Guru, auf dem Stadium bin ich noch lange nicht und werde es wohl auch nicht erreichen.

Viele Grüße gosia

Offline Norman

  • Neuling
  • *
  • Beiträge: 30
  • Skill: Durchschnitt
Re: Fragen zur Bash
« Antwort #31 am: 27. Juni 2017, 16:35:46 »
@gosia:

Vielen Dank, die Links werde ich mir gleich mal anschauen.
Im Arch-Forum hat gerade jemand dieses Snippet als Beispiel gepostet, es müsste aber auch den Batteriestand anzeigen, wenn man cat/sys/class ... entsprechend anpasst:

#! /bin/bash

BACKLIGHT_BRIGHTNESS=$(cat /sys/class/backlight/acpi_video0/brightness)
BACKLIGHT_BAR=''

for PERCENT in {10..100..10}; do
  if [ ${BACKLIGHT_BRIGHTNESS} -ge ${PERCENT} ]; then
    BACKLIGHT_BAR="${BACKLIGHT_BAR}#"
  else
    BACKLIGHT_BAR="${BACKLIGHT_BAR}-"
  fi
done

echo "Backlight: [${BACKLIGHT_BAR}] ${BACKLIGHT_BRIGHTNESS}"

Ich teste das nachher mal auf meinem Laptop.

Hallo Norman,Wenn das mit einem reinen bash-Skript programmiert wurde, dann würde ich dieses Skript auch brennend gern studieren. Wo hast Du das her?

Das Bild oben mit den Rauten hab ich gestern über die Google-Suche gefunden, aber leider keine Dotfiles dazu, ob das mittels eines reinen Shell-Scripts realisiert wurde oder ob da vielleicht doch Conky im Hintergrund arbeitet, weiß ich gar nicht.
Ich hab aber vor einer Weile ein ähnliches Panel im Einsatz gehabt, da wurde der Batteriestand in Form von Herzen, die sich mit der Zeit leeren, angezeigt. Fand ich auch ziemlich cool. Das vollständige Script ist hier:

https://github.com/jastronaut/dotfiles/blob/master/bin/panel

Das Snippet für den Batteriestand ist das hier, hab ich aber nicht selbst geschrieben.

function battery()
{
bat=$(acpi -b | grep -P -o '[0-9]+(?=%)')
ch_state=$(acpi -b | cut -c12-19)
ch=""
if [[ $ch_state = "Charging" ]]; then
ch='*'
fi

if [ $bat -le 100 ] && [ $bat -ge 80 ]; then
echo -e "%{F$LABEL}BAT  %{F-}%{F$PINK}$FULL $FULL $FULL $FULL $FULL%{F-}%{F$GRE} $bat%%{F-}%{F$YEL}$ch%{F-}"
elif [ $bat -lt 80 ] && [ $bat -ge 60 ]; then
echo -e "%{F$LABEL}BAT %{F-}%{F$PINK}$FULL $FULL $FULL $FULL%{F-} $EMPTY%{F$GRE}  $bat%%{F-}%{F$YEL}$ch%{F-}"
elif [ $bat -lt 60 ] && [ $bat -ge 40 ]; then
echo -e "%{F$LABEL}BAT %{F-}%{F$PINK}$FULL $FULL $FULL%{F-} $EMPTY $EMPTY%{F$GRE} $bat%%{F-}%{F$YEL}$ch%{F-}"
elif [ $bat -lt 40 ] && [ $bat -ge 20 ]; then
echo -e "%{F$LABEL}BAT %{F-}%{F$PINK}$FULL $FULL%{F-} $EMPTY $EMPTY $EMPTY%{F$GRE} $bat%%{F-}%{F$YEL}$ch%{F-}"
else
echo -e "%{F$LABEL}BAT %{F-} %{F$PINK}$FULL%{F-} $EMPTY $EMPTY $EMPTY $EMPTY%{F$PINK} $bat%%{F-}%{F$YEL}$ch%{F-}"
fi
}

Hier werden über Abfragen des Batteriestands entsprechend zwei verschiedene Variablen zugewiesen ($EMPTY und $FULL) und enstprechend dann leere oder volle Herzen angezeigt. Dafür muss dann aber noch der FontAwesome Icon-Font installiert sein, damit die Herzen angezeigt werden.
Und so sah das ganze dann aus:



Für die Ausgabe hab ich übrigens Lemonbar mit xft-Support benutzt.

Grüße
Norman

Offline Norman

  • Neuling
  • *
  • Beiträge: 30
  • Skill: Durchschnitt
Re: Fragen zur Bash
« Antwort #32 am: 06. Juli 2017, 18:35:29 »
Ich hab mal wieder eine Frage und zwar zu diesem Script:

#! /bin/bash

BACKLIGHT_BRIGHTNESS=$(cat /sys/class/backlight/acpi_video0/brightness)
BACKLIGHT_BAR=''

for PERCENT in {10..100..10}; do
  if [ ${BACKLIGHT_BRIGHTNESS} -ge ${PERCENT} ]; then
    BACKLIGHT_BAR="${BACKLIGHT_BAR}#"
  else
    BACKLIGHT_BAR="${BACKLIGHT_BAR}-"
  fi
done

echo "Backlight: [${BACKLIGHT_BAR}] ${BACKLIGHT_BRIGHTNESS}"

Dieses Script zeigt mir anhand eines improvisierten Reglers ( [###---] ) die Bildschirmhelligkeit an. Das Script funktioniert auch soweit, nur möchte ich das Gleiche nun auch für den Akkustand anzeigen. Auch mit der Rautenanzeige usw. Nur ist eine For-Schleife anscheinend nicht die richtige Wahl, denn sie wird eimal durchlaufen und dann beendet, was zur Folge hat, dass sich der Akkustand nicht automatisch aktualisiert. Ich weiß, dass man für unbegrenzte Schleifendurchläufe in zeitlichen Intervallen die While-Schleife nutzen kann, wenn man den parameter true übergibt, nur wie muss der Rest der Schleife aussehen, wenn ich trotzdem diese Rautenanzeige drinbehalten will? Ich probiere schon die ganze Zeit rum, das Script irgendwie so abzuändern, dass es funzt, aber ich kriegs einfach nicht hin.
Achso, und dass ich oben den Pfad zu /sys/class/power_supply/BAT0/capacity ändern muss, weiß ich.

Grüße
Norman

Offline gosia

  • Held Mitglied
  • *****
  • Beiträge: 992
  • Dankeschön: 168 mal
  • Desktop: Openbox + xfce
  • Grafikkarte: Intel HD 4000
  • Grafikkartentreiber: i915 (free)
  • Kernel: 4.9 Artix
  • Prozessor: Intel Core i5-3210M
  • Skill: Durchschnitt
  • Zweig: stable
Re: Fragen zur Bash
« Antwort #33 am: 06. Juli 2017, 21:01:53 »
Hallo Norman,
ist nicht böse gemeint, aber ich halte das für aberwitzige Spielereien mit sehr geringem Wert aber für hochinteressante Fingerübungen. Von noch offenen Fragen mal ganz abgesehen, wiel lange soll denn das Ding vor sich hinlaufen und ein Fenster mit Rauten vollmalen, 5 Stunden bis dein Akkuu leer oder voll ist und was dann? Andere Werkzeuge wären da besser geeignet, aber da Du offenbar einen Hang zu grafischen Spielereien hast, hier mein sehr knapper Ansatz:
Lagere das Zeugs mit dem String in eine Funktion aus, die einen passenden String zurückgibt, also z.B. 100% voller Akku liefert sowas
##########Akku mit 10% entsprechend diesen String:
#Diese Funktion wird in einer endlosen-while-Schleife aller X Minuten aufgerufen und der String im Terminal ausgegeben.
Um es deutlicher zu machen, ein Beispiel das alle 2 Sekunden Datum und Uhrzeit ausgibt:
#!/usr/bin/bash
function zeit {
   local datum=$(date)
   echo "$datum"
}

while true
do
   clear
   echo -n $(zeit)
   sleep 2
done
Ist natürlich völlig sinnfrei und wude nur gewählt, weil ich keine Lust hatte, rauszufinden, welche Werte für den Batteriestatus ausgegeben werden. Du liest also in der Funktion statt der Uhrzeit den Batteriestatus aus und lieferst enen passenden String zurück. Kannst Du irgendwie das Muster aus deinem BACKLIGHT-Beispiel nehmen, oder, ein case-Statement nach diesem Muster
http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_07_03.html
s. disktest.sh
aber da müsste man wissen, wie die Ausgabe des Akkustatus aussieht, ob entsprechende RegEx basterln zu können.

Viele Grüße gosia
Folgende Mitglieder bedankten sich: Norman

Offline Norman

  • Neuling
  • *
  • Beiträge: 30
  • Skill: Durchschnitt
Re: Fragen zur Bash
« Antwort #34 am: 06. Juli 2017, 21:46:03 »
Von noch offenen Fragen mal ganz abgesehen, wiel lange soll denn das Ding vor sich hinlaufen und ein Fenster mit Rauten vollmalen, 5 Stunden bis dein Akkuu leer oder voll ist und was dann?

Klar, man könnte natürlich auch ganz auf ne Statusleiste und so Zeug verzichten, aber ne Akkuanzeige brauch ich einfach auf nem Laptop und nen paar Systeminfos find ich auch an sich nicht verkehrt. :)

Offline gosia

  • Held Mitglied
  • *****
  • Beiträge: 992
  • Dankeschön: 168 mal
  • Desktop: Openbox + xfce
  • Grafikkarte: Intel HD 4000
  • Grafikkartentreiber: i915 (free)
  • Kernel: 4.9 Artix
  • Prozessor: Intel Core i5-3210M
  • Skill: Durchschnitt
  • Zweig: stable
Re: Fragen zur Bash
« Antwort #35 am: 06. Juli 2017, 22:47:54 »
Hallo Norman,
Klar, man könnte natürlich auch ganz auf ne Statusleiste und so Zeug verzichten, aber ne Akkuanzeige brauch ich einfach auf nem Laptop und nen paar Systeminfos find ich auch an sich nicht verkehrt. :)
Wahrscheinlich sind wir uns ja einig, ich habe ja auch eine Statusleiste und darin u.a. eine Batterieanzeige. Aber da nehme ich einfach die xfce-Energieverwaltung und Du, ja was, irgendein passendes Applet. Denn für den praktischen Einsatz ist mein Skript so ziemlich ungeeignet, das meinte ich mit "Spielerei mit sehr geringem Wert" und höchstens als kleine Übung für die bash brauchbar.

Viele Grüße gosia

Offline Norman

  • Neuling
  • *
  • Beiträge: 30
  • Skill: Durchschnitt
Re: Fragen zur Bash
« Antwort #36 am: 07. Juli 2017, 15:29:08 »
Aber da nehme ich einfach die xfce-Energieverwaltung und Du, ja was, irgendein passendes Applet.

Ich benutz Lemonbar, das Programm stellt von sich aus keine Informationen bereit, sondern man muss es über Scripte füttern. Dafür ist der Resourcenbedarf aber auch sehr gering. Und man hat freie Hand bei der Gestaltung und muss keine XFCE-Abhängigkeiten installieren.

Hier die Seite aus dem Arch-Wiki zu dem Programm, falls du mal gucken willst:
https://wiki.archlinux.org/index.php/Lemonbar

Grüße
Norman

Offline gosia

  • Held Mitglied
  • *****
  • Beiträge: 992
  • Dankeschön: 168 mal
  • Desktop: Openbox + xfce
  • Grafikkarte: Intel HD 4000
  • Grafikkartentreiber: i915 (free)
  • Kernel: 4.9 Artix
  • Prozessor: Intel Core i5-3210M
  • Skill: Durchschnitt
  • Zweig: stable
Re: Fragen zur Bash
« Antwort #37 am: 07. Juli 2017, 16:57:53 »
Hallo Norman,
Ich benutz Lemonbar, das Programm stellt von sich aus keine Informationen bereit, sondern man muss es über Scripte füttern. Dafür ist der Resourcenbedarf aber auch sehr gering.
Ah ja, sozusagen das goldene Gesetz der Informatik "Was man an Ressourcen spart, muss man an Programmieraufwand zusetzen" oder so ;)
Hier die Seite aus dem Arch-Wiki zu dem Programm, falls du mal gucken willst:
https://wiki.archlinux.org/index.php/Lemonbar
Ich will immer gucken... ;) Und was sehe ich da? Ein Skript zur Anzeige des Akku-Zustands. Aber klar, wir würden nicht Linux benutzen, wenn wir nicht sogleich den Wunsch hätten, das etwas anzupassen.

Viele Grüße gosia

Offline Norman

  • Neuling
  • *
  • Beiträge: 30
  • Skill: Durchschnitt
Re: Fragen zur Bash
« Antwort #38 am: 07. Juli 2017, 19:19:51 »
Aber klar, wir würden nicht Linux benutzen, wenn wir nicht sogleich den Wunsch hätten, das etwas anzupassen.

Genau.  :D
Hab gerade dieses Script geschrieben:

#!/bin/bash

battery() {
    BATCAP=$(cat /sys/class/power_supply/BAT0/capacity)
    BAR=''

    for PERCENT in (10..100..10); do
        if [ ${BATCAP} -ge ${PERCENT} ]; then
            BAR="${BAR}#"
        else
            BAR="${BAR}-"
        fi
    done
    echo "Battery: [${BAR}] ${BATCAP}"
}

while true; do
    BAR_INPUT="%{c}$(battery)"
    echo $BAR_INPUT
    sleep 1
done

Ich hab das ganze als Funktion geschrieben. Die For-Schleife konstruiert die Statusleiste [###---], das Ergebnis der Funktion hab ich dann in einer While-Schleife der Variable BAR_INPUT zugeordnet, die While-Schleife läuft unendlich oft durch und gibt so alle Paar Minuten den aktuellen Akkuladestand aus. Das Script pipe ich in meiner xinitrc dann nach Lemonbar.

@gosia:
Da ich noch nicht so erfahren in Shell-Programmierung bin, würde mich interessieren, ob du die Lösung als sauber oder doch eher aufgebläht emfpfindest. Vielleichts gibts einen besseren Weg, den ich übersehen hab.
« Letzte Änderung: 07. Juli 2017, 19:30:19 von Norman »

Offline gosia

  • Held Mitglied
  • *****
  • Beiträge: 992
  • Dankeschön: 168 mal
  • Desktop: Openbox + xfce
  • Grafikkarte: Intel HD 4000
  • Grafikkartentreiber: i915 (free)
  • Kernel: 4.9 Artix
  • Prozessor: Intel Core i5-3210M
  • Skill: Durchschnitt
  • Zweig: stable
Re: Fragen zur Bash
« Antwort #39 am: 08. Juli 2017, 00:47:12 »
Hallo Norman,
@gosia:
Da ich noch nicht so erfahren in Shell-Programmierung bin, würde mich interessieren, ob du die Lösung als sauber oder doch eher aufgebläht emfpfindest. Vielleichts gibts einen besseren Weg, den ich übersehen hab.
Ach herrjeh... sowas fragst Du ausgerechnet mich. Sagen wir mal so, ich hätte es auch nicht besser machen können. Setzen, 1
Außer vielleicht daß man die Variablen in einer Funktion besser als local definiert. Spielt in so einem Miniskript keine Rolle, aber wenn die Skripte größer werden, kann es schon mal vorkommen, daß man eine globale Variable mehrfach benutzt und das dann unter Umständen zu merkwürdigen Fehlern führen kann, die schwer zu finden sind.
Tja, und dann bin ich über diesen Schreibfehler gestolpert
for PERCENT in (10..100..10); dodas kann doch nur ein Schreibfehler sein, denn eigentlich sollten das doch geschweifte Klammern sein
for PERCENT in {10..100..10}; dooder gibt es die superneueste Bash von der ich noch nichts weiss, die dort auch runde Klammern zulässt?
Und jede Sekunde die Abfrage ausführen
sleep 1ist doch etwas übertrieben, da steht doch bestimmt sowas wie
sleep 1m
Viele Grüße gosia

Offline Norman

  • Neuling
  • *
  • Beiträge: 30
  • Skill: Durchschnitt
Re: Fragen zur Bash
« Antwort #40 am: 08. Juli 2017, 01:09:23 »
Außer vielleicht daß man die Variablen in einer Funktion besser als local definiert.

Wie definiert man denn Variablen als local?

Tja, und dann bin ich über diesen Schreibfehler gestolpert
for PERCENT in (10..100..10); dodas kann doch nur ein Schreibfehler sein, denn eigentlich sollten das doch geschweifte Klammern sein
for PERCENT in {10..100..10}; dooder gibt es die superneueste Bash von der ich noch nichts weiss, die dort auch runde Klammern zulässt?

Das Script wird zumindest ordnungsgemäß mit den runden Klammern  ausgeführt, aber ich teste es auch mal mit geschweiften Klammern.

Und jede Sekunde die Abfrage ausführen
sleep 1ist doch etwas übertrieben, da steht doch bestimmt sowas wie
sleep 1m

Ich setz den Wert mal auf sleep 300, sollte für dieses Script auch ausreichen.

Danke für deine Ergänzungen. :)

Grüße
Norman

Offline gosia

  • Held Mitglied
  • *****
  • Beiträge: 992
  • Dankeschön: 168 mal
  • Desktop: Openbox + xfce
  • Grafikkarte: Intel HD 4000
  • Grafikkartentreiber: i915 (free)
  • Kernel: 4.9 Artix
  • Prozessor: Intel Core i5-3210M
  • Skill: Durchschnitt
  • Zweig: stable
Re: Fragen zur Bash
« Antwort #41 am: 08. Juli 2017, 21:23:11 »
Hallo Norman,
Wie definiert man denn Variablen als local?
Durch voranstellen des Wortes "local" ;)
local variable=1Kommt auch schon in meinem kleinen Beispielskript mit dem Datum vor.
Das Script wird zumindest ordnungsgemäß mit den runden Klammern  ausgeführt, aber ich teste es auch mal mit geschweiften Klammern.
Das verstehe ich nicht. Bei mir wirft es einen Syntaxfehler:
/tmp/z1.sh: Zeile 7: Syntaxfehler beim unerwarteten Wort `('
/tmp/z1.sh: Zeile 7: `    for PERCENT in (10..100..10); do'
und in dieser Form kenne ich es auch nur mit geschweiften Klammern. Es kann ja kaum an der Bash-Version liegen, aber was kommt bei dir raus?
bash --versionIch habe da
GNU bash, Version 4.4.12(1)-release (x86_64-unknown-linux-gnu)Ist irgendwie seltsam.

Viele Grüße gosia

Offline Norman

  • Neuling
  • *
  • Beiträge: 30
  • Skill: Durchschnitt
Re: Fragen zur Bash
« Antwort #42 am: 09. Juli 2017, 13:35:07 »
und in dieser Form kenne ich es auch nur mit geschweiften Klammern.

Stimmt, du hast recht mit den geschweiften Klammern. Ich hab den Teil mit der For-Schleife aus einem Beispiel genommen, das jemand im Arch-Forum gepostet hat und hab dann beim kopieren hierhin gar nicht drauf geachtet, dass da noch die normalen Klammern stehen. Ich habs nicht gemerkt, da ich das Script händisch bei mir auf dem Laptop getippt hab und da habe ich dann ganz normal die geschweiften Klammern benutzt. Hab gerade nochmal auf meinem Laptop geguckt, in dem Script stehen definitiv die geschweiften Klammern.

Spielt es für die Verfügbarkeit einer Variable eigentlich eine Rolle, wo genau im Script man diese definiert? Ich hatte jetzt die Variable BAR innerhalb der Funktion definiert, gehe ich richtig in der Annahme, dass diese Variable auch nur innerhalb der Funktion bekannt ist oder ist sie generell auch für andere Funktionen nutzbar, es sei denn man benutzt explizit local?
Ich frage deshalb, weil ich die Variable BAR, welche ich für die Rautenanzeige nutze, auch noch für die Helligkeit und die Lautstärkenanzeige nutzen möchte. Wäre ja etwas aufwendig, wenn ich die dann pro Funktion immer wieder neu schreiben müsste.

Grüße
Norman

Offline gosia

  • Held Mitglied
  • *****
  • Beiträge: 992
  • Dankeschön: 168 mal
  • Desktop: Openbox + xfce
  • Grafikkarte: Intel HD 4000
  • Grafikkartentreiber: i915 (free)
  • Kernel: 4.9 Artix
  • Prozessor: Intel Core i5-3210M
  • Skill: Durchschnitt
  • Zweig: stable
Re: Fragen zur Bash
« Antwort #43 am: 09. Juli 2017, 17:02:40 »
Hallo Norman,
Stimmt, du hast recht mit den geschweiften Klammern.
Und ich wäre schon fast vom rechten Glauben abgefallen ;)
Spielt es für die Verfügbarkeit einer Variable eigentlich eine Rolle, wo genau im Script man diese definiert? Ich hatte jetzt die Variable BAR innerhalb der Funktion definiert, gehe ich richtig in der Annahme, dass diese Variable auch nur innerhalb der Funktion bekannt ist oder ist sie generell auch für andere Funktionen nutzbar, es sei denn man benutzt explizit local?
Variable, die Du überall benutzen willst, solltest Du am Anfang deines Skriptes deklarieren. Das ist zwar nur eine Stilfrage, erhöht die Wartbarkeit aber ungemein. Von der Syntax her kannst Du sie auch verstreut im Skript deklarieren, das funktioniert auch, aber bei Änderungen wirst Du ständig die Suchfunktion bemühen und hin- und herrollen. Am Anfang, bei kleinen Skripts mag es egal sein, aber glaube mir, bald schreibst Du welche, die länger als 100 Zeilen haben.
Die schlechteste Idee ist es, solche überall benutzbaren Variablen innerhalb einer Funktion zu deklarieren. Da werden sie nämlich erst nach dem Aufruf der Funktion sichtbar.
Kopiere dir mal dieses kleine Skript, da wird es deutlicher, wie ich das meine:
#!/usr/bin/bash
function unsinn {
   bar="global"
   local foo="local"
   local barfoo="nur hier gültig"
   foobar="überall gültig, aber erst nach Aufruf der Funktion"
   echo "BAR=$bar, FOO=$foo, BARFOO=$barfoo, FOOBAR=$foobar"
}

bar=1
foo=2
echo "VORHER"
echo "bar: $bar"
echo "foo: $foo"
echo "barfoo: $barfoo"
echo "foobar: $foobar"
unsinn
echo "NACHHER"
echo "bar: $bar"
echo "foo: $foo"
echo "barfoo: $barfoo"
echo "foobar: $foobar"
exit
Da das Thema relativ komplex ist, solltest Du dir auch mindestens diesen Abschnitt durchlesen:
http://openbook.rheinwerk-verlag.de/shell_programmierung/shell_008_004.htm#RxxKap00800404004EB01F028172

Viele Grüße gosia