Unix-Quizfrage :-)

  • Die folgende Eingabe (ohne Zeilennummer) in der Linux-/Unix-Shell (Bash)

    Code
    s=0; for i in 1 2 3; do s=`expr $i + $s`; done; echo "s=$s"

    liefert die Ausgabe

    Code
    s=6


    Aber die Eingabe nur erweitert um " | nl" nach "done"

    Code
    s=0; for i in 1 2 3; do s=`expr $i + $s`; done | nl; echo "s=$s"

    liefert

    Code
    s=0


    Erklären Sie den Unterschied. :D


    Auflösung in paar Tagen 8)


    (Da Android auf Unix basiert, habe ich das in diesem Unterforum gepostet.)

    Ich nutze: 1&1 | Handyvertrag.de | Sipgate | Satellite | Easybell | Freevoipdeal | AVM | Kubuntu 22.04 | Windows 11 | Android | Fonial | Zoiper | Norisbank

    5 Mal editiert, zuletzt von ghor ()

  • `nl` wird in einer Subshell gespawned, damit ist der Zugriff auf die modifizierte VAR nicht mehr vorhanden. "nl" muss daher zum Schluss erfolgen; was hier in diesem Fall aber witzlos ist. Einfacher daher; func auslagern und/oder hilf VAR zum Hochzählen als counter nutzen und mit ausgeben.

  • Genau, in der Subshell der Pipe ist es nicht möglich, Variablen des Elternprozesses zu ändern.

    Musste ich dann auch erstmal wieder ergoogeln.


    War nur erst extrem verwundert, warum nur durch Hinzufügen einer "kleinen" Pipe nach "done" auf einmal mein Ergebnis weg war =O:/8|


    Hatte das Script aus der ersten Antwort hier leicht angepasst und mir die Größensumme der Pakete/Apps berechnet. Nach hinzufügen von "| sort -nr" nach "done" war dann erstmal :/ angesagt. Übrigens interessantes Script ... falls wer wissen will, wieviel MB Platz seine Apps verbrauchen.

    Meine Lösung: Ich erzeuge eine Datei in der Schleife, die danach sortiert wird.

    Ich nutze: 1&1 | Handyvertrag.de | Sipgate | Satellite | Easybell | Freevoipdeal | AVM | Kubuntu 22.04 | Windows 11 | Android | Fonial | Zoiper | Norisbank

  • Tipp, jetzt noch nicht relevant bei so kleineren Sachen, aber file open, file write, file close, file open, file read kostet zu viel zeit und performance (und zusätzliches errorhandling, überhaupt vorhanden, Berechtigungen, Struktur Prüfung usw.). Selbe für tmpfile imports... ich würd dies direkt in ein array schreiben und dann sorted auslesen.

  • Ein Script, was mal eben die APK-Größen etc. berechnet, wird ja nicht soo oft benutzt und ist daher nicht so zeitkritisch.

    Vielleicht baue ich es mal um mit Array, war mir aber erstmal nicht so wichtig, wollte schnell die "dicksten" Apps finden.


    ---


    Bin immer noch platt, was mit ADB so geht.

    Habe mir mal alles in eine Datei ausgeben lassen, was mit "dumpsys ..." so geht ... das waren über 6 MB und über 80000 Zeilen =O

    Das steht auch jeder Furz drin, den eine App gelassen hat :)

    Ich nutze: 1&1 | Handyvertrag.de | Sipgate | Satellite | Easybell | Freevoipdeal | AVM | Kubuntu 22.04 | Windows 11 | Android | Fonial | Zoiper | Norisbank

  • Ein Script, was mal eben die APK-Größen etc. berechnet, wird ja nicht soo oft benutzt und ist daher nicht so zeitkritisch.

    Vielleicht baue ich es mal um mit Array, war mir aber erstmal nicht so wichtig, wollte schnell die "dicksten" Apps finden.

    Man sollte sich halt direkt richtig angewöhnen, auch wenn es für kleinere Sachen vielleicht oftmals nicht um timing, Performance und co geht, ist das handling vom Array im Mem deutlich einfacher, als file handling mit read/write operations, wenn man es richtig macht.


    Wenn man nur:

    $> foo > bar

    $> Z=$(cat bar)

    Macht, klingt das erstmal einfach(er), aber es fehlt eigentlich alles drumherum. Letztlich fehlt aber eigentlich alles Drumherum… daher lieber gleich richtig (lernen).

  • Ich hab noch ne Quizfrage:


    Code
    alias localip='ip addr | grep -Po '\''(?<=inet)\s(?!127)[^/]+'\'


    Wenn ich den ip ... Befehl direkt in der Shell eingeben will (ohne Alias Nutzung) ...

    ... wie schreibe ich das dann? Kriege ich grade nicht hin mit den vielen " ' " da drin. :/

    [Auf den 1. Blick würde ich bei dem alias ... auch sagen, da fehlt ein " ' " am Ende, aber das ist wohl alles korrekt so (geht jedenfalls ohne Fehler).]

    Ich nutze: 1&1 | Handyvertrag.de | Sipgate | Satellite | Easybell | Freevoipdeal | AVM | Kubuntu 22.04 | Windows 11 | Android | Fonial | Zoiper | Norisbank

  • vermutlich willst du es dann so (für ipv4 only und localhost excluded):

    Zitat

    ip a | grep -Po '(?<=inet\s)(?!127)\d+(\.\d+){3}'


    # als alia

    alias localip="ip a | grep -Po '(?<=inet\s)(?!127)\d+(\.\d+){3}'"

    ergibt:

    Zitat

    $> localip

    10.10.10.15

  • ip a | grep -Po '(?<=inet\s)(?!127)\d+(\.\d+){3}'

    Geschickt umgangen. Funktioniert.

    Nur weiß ich jetzt immer noch nicht, wo bei dem Befehl oben die " ' " oder " \ " oder was auch immer hin müssen, wenn ich ihn direkt eingebe :(

    Ich nutze: 1&1 | Handyvertrag.de | Sipgate | Satellite | Easybell | Freevoipdeal | AVM | Kubuntu 22.04 | Windows 11 | Android | Fonial | Zoiper | Norisbank

  • Den Alias Befehl selbst setzt du einfach am Besten in andere Quotes, als du für deine Befehle nutzt (Single vs Double Quotes). Leider verstehe ich nicht ganz, was du dort vorhast, bzw. wofür du schon den ersten '\' setzt. Daher habe ich es einfach kurz geschrieben, wie ich es für diesen Fall nutzen würde. Persönlich würde ich lieber AWK nutzen

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!