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.
-
@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 überecho
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++.
-
Ein ehemaliger Benutzer 6. Nov. 2024, 18:19 zuletzt editiert von Ein ehemaliger Benutzer 6. Nov. 2024, 18:21
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.
-
Ein ehemaliger Benutzer 7. Nov. 2024, 20:49 zuletzt editiert von Ein ehemaliger Benutzer 7. Nov. 2024, 20:49
@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.
-
Ein ehemaliger Benutzer 8. Nov. 2024, 15:58 zuletzt editiert von Ein ehemaliger Benutzer 8. Nov. 2024, 16:00
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++ oderfor 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
oderecho $what_is_this[@]
stattecho ${what_is_this[@]}
... Bei den geschweiften Klammern muss man also ebenso höllisch aufpassen. Und selbst wenn man es korrekt macht - bei einem einfacheecho
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 überstd::views::keys
gehen muss oder mitpair.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.
-
Ein ehemaliger Benutzer 8. Nov. 2024, 19:42 zuletzt editiert von Ein ehemaliger Benutzer 8. Nov. 2024, 19:42
@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.
-
Ein ehemaliger Benutzer 10. Nov. 2024, 17:23 zuletzt editiert von Ein ehemaliger Benutzer 10. Nov. 2024, 17:38
@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 lieberprintf
alsecho
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.