Bash vs. Powershell



  • Sonstige Programmiersprachen.

    Was haltet ihr von Bash?

    Braucht man das auch nicht jeden Tag?

    Bei mir auf der Arbeit darf man sich die Shell sogar auswählen.

    Sonst hat man ja Powershell oder so.


    Anmelden zum Antworten
     


  • @siri sagte in Bash vs. Powershell:

    Was haltet ihr von Bash?

    Alles über ~20 Zeilen (gut, vielleicht kann man etwas großzügiger sein, wenn viele echos dabei sind) sollte man nicht in Bash schreiben. Die Sprache ist kompliziert, man muss ungeheuer auf das Quoting aufpassen, d.h. man kann viel zu leicht Fehler machen, wenn Whitespace in Variablen vorkommt, man kann keine verschachtelten Datenstrukturen erzeugen, return geht über echo usw.

    Also ja, um schnell was zusammen zu stöpseln - kein Problem. Solange man nicht anfängt, irgendwelche komplexe Logiken zu implementieren. Das geht zwar auch, aber wie gesagt, ich würde es nicht empfehlen.

    Sonst hat man ja Powershell oder so.

    Nur auf Windows.



  • Das von @wob kann ich bedenkenlos, vollumfänglich dick unterstreichen. Sobald die Logik komplexer wird oder es um Whitespaces, etc. geht, kommt man mit bash-Scripts nicht weiter. Dann besser eine Alternative wie: Java, Python oder C++.



  • @wob

    Hallo erstmal!

    Dass ein Bash-Skript nur rund 20 Zeilen beanspruchen sollte kann ich nicht vertreten. Es ist wahr, dass der Einstieg in Bash und der Linux Welt am Anfang etwas holpriger sein kann. Man hat übrigens das Kommando shellcheck das man auf einem Linux installieren kann und der kann aber schon dutzend Warnungen ausspucken über so genannte Bad Practices. Und ja, Bad Practices gibt es recht viele.

    Ja, der Quoting Mechanismus in Bash ist auch gewöhnungsbedürftig, aber sobald man weiß wie das unterm Hut funktioniert, ist es dann doch recht simpel. Vielleicht fehlt es auch einfach nur an mangelnder guter Lektüre. Nachdem ich lange schmutziges Bash geschrieben habe, habe ich den bashguide.pdf am besten gefunden.

    @wob sagte in Bash vs. Powershell:

    Nur auf Windows.

    Mittlerweile kannst du dir die Powershell auch auf einem Linux System installieren. Hier.



  • @siri sagte in Bash vs. Powershell:

    Man hat übrigens das Kommando shellcheck das man auf einem Linux installieren kann

    Und das recht schnell an der Stelle versagt, wo es um Aufrufe innerhalb von Quotes geht.

    Was dann obendrein auch unübersichtlich wird. Deshalb: vermeiden.



  • @Kuh-Mit-U sagte in Bash vs. Powershell:

    Und das recht schnell an der Stelle versagt, wo es um Aufrufe innerhalb von Quotes geht.

    Quoten ist grundsätzlich (und zumals mit $(...) statt den Backticks) ganz einfach. Gründsätzlich gilt die Regel für, quote alles, bis auf einige wenige Ausnahmen.



  • Jein, im Grunde hast du recht. Aber shellcheck überspringt dann die Interpretation des Teils, der innerhalb der Quotes steht (ich nenne das mal innere Quotes). Das ist nicht so toll.

    Beispiel:

    #!/bin/sh
    tigervncserver -localhost yes -SecurityTypes None -geometry 1600x900 -autokill \
    && cd noVNC/ && (nohup ./utils/novnc_proxy --vnc localhost:5901 --listen 6901 &) \
    && trap 'tigervncserver -kill :*; exit' INT; echo waiting; while : ; do sleep 1 ; done
    

    shellcheck interessiert sich hier für das nachgestellte Argument der trap nicht mehr (anstatt exit könnte ich zum Beispiel tixe schreiben) ...

    Zudem weißt du vielleicht, dass printf Turing-vollständig ist. Aber möchte man wirklich alles in/mit printf programmieren? Damit wären dann auch solche Späße wie https://github.com/HexHive/printbf möglich.



  • @siri sagte in Bash vs. Powershell:

    Quoten ist grundsätzlich (und zumals mit $(...) statt den Backticks) ganz einfach

    Finde ich nicht.

    for (const auto &var : array) { ... } in C++ oder for var in array: ... in Python sind klar und einfach, ebenso Loops über maps.

    Und jetzt in bash:
    for var in "${array[@]}"; do ...; done

    Wer hat hier nicht schon einmal was falsch gemacht beim "${array[@]}" - vielleicht ...[*]... verwendet oder single quotes genutzt oder gar keine Quotes weil "die Werte sind eh fixe einfache Strings ohne Spaces"...

    Oder gar sowas hier:
    declare -A mymap=(["a x"]="1 2" ["b c"]="3 4"); what_is_this=("${!mymap[@]}")

    Das liest sich sogar deutlich schlechter als Perl.

    Und dann machst du echo $what_is_this oder echo $what_is_this[@] statt echo ${what_is_this[@]}... Bei den geschweiften Klammern muss man also ebenso höllisch aufpassen. Und selbst wenn man es korrekt macht - bei einem einfache echo davon siehst du in der Ausgabe sowieso nicht mehr, wo die Elementnamen enden...

    Da ist sowas wie what_is_this = mymap.keys(); print(what_is_this) in Python doch DEUTLICH lesbarer!
    Und sogar C++-Code ist viel lesbarer! Auch wenn man da entweder über std::views::keys gehen muss oder mit pair.first rumhantiert...

    Und wie gesagt, sowas wie

    declare -A mymap=(
      ["ja hallo"]=(dies soll auch ein Array sein)
    )
    

    geht nicht.

    Ich kann kein Stück nachvollziehen, dass quoten einfach wäre. Ist es nicht.



  • @wob Bash ist in der Tat, und zumals was den Syntax-Zucker angeht, eine Sache für sich.

    Ich habe den bereits zuvor geposteten bashguide.pdf durchgelesen, welcher auch im #bash Channel auf Libera empfohlen wird und kann die Lektüre nur empfehlen, falls man dringlich gutes Bash lernen will/muss.

    @Ein-ehemaliger-Benutzer shellcheck mag vielleicht nicht das Quoting korrekt zu determinieren, ich nutze es trotzdem bei all meinen erstellten Bash Scripts, weil es aber auch jede Menge andere Fehler/Warnungen/Dont-Do's ausspuckt.



  • @wob sagte in Bash vs. Powershell:

    @wob sagte in Bash vs. Powershell:

    what_is_this=("${!mymap[@]}")

    This is eine Folge von deinen Keys in deinem associative array. Und da du ein Array davon erstellst und du [@] statt [*] benutzt hast, UND du die Expression quotiert hast, hast du alles richtig gemacht.

    @wob sagte in Bash vs. Powershell:

    Und dann machst du echo $what_is_this oder echo $what_is_this[@] statt echo ${what_is_this[@]}... Bei den geschweiften Klammern muss man also ebenso höllisch aufpassen.

    Deshalb mach ich sie immer. einfach x=Mein String; printf '%s\n' "${x}". Ja ich tendiere immer lieber printf als echo zu benutzen.

    @wob sagte in Bash vs. Powershell:

    Und wie gesagt, sowas wie
    declare -A mymap=(
    ["ja hallo"]=(dies soll auch ein Array sein)
    )

    Ja, das fehlt mir auch. Geht aber leider nicht.

    @wob sagte in Bash vs. Powershell:

    Ich kann kein Stück nachvollziehen, dass quoten einfach wäre. Ist es nicht.

    Ich schon. Wie gesagt, ich gebe zu dass es für den Einstieg etwas holprig ist, aber ich mache das schon sehr lange und wenn du deinen Code gut strukturierst und die richtigen Lektüren durch hast, dann ist das auch kein Hindernis mehr.


Anmelden zum Antworten