Shell-Script - Optimierung in Upgradeabfragescript

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Den folgenden Code kann man noch optimieren indem man comm benutzt. Aber dann geht natuerlich der ganze schoene bash Code als Beispielcode floeten ;(

  • Shell-Script - Optimierung in Upgradeabfragescript? Schau mal ob du hier fündig wirst!

  • Habs mal so abgeändert dass ich alles verstehe ^^ Sollte jedoch inetwa das selbe erledigen.

    Wenn du dir mal die manual-Page von aptitude durchließt stößt du zum Beispiel auf einen Hinweis... Du nutzt oben:

    aptitude search '~U' | cut -c 5-35 | cut -d" " -f1

    Aber wieso nutzt du nicht

    aptitude search '~U' -F%p


    Deshalb: Bitte manual-Pages lesen

    Denke meist nicht an die Manuals. Nutze meist --help was meist aber nicht sehr hilfreich ist. Ich bin während der Recherche auf cut gestossen darum hab ich den da drin. Aber gut zu wissen muss mir die Manuals echt mehr zu Herzen legen ^^. Aber das schöne ist ja dass es mehrere Wege ans Ziel gibt :). Du siehst ja, ich lerne noch. Versuche mit jedem Schritt etwas mehr, nehme einen Befehl mehr rein oder versuche es zu vereinfachen.

    Ich suche nicht nach einer fertigen Lösung sondern nach dem Weg dahin ;)

    13 Mal editiert, zuletzt von Apop85 (27. Dezember 2017 um 10:50)

  • Vielleicht noch einen Tip:

    Konstanten (z.B. die Dateinamen) würde ich in Grossbuchstaben schreiben. Dann kann man sie leicht als solche erkennen. Wenn du readonly vor die Definition schreibst prüft auch bash dass sie nicht geändert werden ;)

  • Hey framp

    Meinst du inetwa so?

    Code
    readonly UDLIST=/var/tmp/udlist.tmp
    readonly UDLAST=/var/tmp/udlast.tmp
    ...

    Was ich mich noch gefragt habe ist ob Raspian auch Umgebungsvariablen zur verfügung stellt wie bei Windows z.b. %tmp% oder %appdata% o.ä.? Bzw. ich denke die Antwort lautet ja, nur scheine ich nach den falschen Stichworten zu suchen da ich nichts finde.

    Ich suche nicht nach einer fertigen Lösung sondern nach dem Weg dahin ;)

  • Ich denke ich habe mit dem Script soweit das erreicht was ich möchte bzw fällt mir grad nichts sinnvolles ein wie ich es noch erweitern könnte. Wenn ihr gute Ideen hättet welche ich zu Lernzwecken noch implementieren könnte, immer raus damit ;) .

    Werde den Thread sonst mal als erledigt markieren und danke euch nochmals für die Unterstützung :)

    Ich suche nicht nach einer fertigen Lösung sondern nach dem Weg dahin ;)

  • Sorry hab das immer im obigen Beitrag entsprechend abgeändert =) Klar, hier nochmals die (bisherige) Endfassung:

    Ich suche nicht nach einer fertigen Lösung sondern nach dem Weg dahin ;)

  • Hallo zusammen

    Hab das Script nochmals etwas angepasst und gewisse Abfragen abgeändert damit die bei einem Leerlauf (0 Updates) nicht durchgeführt werden. Hab auch noch eine Ausgabe in eine Log-Datei implementiert und es wird auch noch ausgelesen welches Paket oder welche Pakete den Flag verursacht.

    Gibt es da eine "Konvention" wo im Script man die functions definiert? Und habt ihr evt einen Tipp wie bzw mit welchem Befehl ich dist-upgrade noch implementieren könnte? Als Ausgabe würde ich gerne 1 oder 0 kriegen, also dist-upgrade vorhanden ja oder nein.

    Grüsse Apop

    Ich suche nicht nach einer fertigen Lösung sondern nach dem Weg dahin ;)

    2 Mal editiert, zuletzt von Apop85 (17. Mai 2018 um 14:56)

  • In bash muss man Funktionen vor dem tatsächlichen Aufruf definieren. Aber eine "Konvention" gibt es IMHO nicht ;)

    Die 2.Frage versteh ich nicht. Was genau meinst du mit "mit welchem Befehl ich dist-upgrade noch implementieren könnte" ?

  • Danke für die Antwort :)

    Schlussendlich will ich einfach noch eine Anzeige ob bei apt-get dist-upgrade etwas vorhanden ist oder nicht um dann bei der 41. Zeile folgendes hinzuzufügen:

    echo "Es sind $anzahl Updates für den Raspberry verfügbar! Flags: $flags - [$flagname]" Distupgrade: Ja/Nein

    EDIT versteht ich das man apt-get richtig dass dist-upgrade im Unterschied zu upgrade einfach nur das "intelligente Konfliktlösungssystem" verwendet? Der Name ist etwas irreführend, dachte immer dass das eine neue Linux-Version (Raspian oder whatever) aufspielt. Aber wenn ich das man richtig versteh sind die Pakete die selben einfach mit dist-upgrade könnte es sein dass einige andere Pakete entfernt werden?

    Spoiler anzeigen

    dist-upgrade führt zusätzlich zu der Funktion von upgrade intelligente Handhabung von Abhängigkeitsänderungen mit neuen

    Versionen von Paketen durch. apt-get hat ein »intelligentes« Konfliktauflösungssystem und es wird versuchen, Upgrades der wichtigsten Pakete, wenn nötig zu Lasten der weniger wichtigen, zu machen. So könnte der dist-upgrade-Befehl einige Pakete entfernen. Die /etc/apt/sources.list-Datei enthält eine Liste mit Orten, von denen gewünschte Paketdateien abgerufen werden. Siehe auch apt_preferences(5) für einen Mechanismus zum überschreiben der allgemeinen Einstellungen für einzelne Pakete.

    Falls das so ist kannst die 2. Frage vergessen ^^

    Ich suche nicht nach einer fertigen Lösung sondern nach dem Weg dahin ;)

    3 Mal editiert, zuletzt von Apop85 (27. Januar 2018 um 21:27)

    • Offizieller Beitrag

    Hallo,

    dachte immer dass das eine neue Linux-Version (Raspian oder whatever) aufspielt.

    Nein, dist-upgrade installiert keinen neuen Kernel. ;)

    dist-upgrade bringt die installierten Pakete auf den neuesten in den Paketquellen verfügbaren Stand. Hierbei werden im Gegensatz zu upgrade neue Pakete installiert und durch neue Abhängigkeiten unnötig gewordene Pakete ersetzt, auch wenn dies alte Abhängigkeiten beeinflusst. dist-upgrade benötigt keine Angabe von Paketnamen.

    Code
    sudo apt-get [Option(en)] dist-upgrade  

    Hinweis:

    dist-upgrade führt kein Upgrade auf eine neue Ubuntu-Version durch.

  • Dann hat sich die Frage erledigt ^^ . Danke euch und sorry für das missverständnis ;)

    Etwas kosmetisches noch: $flagname würde bei mehreren flags/paketen mit Zeilenumbrüchen ausgegeben werden. Wie bzw welchen Befehl / Pipekombination kann ich nutzen damit ich das auf eine Zeile bringe mit , dazwischen, also eine Aufzählung Paket1, Paket2, Paket3 ect

    EDIT: Hat sich glaube ich erledigt. Habs mal simuliert und anscheinend kommt bereits alles auf eine Zeile bei mehreren Flags. Dachte hätte mal gelesen dass die Zeilenumbrüche übernommen werden.

    Ich suche nicht nach einer fertigen Lösung sondern nach dem Weg dahin ;)

    5 Mal editiert, zuletzt von Apop85 (28. Januar 2018 um 11:33)

  • Hey zusammen :)

    Hätte noch eine Frage bezüglich Code-Optimierung

    Kann man folgenden Teil in eine einzige IF-Abfrage stecken bzw diese Abfolge vereinfachen/verkürzen?

    Ich hab mal ein Beispiel gesehen in welchem if [ $blah == 1 ][ $blubb == 2 ]; then... oder so ähnlich verwendet wurde (finde es leider grad nicht mehr). Gibts da evt eine gute Referenz zum nachlesen?

    Grüsse Apop

    Ich suche nicht nach einer fertigen Lösung sondern nach dem Weg dahin ;)

  • Wozu die IFs überhaupt?

    touch $UDLAST $LOGFILE $REFLIST

    Wenn ein File nicht existiert, wird es angelegt. Wenn es existiert, lediglich der Zeitstempel aktualisiert.

    Hab ich was übersehen?

    //EDIT:

    Script in #30 wertet die Zeitstempel nicht aus, ansonsten siehe @KKoPis Hinweis.

    Wenn du nichts zu sagen hast, sag einfach nichts.

    Einmal editiert, zuletzt von llutz (9. Februar 2018 um 09:07)

  • Optimiere dein Script nicht kaputt :fies:


    Normalerweise macht man hier eine && Verknüpfung mit einem NOT in der Abfrage.

    Code
    [ ! -f $UDLAST ]  && touch $UDLAST
    [ ! -f $LOGFILE ] && touch $LOGFILE
    [ ! -f $REFLIST ] && touch $REFLIST

    Allgemein lässt sich dazu sagen dass das eine verkürzte Schreibweise der normalen "if" ist, was sich bei so kurzen Abhandlungen anbietet aber vom Prinzip her nichts anderes ist wie die von Apop85 verwendete. Es spielt also eigentlich keine Rolle ob Apop85 das eine oder andere verwendet - das von KKoPi wäre nur eine kürzere Schreibweise, aber keine Optimierung im eigentlichen Sinne.

    Man kann mehrere Abfragen miteinander verknüpfen, allerdings sehe ich in diesem Fall keine sinnvolle Möglichkeit.

    Das 2. ist solch eine Verkürzung... Problematisch wird diese Schreibweise allerdings wenn in der if mehreres drin steht oder die Bedingungen umfangreicher werden.

    Beim 4. werden AND und OR in einer Abfrage verwendet.

    Dabei zu beachten ist aber:


    PS: Bevor du für jede Kleinigkeit fragst, google bitte erst und nehme stumpf /bin/bash in deine Suchanfrage auf.

    PPS: Man sollte immer " in den Abfragen verwenden.

  • llutz danke, manchmal sieht man einfach den Wald vor lauter Bäume nicht ^^ . Das mit den Zeitstempeln versteh ich noch nicht so ganz, also wozu könnte man das brauchen (aus reiner Neugierde)? Bei mir ging es ja nur darum Dateien zu erstellen falls diese noch nicht vorhanden sind damits keinen Error gibt, wenn der Zeitstempel also bei jedem Run aktualisiert wird macht das in diesem Script nichts aus.

    KKoPi Ja das habe ich mal gelesen. Und ja mir ist klar dass es keinen Unterschied macht. Es sieht dann nur etwas ordentlicher aus (mmn). Aber da die Überprüfung anscheinend eh nicht notwendig ist habe ich nun die Variante von llutz genommen.

    meigrafd Ja ich versuch mein bestes das "Kaputtoptimieren" zu vermeiden ;) . Ich habs nur nochmals etwas angepasst damit es einfacher ist dieses ggf auf anderen Rechnern/mit anderen Telegram-ID's zu nutzen oder falls gewünscht auch mit dem LINE-Messenger.

    Dass diese Schreibweise eher ungeeignet bzw unübersichtlich ist für mehrschichtige If-Abfragen dachte ich mir schon, die Verwendung war auch nur für das oben genannte Beispiel gedacht. Meine Suchabfrage beeinhaltet meistens bash script command oder wenn ich nach dem command suche bash script funktion

    Ich suche nicht nach einer fertigen Lösung sondern nach dem Weg dahin ;)

    7 Mal editiert, zuletzt von Apop85 (10. Februar 2018 um 22:05)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!