Shell-Script - Optimierung in Upgradeabfragescript

  • Den folgenden Code kann man noch optimieren indem man comm benutzt. Aber dann geht natuerlich der ganze schoene bash Code als Beispielcode floeten ;(

    "Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect."

    Linus Benedict Torvalds, 28.9.2003


    Hast Du die Woche schon Deine Raspberry gesichert =O Bei mir tut das raspiBackup automatisch ;)

  • 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 ;)

    Edited 13 times, last by Apop85 ().

  • 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 ;)

    "Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect."

    Linus Benedict Torvalds, 28.9.2003


    Hast Du die Woche schon Deine Raspberry gesichert =O Bei mir tut das raspiBackup automatisch ;)

  • 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 ;)

    Edited 2 times, last by Apop85 ().

  • 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?

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

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

    Edited 3 times, last by Apop85 ().

    • Official Post

    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 ;)

    Edited 5 times, last by Apop85 ().

  • 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.

    Menschen die keine Ironie verstehen finde ich super!

    Edited once, last by llutz ().

  • Am einfachsten wie llutz schrieb, wenn unbedingt mit Test


    Code
    [ -f $UDLAST ]  || touch $UDLAST
    [ -f $LOGFILE ] || touch $LOGFILE
    [ -f $REFLIST ] || touch $REFLIST

    Hintergrund kann sein, den Zeitstempel eben nicht pauschal zu setzen für irgendwelche Auswertungen.

  • 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.

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

    Na ja, ich mache "normalerweise" im Zweifelsfall die "kürzere" (und evtl. schnellere) Abfrage, bei meinem || (OR) muss das Ausrufezeichen nicht erst noch interpretiert werden, das Ergebnis ist aber das gleiche...


    Aber das wird jetzt eine philosophische Diskussion :)


    Knut

  • 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 ;)

    Edited 7 times, last by Apop85 ().