<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki.uugrn.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Tilt</id>
	<title>UUGRN - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.uugrn.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Tilt"/>
	<link rel="alternate" type="text/html" href="https://wiki.uugrn.org/Spezial:Beitr%C3%A4ge/Tilt"/>
	<updated>2026-06-11T07:18:15Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.42.5</generator>
	<entry>
		<id>https://wiki.uugrn.org/index.php?title=Wissen/Bourne_Shell&amp;diff=12781</id>
		<title>Wissen/Bourne Shell</title>
		<link rel="alternate" type="text/html" href="https://wiki.uugrn.org/index.php?title=Wissen/Bourne_Shell&amp;diff=12781"/>
		<updated>2021-02-10T02:04:52Z</updated>

		<summary type="html">&lt;p&gt;Tilt: /* Kompatibilität */ klarere Formulierung&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Bourne-Shell: Geschichte und Grundlagen =&lt;br /&gt;
&lt;br /&gt;
* Datum: 5. Februar 2021&lt;br /&gt;
* Referent: Tilman Kranz [mailto:tilt@linuxfoo.de tilt@linuxfoo.de]&lt;br /&gt;
* Ca. 120 Minuten&lt;br /&gt;
&lt;br /&gt;
== Teil 1: Geschichte ==&lt;br /&gt;
&lt;br /&gt;
=== Thompson-Shell ===&lt;br /&gt;
&lt;br /&gt;
* Erste Shell für AT&amp;amp;amp;T UNIX (“UNICS”) Version 1 bis 6&lt;br /&gt;
* Name des Programms: “sh” (liegt im Verzeichnis “/bin”). Also lautet der absolute Pfadname &amp;lt;code&amp;gt;/bin/sh&amp;lt;/code&amp;gt;,&lt;br /&gt;
* Aufgaben:&lt;br /&gt;
** Starten von Programmen&lt;br /&gt;
** Umleiten von Ausgaben (“Redirection”) in andere Programme (“Filter”) oder in Dateien.&lt;br /&gt;
* Siehe auch Manpage https://www.in-ulm.de/~mascheck/bourne/v3/&lt;br /&gt;
&lt;br /&gt;
=== Bourne-Shell ===&lt;br /&gt;
&lt;br /&gt;
* Nachfolger der Thompson-Shell ab AT&amp;amp;amp;T UNIX Version 7.&lt;br /&gt;
* Hauptaugenmerk auf “Command Language” (mit Bedingunge, Schleifen u.v.a.m.).&lt;br /&gt;
** Syntax der Sprache inspiriert von ALGOL68.&lt;br /&gt;
* Außerdem können Shell-Skripten selbst Filter sein (ging bei Thompson Shell nicht).&lt;br /&gt;
* Seit 1989 quasi quasi unverändert, vergleiche auch: https://en.wikipedia.org/wiki/Bourne_shell#Features_introduced_after_1979&lt;br /&gt;
* Code der Bourne Shell war die Inspiration für den International Obfuscated C Code Contest&amp;amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== C-Shell ===&lt;br /&gt;
&lt;br /&gt;
* Entwickelt von der “Berkeley Group” (BSD) als Alternative zu Bourne Shell.&lt;br /&gt;
* Inspiriert von C-Syntax.&lt;br /&gt;
* Komfortabler als die Bourne Shell für interaktive Benutzung.&lt;br /&gt;
* Gilt inzwischen als veraltet (“C Shell Programming considered harmful”).&lt;br /&gt;
&lt;br /&gt;
=== Korn-Shell ===&lt;br /&gt;
&lt;br /&gt;
* Kompatibel zur Bourne-Shell.&lt;br /&gt;
* Mehr Funktionen.&lt;br /&gt;
* Sehr viel besser für interaktive Benutzung:&lt;br /&gt;
** History,&lt;br /&gt;
** Commandline editing,&lt;br /&gt;
** Job-Kontrolle.&lt;br /&gt;
* Wichtige Versionen:&lt;br /&gt;
** 88: Grundlage für POSIX:&lt;br /&gt;
*** https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html&lt;br /&gt;
** 93: Kompletter Rewrite, viel mächtiger, verbraucht aber viel mehr Speicher und CPU.&lt;br /&gt;
&lt;br /&gt;
=== Bourne-Again-Shell ===&lt;br /&gt;
&lt;br /&gt;
* Autragsarbeit eines Festangestellten der Free Software Foundation für das GNU-Projekt.&lt;br /&gt;
** Auf BSD nicht standardmäßig installiert bzw. oft in &amp;lt;code&amp;gt;/usr/local/bin&amp;lt;/code&amp;gt; o.ä.&lt;br /&gt;
* Kompatibel zu Bourne Shell:&lt;br /&gt;
** Spezieller Kompatibilitätsmodus wenn als “sh” aufgerufen&lt;br /&gt;
* Arrays.&lt;br /&gt;
* “shopt” statt “set” für Bash-spezifische Optionen&lt;br /&gt;
* Stark erweiterte Parameter-Expansion&lt;br /&gt;
** z.B. Substitution,&lt;br /&gt;
** Siehe Manpage.&lt;br /&gt;
* Verbesserte Arithmetik.&lt;br /&gt;
* Erweiterte Redirection.&lt;br /&gt;
* Sehr stark verbesserter interaktiver Modus ähnlich Korn Shell.&lt;br /&gt;
&lt;br /&gt;
=== Almquist-Shell (“ash” bzw. “dash”) ===&lt;br /&gt;
&lt;br /&gt;
* Reimplementation der Bourne Shell unter anderer Lizenz.&lt;br /&gt;
* Zuerst für BSD, später portiert auf Debian (dort “dash”).&lt;br /&gt;
&lt;br /&gt;
=== Z-Shell ===&lt;br /&gt;
&lt;br /&gt;
* Reimplementation der Bourne Shell mit stark erweiterten Features.&lt;br /&gt;
* Empfohlen als interaktive, nicht aber als nicht-interaktive Shell.&lt;br /&gt;
** Grund: Shell-Skripten in zsh setzen installierte zsh voraus.&lt;br /&gt;
&lt;br /&gt;
=== Kompatibilität ===&lt;br /&gt;
&lt;br /&gt;
* Kern: Bourne Shell (und deshalb meine Empfehlung).&lt;br /&gt;
* Vorsicht: In &amp;quot;Bourne-kompatiblen&amp;quot; Shells kann man Code schreiben, der in Bourne &#039;&#039;nicht&#039;&#039; geht.&lt;br /&gt;
&lt;br /&gt;
== Teil 2: Grundlagen ==&lt;br /&gt;
&lt;br /&gt;
=== Funktionsweise ===&lt;br /&gt;
&lt;br /&gt;
* Betriebsmodus “interaktiv”.&lt;br /&gt;
** Spezialfall “Login-Shell”.&lt;br /&gt;
** Zeilenweise Ein- und Ausgabe über ein tty (“Teletype”, Printer, serielle Schnittstelle, Terminal, Terminal Emulator).&lt;br /&gt;
* Betriebsmodus “non-interaktiv”&lt;br /&gt;
* “Shebang”-Konvention in Skripten (erste Zeile &amp;lt;code&amp;gt;#!/bin/sh&amp;lt;/code&amp;gt;).&lt;br /&gt;
* Kommentare&lt;br /&gt;
* Line Continuation&lt;br /&gt;
* Shell-Optionen, die den Betriebsmodus verändern (z.B. &amp;lt;code&amp;gt;-e&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;-x&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Zeilenbasierter Parser&lt;br /&gt;
* Expansionen&lt;br /&gt;
** Siehe dazu z.B. die Manpage von “dash”, Abschnitt “Word Expansions”&lt;br /&gt;
* Kontrollstrukturen&lt;br /&gt;
* Redirection und Pipes&lt;br /&gt;
&lt;br /&gt;
=== Grundsätzliche Features ===&lt;br /&gt;
&lt;br /&gt;
* “Strings are first-class citizens and the only citizens” – Stephen Bourne&lt;br /&gt;
* Es gibt kein “goto” (Bourne ist ALGOL-Fan)&lt;br /&gt;
* Hauptaufgaben:&lt;br /&gt;
** Zuweisungen&lt;br /&gt;
*** Spezialfall: “export”&lt;br /&gt;
** Kommandos ausführen&lt;br /&gt;
*** builtins vs. executables&lt;br /&gt;
* Variablen:&lt;br /&gt;
** Einfach: “foo=bar”&lt;br /&gt;
** Export an Subprozesse: “export FOO=bar”&lt;br /&gt;
** Zugriff auf den Wert der Variable:&lt;br /&gt;
*** &amp;lt;code&amp;gt;echo &amp;amp;quot;$foo&amp;amp;quot;&amp;lt;/code&amp;gt; (“verkürzte Syntax”)&lt;br /&gt;
*** &amp;lt;code&amp;gt;echo &amp;amp;quot;${foo}&amp;amp;quot;&amp;lt;/code&amp;gt; (“vollständige Syntax”)&lt;br /&gt;
** Variablen mit Bedeutung für die Shell selbst (Beispiele): PATH, PS1, IFS, …&lt;br /&gt;
** “Interessante” Umgebungsvariablen: PATH, USER, SHELL, PPID, …&lt;br /&gt;
* Expansion:&lt;br /&gt;
** Gute Übersicht:&lt;br /&gt;
&lt;br /&gt;
https://www.gnu.org/software/bash/manual/html_node/Shell-Expansions.html&lt;br /&gt;
** Besonders wichtig: Parameter-Expansion:&lt;br /&gt;
*** Kommandozeilen-Argumente &amp;lt;code&amp;gt;$*&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$@&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;$0&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$1&amp;lt;/code&amp;gt;, …&lt;br /&gt;
*** Spezial-Features mit “ausführlicher Syntax”:&lt;br /&gt;
**** &amp;lt;code&amp;gt;config=${1:-config.inc}&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
“Der Wert der Variable”config&amp;amp;quot; ist der Wert des ersten Kommandozeilen-Arguments, es sei denn, dieses wäre leer oder nicht gesetzt, dann soll der Wert ‘config.inc’ lauten.&amp;amp;quot;&lt;br /&gt;
*** Bourne Shell hat noch andere interessante Parameter-Exansion-Tricks, und Bourne Again Shell noch viel mehr.&lt;br /&gt;
** Wichtig: Command Substitution:&lt;br /&gt;
** Mit Backticks:&lt;br /&gt;
   output=`ls | grep foo`&lt;br /&gt;
** &amp;lt;em&amp;gt;oder&amp;lt;/em&amp;gt; mit Klammerung:&lt;br /&gt;
   output=$(ls | grep foo)&lt;br /&gt;
** Die geklammerte Syntax hat u.a. den Vorteil, dass sie einfacher verschachtelt werden kann.&lt;br /&gt;
** Nützlich: Arithmetik (nur Ganzzahlen): &amp;lt;code&amp;gt;a=0 ; a=$((a+2)) ; echo $a&amp;lt;/code&amp;gt;&lt;br /&gt;
* Arbeiten mit Rückgabewerten&lt;br /&gt;
** Abgespeichert in &amp;lt;code&amp;gt;$?&amp;lt;/code&amp;gt;&lt;br /&gt;
** Konvention: 0: Erfolg; Sonst: Fehler.&lt;br /&gt;
* Quotierung&lt;br /&gt;
** Klassisch mit &amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;, desweiteren auch mit &amp;lt;code&amp;gt;&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
** Spezialfall: Here-Documents&lt;br /&gt;
   sed -e &#039;s/foo/bar/g&#039; &amp;lt;&amp;lt; EOF&lt;br /&gt;
   Ein foo kam daher&lt;br /&gt;
   zum foo und danach noch zu einem anderen foo. &lt;br /&gt;
   EOF&lt;br /&gt;
** &amp;lt;em&amp;gt;Hinweis:&amp;lt;/em&amp;gt; Here-Documents kamen im Vortrag aus Zeitgründen nicht dran.&lt;br /&gt;
** Herausforderung: Escaping:&lt;br /&gt;
** Beispiel 1: &amp;lt;code&amp;gt;echo &amp;amp;quot;\&amp;amp;quot;Doppelte\&amp;amp;quot; Anführungszeichen&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
** Beispiel 2: &amp;lt;code&amp;gt;echo &#039;\&#039;Einfache\&#039; Anführungszeichen&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Kontrollstrukturen:&lt;br /&gt;
** &amp;lt;code&amp;gt;if true ; then echo &amp;amp;quot;passt.&amp;amp;quot; ; else echo &amp;amp;quot;komisch&amp;amp;quot; ; fi&amp;lt;/code&amp;gt;&lt;br /&gt;
** bzw. auf mehreren Zeilen:&lt;br /&gt;
   if true ; then&lt;br /&gt;
      echo &amp;quot;passt&amp;quot;&lt;br /&gt;
   else&lt;br /&gt;
      echo &amp;quot;komisch&amp;quot;&lt;br /&gt;
   fi&lt;br /&gt;
* &amp;lt;code&amp;gt;while true ; do echo &amp;amp;quot;idle ...&amp;amp;quot; ; sleep 1 ; done&amp;lt;/code&amp;gt;&lt;br /&gt;
* bzw.&lt;br /&gt;
   while true ; do&lt;br /&gt;
      echo &amp;quot;idle ...&amp;quot;&lt;br /&gt;
   done&lt;br /&gt;
* Generell:&lt;br /&gt;
** Interaktiver Modus: Einzeiler-Syntax.&lt;br /&gt;
** Non-Interaktiver Modus/Skript: Mehrzeilige Syntax.&lt;br /&gt;
* Funktionen definieren&lt;br /&gt;
** Bourne und Bourne Again Shell: &amp;lt;code&amp;gt;xxx() { echo &amp;amp;quot;xxx&amp;amp;quot; ; }&amp;lt;/code&amp;gt;&lt;br /&gt;
** Nur Bourne Again Shell: &amp;lt;code&amp;gt;function xxx() { echo &amp;amp;quot;xxx&amp;amp;quot; ; }&amp;lt;/code&amp;gt;&lt;br /&gt;
** Empfehlung: Bourne Syntax verwenden, da vorwärtskompatibel.&lt;br /&gt;
* Source Files&lt;br /&gt;
** &amp;lt;em&amp;gt;Hinweis:&amp;lt;/em&amp;gt; Kam im Vortrag aus Zeitgrpnden nicht dran.&lt;br /&gt;
** Inhalt einer anderen Datei an dieser Stelle komplett als Shellcode laden und ausführen.&lt;br /&gt;
** Beispiel: &amp;lt;code&amp;gt;. /usr/local/lib/shell-stuff/config.sh&amp;lt;/code&amp;gt;&lt;br /&gt;
** Problem (u.a.): &amp;lt;code&amp;gt;. ./config.sh&amp;lt;/code&amp;gt; (Welcher Speicherort von “config.sh” wird hier erwartet?)&lt;br /&gt;
&lt;br /&gt;
== Anhang: Das Beispiel &amp;quot;deltmp.sh&amp;quot; aus dem Vortrag ==&lt;br /&gt;
&lt;br /&gt;
   #!/bin/sh&lt;br /&gt;
   # set -e&lt;br /&gt;
   dir=${1:-/tmp}&lt;br /&gt;
   if find &amp;quot;$dir&amp;quot; -name &#039;*.tmp&#039; &amp;gt; /tmp/find.log 2&amp;gt; /tmp/find.err ; then&lt;br /&gt;
      echo &amp;quot;Ausgabe abgeschlossen am $(date)&amp;quot; &amp;gt;&amp;gt; /tmp/find.log&lt;br /&gt;
   else&lt;br /&gt;
      echo &amp;quot;Fehler beim Durchsuchen am $(date)&amp;quot; &amp;gt;&amp;gt; /tmp/find.log&lt;br /&gt;
   fi&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
=== Geschichte ===&lt;br /&gt;
&lt;br /&gt;
* Die (vereinfachte) Evolution der UNIXe und UNIX-artigen Betriebssysteme: https://upload.wikimedia.org/wikipedia/commons/7/77/Unix_history-simple.svg&lt;br /&gt;
* Grundsätzliche Funktionsweise (Diagramm): https://developer.ibm.com/developer/default/tutorials/l-linux-shells/images/figure2.gif&lt;br /&gt;
* Ken Thompson, Entwickler der ersten UNIX-Shell: https://de.wikipedia.org/wiki/Ken_Thompson&lt;br /&gt;
* Handbuch für “sh” (Thompson-Shell) in UNIX Version 3 (1973): https://www.in-ulm.de/~mascheck/bourne/v3/&lt;br /&gt;
* Vortrag von Stephen Bourne, Entwickler der Bourne-Shell: https://www.youtube.com/watch?v=2kEJoWfobpA&lt;br /&gt;
* “Csh Programming Considered Harmful”: https://www-uxsup.csx.cam.ac.uk/misc/csh.html&lt;br /&gt;
* Historische Shells praktisch ausprobieren: https://unix50.org/&lt;br /&gt;
&lt;br /&gt;
=== Benutzung ===&lt;br /&gt;
&lt;br /&gt;
* POSIX, Abschnitt “Shell Command Language” (aka “POSIX-Shell”): https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html&lt;br /&gt;
* Manpage der “Debian Almquist Shell”: https://linux.die.net/man/1/dash&lt;br /&gt;
* Manual der Bourne Again Shell, Abschnitt “Expansions”: https://www.gnu.org/software/bash/manual/html_node/Shell-Expansions.html&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FIXME]]&lt;/div&gt;</summary>
		<author><name>Tilt</name></author>
	</entry>
	<entry>
		<id>https://wiki.uugrn.org/index.php?title=Wissen/Bourne_Shell&amp;diff=12780</id>
		<title>Wissen/Bourne Shell</title>
		<link rel="alternate" type="text/html" href="https://wiki.uugrn.org/index.php?title=Wissen/Bourne_Shell&amp;diff=12780"/>
		<updated>2021-02-07T22:15:25Z</updated>

		<summary type="html">&lt;p&gt;Tilt: /* Grundsätzliche Features */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Bourne-Shell: Geschichte und Grundlagen =&lt;br /&gt;
&lt;br /&gt;
* Datum: 5. Februar 2021&lt;br /&gt;
* Referent: Tilman Kranz [mailto:tilt@linuxfoo.de tilt@linuxfoo.de]&lt;br /&gt;
* Ca. 120 Minuten&lt;br /&gt;
&lt;br /&gt;
== Teil 1: Geschichte ==&lt;br /&gt;
&lt;br /&gt;
=== Thompson-Shell ===&lt;br /&gt;
&lt;br /&gt;
* Erste Shell für AT&amp;amp;amp;T UNIX (“UNICS”) Version 1 bis 6&lt;br /&gt;
* Name des Programms: “sh” (liegt im Verzeichnis “/bin”). Also lautet der absolute Pfadname &amp;lt;code&amp;gt;/bin/sh&amp;lt;/code&amp;gt;,&lt;br /&gt;
* Aufgaben:&lt;br /&gt;
** Starten von Programmen&lt;br /&gt;
** Umleiten von Ausgaben (“Redirection”) in andere Programme (“Filter”) oder in Dateien.&lt;br /&gt;
* Siehe auch Manpage https://www.in-ulm.de/~mascheck/bourne/v3/&lt;br /&gt;
&lt;br /&gt;
=== Bourne-Shell ===&lt;br /&gt;
&lt;br /&gt;
* Nachfolger der Thompson-Shell ab AT&amp;amp;amp;T UNIX Version 7.&lt;br /&gt;
* Hauptaugenmerk auf “Command Language” (mit Bedingunge, Schleifen u.v.a.m.).&lt;br /&gt;
** Syntax der Sprache inspiriert von ALGOL68.&lt;br /&gt;
* Außerdem können Shell-Skripten selbst Filter sein (ging bei Thompson Shell nicht).&lt;br /&gt;
* Seit 1989 quasi quasi unverändert, vergleiche auch: https://en.wikipedia.org/wiki/Bourne_shell#Features_introduced_after_1979&lt;br /&gt;
* Code der Bourne Shell war die Inspiration für den International Obfuscated C Code Contest&amp;amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== C-Shell ===&lt;br /&gt;
&lt;br /&gt;
* Entwickelt von der “Berkeley Group” (BSD) als Alternative zu Bourne Shell.&lt;br /&gt;
* Inspiriert von C-Syntax.&lt;br /&gt;
* Komfortabler als die Bourne Shell für interaktive Benutzung.&lt;br /&gt;
* Gilt inzwischen als veraltet (“C Shell Programming considered harmful”).&lt;br /&gt;
&lt;br /&gt;
=== Korn-Shell ===&lt;br /&gt;
&lt;br /&gt;
* Kompatibel zur Bourne-Shell.&lt;br /&gt;
* Mehr Funktionen.&lt;br /&gt;
* Sehr viel besser für interaktive Benutzung:&lt;br /&gt;
** History,&lt;br /&gt;
** Commandline editing,&lt;br /&gt;
** Job-Kontrolle.&lt;br /&gt;
* Wichtige Versionen:&lt;br /&gt;
** 88: Grundlage für POSIX:&lt;br /&gt;
*** https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html&lt;br /&gt;
** 93: Kompletter Rewrite, viel mächtiger, verbraucht aber viel mehr Speicher und CPU.&lt;br /&gt;
&lt;br /&gt;
=== Bourne-Again-Shell ===&lt;br /&gt;
&lt;br /&gt;
* Autragsarbeit eines Festangestellten der Free Software Foundation für das GNU-Projekt.&lt;br /&gt;
** Auf BSD nicht standardmäßig installiert bzw. oft in &amp;lt;code&amp;gt;/usr/local/bin&amp;lt;/code&amp;gt; o.ä.&lt;br /&gt;
* Kompatibel zu Bourne Shell:&lt;br /&gt;
** Spezieller Kompatibilitätsmodus wenn als “sh” aufgerufen&lt;br /&gt;
* Arrays.&lt;br /&gt;
* “shopt” statt “set” für Bash-spezifische Optionen&lt;br /&gt;
* Stark erweiterte Parameter-Expansion&lt;br /&gt;
** z.B. Substitution,&lt;br /&gt;
** Siehe Manpage.&lt;br /&gt;
* Verbesserte Arithmetik.&lt;br /&gt;
* Erweiterte Redirection.&lt;br /&gt;
* Sehr stark verbesserter interaktiver Modus ähnlich Korn Shell.&lt;br /&gt;
&lt;br /&gt;
=== Almquist-Shell (“ash” bzw. “dash”) ===&lt;br /&gt;
&lt;br /&gt;
* Reimplementation der Bourne Shell unter anderer Lizenz.&lt;br /&gt;
* Zuerst für BSD, später portiert auf Debian (dort “dash”).&lt;br /&gt;
&lt;br /&gt;
=== Z-Shell ===&lt;br /&gt;
&lt;br /&gt;
* Reimplementation der Bourne Shell mit stark erweiterten Features.&lt;br /&gt;
* Empfohlen als interaktive, nicht aber als nicht-interaktive Shell.&lt;br /&gt;
** Grund: Shell-Skripten in zsh setzen installierte zsh voraus.&lt;br /&gt;
&lt;br /&gt;
=== Kompatibilität ===&lt;br /&gt;
&lt;br /&gt;
* Kern: Bourne Shell.&lt;br /&gt;
* Aber Vorsicht: Auch in Bourne-kompatinlen Shells (also allen ausser C-Shell) kann man Code schreiben, der in Bourne &#039;&#039;nicht&#039;&#039; geht.&lt;br /&gt;
&lt;br /&gt;
== Teil 2: Grundlagen ==&lt;br /&gt;
&lt;br /&gt;
=== Funktionsweise ===&lt;br /&gt;
&lt;br /&gt;
* Betriebsmodus “interaktiv”.&lt;br /&gt;
** Spezialfall “Login-Shell”.&lt;br /&gt;
** Zeilenweise Ein- und Ausgabe über ein tty (“Teletype”, Printer, serielle Schnittstelle, Terminal, Terminal Emulator).&lt;br /&gt;
* Betriebsmodus “non-interaktiv”&lt;br /&gt;
* “Shebang”-Konvention in Skripten (erste Zeile &amp;lt;code&amp;gt;#!/bin/sh&amp;lt;/code&amp;gt;).&lt;br /&gt;
* Kommentare&lt;br /&gt;
* Line Continuation&lt;br /&gt;
* Shell-Optionen, die den Betriebsmodus verändern (z.B. &amp;lt;code&amp;gt;-e&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;-x&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Zeilenbasierter Parser&lt;br /&gt;
* Expansionen&lt;br /&gt;
** Siehe dazu z.B. die Manpage von “dash”, Abschnitt “Word Expansions”&lt;br /&gt;
* Kontrollstrukturen&lt;br /&gt;
* Redirection und Pipes&lt;br /&gt;
&lt;br /&gt;
=== Grundsätzliche Features ===&lt;br /&gt;
&lt;br /&gt;
* “Strings are first-class citizens and the only citizens” – Stephen Bourne&lt;br /&gt;
* Es gibt kein “goto” (Bourne ist ALGOL-Fan)&lt;br /&gt;
* Hauptaufgaben:&lt;br /&gt;
** Zuweisungen&lt;br /&gt;
*** Spezialfall: “export”&lt;br /&gt;
** Kommandos ausführen&lt;br /&gt;
*** builtins vs. executables&lt;br /&gt;
* Variablen:&lt;br /&gt;
** Einfach: “foo=bar”&lt;br /&gt;
** Export an Subprozesse: “export FOO=bar”&lt;br /&gt;
** Zugriff auf den Wert der Variable:&lt;br /&gt;
*** &amp;lt;code&amp;gt;echo &amp;amp;quot;$foo&amp;amp;quot;&amp;lt;/code&amp;gt; (“verkürzte Syntax”)&lt;br /&gt;
*** &amp;lt;code&amp;gt;echo &amp;amp;quot;${foo}&amp;amp;quot;&amp;lt;/code&amp;gt; (“vollständige Syntax”)&lt;br /&gt;
** Variablen mit Bedeutung für die Shell selbst (Beispiele): PATH, PS1, IFS, …&lt;br /&gt;
** “Interessante” Umgebungsvariablen: PATH, USER, SHELL, PPID, …&lt;br /&gt;
* Expansion:&lt;br /&gt;
** Gute Übersicht:&lt;br /&gt;
&lt;br /&gt;
https://www.gnu.org/software/bash/manual/html_node/Shell-Expansions.html&lt;br /&gt;
** Besonders wichtig: Parameter-Expansion:&lt;br /&gt;
*** Kommandozeilen-Argumente &amp;lt;code&amp;gt;$*&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$@&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;$0&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$1&amp;lt;/code&amp;gt;, …&lt;br /&gt;
*** Spezial-Features mit “ausführlicher Syntax”:&lt;br /&gt;
**** &amp;lt;code&amp;gt;config=${1:-config.inc}&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
“Der Wert der Variable”config&amp;amp;quot; ist der Wert des ersten Kommandozeilen-Arguments, es sei denn, dieses wäre leer oder nicht gesetzt, dann soll der Wert ‘config.inc’ lauten.&amp;amp;quot;&lt;br /&gt;
*** Bourne Shell hat noch andere interessante Parameter-Exansion-Tricks, und Bourne Again Shell noch viel mehr.&lt;br /&gt;
** Wichtig: Command Substitution:&lt;br /&gt;
** Mit Backticks:&lt;br /&gt;
   output=`ls | grep foo`&lt;br /&gt;
** &amp;lt;em&amp;gt;oder&amp;lt;/em&amp;gt; mit Klammerung:&lt;br /&gt;
   output=$(ls | grep foo)&lt;br /&gt;
** Die geklammerte Syntax hat u.a. den Vorteil, dass sie einfacher verschachtelt werden kann.&lt;br /&gt;
** Nützlich: Arithmetik (nur Ganzzahlen): &amp;lt;code&amp;gt;a=0 ; a=$((a+2)) ; echo $a&amp;lt;/code&amp;gt;&lt;br /&gt;
* Arbeiten mit Rückgabewerten&lt;br /&gt;
** Abgespeichert in &amp;lt;code&amp;gt;$?&amp;lt;/code&amp;gt;&lt;br /&gt;
** Konvention: 0: Erfolg; Sonst: Fehler.&lt;br /&gt;
* Quotierung&lt;br /&gt;
** Klassisch mit &amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;, desweiteren auch mit &amp;lt;code&amp;gt;&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
** Spezialfall: Here-Documents&lt;br /&gt;
   sed -e &#039;s/foo/bar/g&#039; &amp;lt;&amp;lt; EOF&lt;br /&gt;
   Ein foo kam daher&lt;br /&gt;
   zum foo und danach noch zu einem anderen foo. &lt;br /&gt;
   EOF&lt;br /&gt;
** &amp;lt;em&amp;gt;Hinweis:&amp;lt;/em&amp;gt; Here-Documents kamen im Vortrag aus Zeitgründen nicht dran.&lt;br /&gt;
** Herausforderung: Escaping:&lt;br /&gt;
** Beispiel 1: &amp;lt;code&amp;gt;echo &amp;amp;quot;\&amp;amp;quot;Doppelte\&amp;amp;quot; Anführungszeichen&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
** Beispiel 2: &amp;lt;code&amp;gt;echo &#039;\&#039;Einfache\&#039; Anführungszeichen&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Kontrollstrukturen:&lt;br /&gt;
** &amp;lt;code&amp;gt;if true ; then echo &amp;amp;quot;passt.&amp;amp;quot; ; else echo &amp;amp;quot;komisch&amp;amp;quot; ; fi&amp;lt;/code&amp;gt;&lt;br /&gt;
** bzw. auf mehreren Zeilen:&lt;br /&gt;
   if true ; then&lt;br /&gt;
      echo &amp;quot;passt&amp;quot;&lt;br /&gt;
   else&lt;br /&gt;
      echo &amp;quot;komisch&amp;quot;&lt;br /&gt;
   fi&lt;br /&gt;
* &amp;lt;code&amp;gt;while true ; do echo &amp;amp;quot;idle ...&amp;amp;quot; ; sleep 1 ; done&amp;lt;/code&amp;gt;&lt;br /&gt;
* bzw.&lt;br /&gt;
   while true ; do&lt;br /&gt;
      echo &amp;quot;idle ...&amp;quot;&lt;br /&gt;
   done&lt;br /&gt;
* Generell:&lt;br /&gt;
** Interaktiver Modus: Einzeiler-Syntax.&lt;br /&gt;
** Non-Interaktiver Modus/Skript: Mehrzeilige Syntax.&lt;br /&gt;
* Funktionen definieren&lt;br /&gt;
** Bourne und Bourne Again Shell: &amp;lt;code&amp;gt;xxx() { echo &amp;amp;quot;xxx&amp;amp;quot; ; }&amp;lt;/code&amp;gt;&lt;br /&gt;
** Nur Bourne Again Shell: &amp;lt;code&amp;gt;function xxx() { echo &amp;amp;quot;xxx&amp;amp;quot; ; }&amp;lt;/code&amp;gt;&lt;br /&gt;
** Empfehlung: Bourne Syntax verwenden, da vorwärtskompatibel.&lt;br /&gt;
* Source Files&lt;br /&gt;
** &amp;lt;em&amp;gt;Hinweis:&amp;lt;/em&amp;gt; Kam im Vortrag aus Zeitgrpnden nicht dran.&lt;br /&gt;
** Inhalt einer anderen Datei an dieser Stelle komplett als Shellcode laden und ausführen.&lt;br /&gt;
** Beispiel: &amp;lt;code&amp;gt;. /usr/local/lib/shell-stuff/config.sh&amp;lt;/code&amp;gt;&lt;br /&gt;
** Problem (u.a.): &amp;lt;code&amp;gt;. ./config.sh&amp;lt;/code&amp;gt; (Welcher Speicherort von “config.sh” wird hier erwartet?)&lt;br /&gt;
&lt;br /&gt;
== Anhang: Das Beispiel &amp;quot;deltmp.sh&amp;quot; aus dem Vortrag ==&lt;br /&gt;
&lt;br /&gt;
   #!/bin/sh&lt;br /&gt;
   # set -e&lt;br /&gt;
   dir=${1:-/tmp}&lt;br /&gt;
   if find &amp;quot;$dir&amp;quot; -name &#039;*.tmp&#039; &amp;gt; /tmp/find.log 2&amp;gt; /tmp/find.err ; then&lt;br /&gt;
      echo &amp;quot;Ausgabe abgeschlossen am $(date)&amp;quot; &amp;gt;&amp;gt; /tmp/find.log&lt;br /&gt;
   else&lt;br /&gt;
      echo &amp;quot;Fehler beim Durchsuchen am $(date)&amp;quot; &amp;gt;&amp;gt; /tmp/find.log&lt;br /&gt;
   fi&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
=== Geschichte ===&lt;br /&gt;
&lt;br /&gt;
* Die (vereinfachte) Evolution der UNIXe und UNIX-artigen Betriebssysteme: https://upload.wikimedia.org/wikipedia/commons/7/77/Unix_history-simple.svg&lt;br /&gt;
* Grundsätzliche Funktionsweise (Diagramm): https://developer.ibm.com/developer/default/tutorials/l-linux-shells/images/figure2.gif&lt;br /&gt;
* Ken Thompson, Entwickler der ersten UNIX-Shell: https://de.wikipedia.org/wiki/Ken_Thompson&lt;br /&gt;
* Handbuch für “sh” (Thompson-Shell) in UNIX Version 3 (1973): https://www.in-ulm.de/~mascheck/bourne/v3/&lt;br /&gt;
* Vortrag von Stephen Bourne, Entwickler der Bourne-Shell: https://www.youtube.com/watch?v=2kEJoWfobpA&lt;br /&gt;
* “Csh Programming Considered Harmful”: https://www-uxsup.csx.cam.ac.uk/misc/csh.html&lt;br /&gt;
* Historische Shells praktisch ausprobieren: https://unix50.org/&lt;br /&gt;
&lt;br /&gt;
=== Benutzung ===&lt;br /&gt;
&lt;br /&gt;
* POSIX, Abschnitt “Shell Command Language” (aka “POSIX-Shell”): https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html&lt;br /&gt;
* Manpage der “Debian Almquist Shell”: https://linux.die.net/man/1/dash&lt;br /&gt;
* Manual der Bourne Again Shell, Abschnitt “Expansions”: https://www.gnu.org/software/bash/manual/html_node/Shell-Expansions.html&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FIXME]]&lt;/div&gt;</summary>
		<author><name>Tilt</name></author>
	</entry>
	<entry>
		<id>https://wiki.uugrn.org/index.php?title=Wissen/Bourne_Shell&amp;diff=12779</id>
		<title>Wissen/Bourne Shell</title>
		<link rel="alternate" type="text/html" href="https://wiki.uugrn.org/index.php?title=Wissen/Bourne_Shell&amp;diff=12779"/>
		<updated>2021-02-07T22:14:04Z</updated>

		<summary type="html">&lt;p&gt;Tilt: /* Benutzung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Bourne-Shell: Geschichte und Grundlagen =&lt;br /&gt;
&lt;br /&gt;
* Datum: 5. Februar 2021&lt;br /&gt;
* Referent: Tilman Kranz [mailto:tilt@linuxfoo.de tilt@linuxfoo.de]&lt;br /&gt;
* Ca. 120 Minuten&lt;br /&gt;
&lt;br /&gt;
== Teil 1: Geschichte ==&lt;br /&gt;
&lt;br /&gt;
=== Thompson-Shell ===&lt;br /&gt;
&lt;br /&gt;
* Erste Shell für AT&amp;amp;amp;T UNIX (“UNICS”) Version 1 bis 6&lt;br /&gt;
* Name des Programms: “sh” (liegt im Verzeichnis “/bin”). Also lautet der absolute Pfadname &amp;lt;code&amp;gt;/bin/sh&amp;lt;/code&amp;gt;,&lt;br /&gt;
* Aufgaben:&lt;br /&gt;
** Starten von Programmen&lt;br /&gt;
** Umleiten von Ausgaben (“Redirection”) in andere Programme (“Filter”) oder in Dateien.&lt;br /&gt;
* Siehe auch Manpage https://www.in-ulm.de/~mascheck/bourne/v3/&lt;br /&gt;
&lt;br /&gt;
=== Bourne-Shell ===&lt;br /&gt;
&lt;br /&gt;
* Nachfolger der Thompson-Shell ab AT&amp;amp;amp;T UNIX Version 7.&lt;br /&gt;
* Hauptaugenmerk auf “Command Language” (mit Bedingunge, Schleifen u.v.a.m.).&lt;br /&gt;
** Syntax der Sprache inspiriert von ALGOL68.&lt;br /&gt;
* Außerdem können Shell-Skripten selbst Filter sein (ging bei Thompson Shell nicht).&lt;br /&gt;
* Seit 1989 quasi quasi unverändert, vergleiche auch: https://en.wikipedia.org/wiki/Bourne_shell#Features_introduced_after_1979&lt;br /&gt;
* Code der Bourne Shell war die Inspiration für den International Obfuscated C Code Contest&amp;amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== C-Shell ===&lt;br /&gt;
&lt;br /&gt;
* Entwickelt von der “Berkeley Group” (BSD) als Alternative zu Bourne Shell.&lt;br /&gt;
* Inspiriert von C-Syntax.&lt;br /&gt;
* Komfortabler als die Bourne Shell für interaktive Benutzung.&lt;br /&gt;
* Gilt inzwischen als veraltet (“C Shell Programming considered harmful”).&lt;br /&gt;
&lt;br /&gt;
=== Korn-Shell ===&lt;br /&gt;
&lt;br /&gt;
* Kompatibel zur Bourne-Shell.&lt;br /&gt;
* Mehr Funktionen.&lt;br /&gt;
* Sehr viel besser für interaktive Benutzung:&lt;br /&gt;
** History,&lt;br /&gt;
** Commandline editing,&lt;br /&gt;
** Job-Kontrolle.&lt;br /&gt;
* Wichtige Versionen:&lt;br /&gt;
** 88: Grundlage für POSIX:&lt;br /&gt;
*** https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html&lt;br /&gt;
** 93: Kompletter Rewrite, viel mächtiger, verbraucht aber viel mehr Speicher und CPU.&lt;br /&gt;
&lt;br /&gt;
=== Bourne-Again-Shell ===&lt;br /&gt;
&lt;br /&gt;
* Autragsarbeit eines Festangestellten der Free Software Foundation für das GNU-Projekt.&lt;br /&gt;
** Auf BSD nicht standardmäßig installiert bzw. oft in &amp;lt;code&amp;gt;/usr/local/bin&amp;lt;/code&amp;gt; o.ä.&lt;br /&gt;
* Kompatibel zu Bourne Shell:&lt;br /&gt;
** Spezieller Kompatibilitätsmodus wenn als “sh” aufgerufen&lt;br /&gt;
* Arrays.&lt;br /&gt;
* “shopt” statt “set” für Bash-spezifische Optionen&lt;br /&gt;
* Stark erweiterte Parameter-Expansion&lt;br /&gt;
** z.B. Substitution,&lt;br /&gt;
** Siehe Manpage.&lt;br /&gt;
* Verbesserte Arithmetik.&lt;br /&gt;
* Erweiterte Redirection.&lt;br /&gt;
* Sehr stark verbesserter interaktiver Modus ähnlich Korn Shell.&lt;br /&gt;
&lt;br /&gt;
=== Almquist-Shell (“ash” bzw. “dash”) ===&lt;br /&gt;
&lt;br /&gt;
* Reimplementation der Bourne Shell unter anderer Lizenz.&lt;br /&gt;
* Zuerst für BSD, später portiert auf Debian (dort “dash”).&lt;br /&gt;
&lt;br /&gt;
=== Z-Shell ===&lt;br /&gt;
&lt;br /&gt;
* Reimplementation der Bourne Shell mit stark erweiterten Features.&lt;br /&gt;
* Empfohlen als interaktive, nicht aber als nicht-interaktive Shell.&lt;br /&gt;
** Grund: Shell-Skripten in zsh setzen installierte zsh voraus.&lt;br /&gt;
&lt;br /&gt;
=== Kompatibilität ===&lt;br /&gt;
&lt;br /&gt;
* Kern: Bourne Shell.&lt;br /&gt;
* Aber Vorsicht: Auch in Bourne-kompatinlen Shells (also allen ausser C-Shell) kann man Code schreiben, der in Bourne &#039;&#039;nicht&#039;&#039; geht.&lt;br /&gt;
&lt;br /&gt;
== Teil 2: Grundlagen ==&lt;br /&gt;
&lt;br /&gt;
=== Funktionsweise ===&lt;br /&gt;
&lt;br /&gt;
* Betriebsmodus “interaktiv”.&lt;br /&gt;
** Spezialfall “Login-Shell”.&lt;br /&gt;
** Zeilenweise Ein- und Ausgabe über ein tty (“Teletype”, Printer, serielle Schnittstelle, Terminal, Terminal Emulator).&lt;br /&gt;
* Betriebsmodus “non-interaktiv”&lt;br /&gt;
* “Shebang”-Konvention in Skripten (erste Zeile &amp;lt;code&amp;gt;#!/bin/sh&amp;lt;/code&amp;gt;).&lt;br /&gt;
* Kommentare&lt;br /&gt;
* Line Continuation&lt;br /&gt;
* Shell-Optionen, die den Betriebsmodus verändern (z.B. &amp;lt;code&amp;gt;-e&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;-x&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Zeilenbasierter Parser&lt;br /&gt;
* Expansionen&lt;br /&gt;
** Siehe dazu z.B. die Manpage von “dash”, Abschnitt “Word Expansions”&lt;br /&gt;
* Kontrollstrukturen&lt;br /&gt;
* Redirection und Pipes&lt;br /&gt;
&lt;br /&gt;
=== Grundsätzliche Features ===&lt;br /&gt;
&lt;br /&gt;
* “Strings are first-class citizens and the only citizens” – Stephen Bourne&lt;br /&gt;
* Es gibt kein “goto” (Bourne ist ALGOL-Fan)&lt;br /&gt;
* Hauptaufgaben:&lt;br /&gt;
** Zuweisungen&lt;br /&gt;
*** Spezialfall: “export”&lt;br /&gt;
** Kommandos ausführen&lt;br /&gt;
*** builtins vs. executables&lt;br /&gt;
* Variablen:&lt;br /&gt;
** Einfach: “foo=bar”&lt;br /&gt;
** Export an Subprozesse: “export FOO=bar”&lt;br /&gt;
** Zugriff auf den Wert der Variable:&lt;br /&gt;
*** &amp;lt;code&amp;gt;echo &amp;amp;quot;$foo&amp;amp;quot;&amp;lt;/code&amp;gt; (“verkürzte Syntax”)&lt;br /&gt;
*** &amp;lt;code&amp;gt;echo &amp;amp;quot;${foo}&amp;amp;quot;&amp;lt;/code&amp;gt; (“vollständige Syntax”)&lt;br /&gt;
** Variablen mit Bedeutung für die Shell selbst (Beispiele): PATH, PS1, IFS, …&lt;br /&gt;
** “Interessante” Umgebungsvariablen: PATH, USER, SHELL, PPID, …&lt;br /&gt;
* Expansion:&lt;br /&gt;
** Gute Übersicht:&lt;br /&gt;
&lt;br /&gt;
https://www.gnu.org/software/bash/manual/html_node/Shell-Expansions.html&lt;br /&gt;
** Besonders wichtig: Parameter-Expansion:&lt;br /&gt;
*** Kommandozeilen-Argumente &amp;lt;code&amp;gt;$*&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$@&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;$0&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$1&amp;lt;/code&amp;gt;, …&lt;br /&gt;
*** Spezial-Features mit “ausführlicher Syntax”:&lt;br /&gt;
**** &amp;lt;code&amp;gt;config=${1:-config.inc}&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
“Der Wert der Variable”config&amp;amp;quot; ist der Wert des ersten Kommandozeilen-Arguments, es sei denn, dieses wäre leer oder nicht gesetzt, dann soll der Wert ‘config.inc’ lauten.&amp;amp;quot;&lt;br /&gt;
*** Bourne Shell hat noch andere interessante Parameter-Exansion-Tricks, und Bourne Again Shell noch viel mehr.&lt;br /&gt;
** Wichtig: Command Substitution:&lt;br /&gt;
** Mit Backticks:&lt;br /&gt;
&lt;br /&gt;
   output=`ls | grep foo`&lt;br /&gt;
&lt;br /&gt;
** &amp;lt;em&amp;gt;oder&amp;lt;/em&amp;gt; mit Klammerung:&lt;br /&gt;
&lt;br /&gt;
   output=$(ls | grep foo)&lt;br /&gt;
&lt;br /&gt;
*** Die geklammerte Syntax hat u.a. den Vorteil, dass sie einfacher verschachtelt werden kann.&lt;br /&gt;
** Nützlich: Arithmetik (nur Ganzzahlen): &amp;lt;code&amp;gt;a=0 ; a=$((a+2)) ; echo $a&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Arbeiten mit Rückgabewerten&lt;br /&gt;
** Abgespeichert in &amp;lt;code&amp;gt;$?&amp;lt;/code&amp;gt;&lt;br /&gt;
** Konvention: 0: Erfolg; Sonst: Fehler.&lt;br /&gt;
&lt;br /&gt;
* Quotierung&lt;br /&gt;
** Klassisch mit &amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;, desweiteren auch mit &amp;lt;code&amp;gt;&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
** Spezialfall: Here-Documents&lt;br /&gt;
&lt;br /&gt;
   sed -e &#039;s/foo/bar/g&#039; &amp;lt;&amp;lt; EOF&lt;br /&gt;
   Ein foo kam daher&lt;br /&gt;
   zum foo und danach noch zu einem anderen foo. &lt;br /&gt;
   EOF&lt;br /&gt;
&lt;br /&gt;
** &amp;lt;em&amp;gt;Hinweis:&amp;lt;/em&amp;gt; Here-Documents kamen im Vortrag aus Zeitgründen nicht dran.&lt;br /&gt;
** Herausforderung: Escaping:&lt;br /&gt;
** Beispiel 1: &amp;lt;code&amp;gt;echo &amp;amp;quot;\&amp;amp;quot;Doppelte\&amp;amp;quot; Anführungszeichen&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
** Beispiel 2: &amp;lt;code&amp;gt;echo &#039;\&#039;Einfache\&#039; Anführungszeichen&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Kontrollstrukturen:&lt;br /&gt;
** &amp;lt;code&amp;gt;if true ; then echo &amp;amp;quot;passt.&amp;amp;quot; ; else echo &amp;amp;quot;komisch&amp;amp;quot; ; fi&amp;lt;/code&amp;gt;&lt;br /&gt;
** bzw. auf mehreren Zeilen:&lt;br /&gt;
&lt;br /&gt;
   if true ; then&lt;br /&gt;
      echo &amp;quot;passt&amp;quot;&lt;br /&gt;
   else&lt;br /&gt;
      echo &amp;quot;komisch&amp;quot;&lt;br /&gt;
   fi&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;while true ; do echo &amp;amp;quot;idle ...&amp;amp;quot; ; sleep 1 ; done&amp;lt;/code&amp;gt;&lt;br /&gt;
* bzw.&lt;br /&gt;
&lt;br /&gt;
   while true ; do&lt;br /&gt;
      echo &amp;quot;idle ...&amp;quot;&lt;br /&gt;
   done&lt;br /&gt;
&lt;br /&gt;
* Generell:&lt;br /&gt;
** Interaktiver Modus: Einzeiler-Syntax.&lt;br /&gt;
** Non-Interaktiver Modus/Skript: Mehrzeilige Syntax.&lt;br /&gt;
&lt;br /&gt;
* Funktionen definieren&lt;br /&gt;
** Bourne und Bourne Again Shell: &amp;lt;code&amp;gt;xxx() { echo &amp;amp;quot;xxx&amp;amp;quot; ; }&amp;lt;/code&amp;gt;&lt;br /&gt;
** Nur Bourne Again Shell: &amp;lt;code&amp;gt;function xxx() { echo &amp;amp;quot;xxx&amp;amp;quot; ; }&amp;lt;/code&amp;gt;&lt;br /&gt;
** Empfehlung: Bourne Syntax verwenden, da vorwärtskompatibel.&lt;br /&gt;
&lt;br /&gt;
* Source Files&lt;br /&gt;
** &amp;lt;em&amp;gt;Hinweis:&amp;lt;/em&amp;gt; Kam im Vortrag aus Zeitgrpnden nicht dran.&lt;br /&gt;
** Inhalt einer anderen Datei an dieser Stelle komplett als Shellcode laden und ausführen.&lt;br /&gt;
** Beispiel: &amp;lt;code&amp;gt;. /usr/local/lib/shell-stuff/config.sh&amp;lt;/code&amp;gt;&lt;br /&gt;
** Problem (u.a.): &amp;lt;code&amp;gt;. ./config.sh&amp;lt;/code&amp;gt; (Welcher Speicherort von “config.sh” wird hier erwartet?)&lt;br /&gt;
&lt;br /&gt;
== Anhang: Das Beispiel &amp;quot;deltmp.sh&amp;quot; aus dem Vortrag ==&lt;br /&gt;
&lt;br /&gt;
   #!/bin/sh&lt;br /&gt;
   # set -e&lt;br /&gt;
   dir=${1:-/tmp}&lt;br /&gt;
   if find &amp;quot;$dir&amp;quot; -name &#039;*.tmp&#039; &amp;gt; /tmp/find.log 2&amp;gt; /tmp/find.err ; then&lt;br /&gt;
      echo &amp;quot;Ausgabe abgeschlossen am $(date)&amp;quot; &amp;gt;&amp;gt; /tmp/find.log&lt;br /&gt;
   else&lt;br /&gt;
      echo &amp;quot;Fehler beim Durchsuchen am $(date)&amp;quot; &amp;gt;&amp;gt; /tmp/find.log&lt;br /&gt;
   fi&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
=== Geschichte ===&lt;br /&gt;
&lt;br /&gt;
* Die (vereinfachte) Evolution der UNIXe und UNIX-artigen Betriebssysteme: https://upload.wikimedia.org/wikipedia/commons/7/77/Unix_history-simple.svg&lt;br /&gt;
* Grundsätzliche Funktionsweise (Diagramm): https://developer.ibm.com/developer/default/tutorials/l-linux-shells/images/figure2.gif&lt;br /&gt;
* Ken Thompson, Entwickler der ersten UNIX-Shell: https://de.wikipedia.org/wiki/Ken_Thompson&lt;br /&gt;
* Handbuch für “sh” (Thompson-Shell) in UNIX Version 3 (1973): https://www.in-ulm.de/~mascheck/bourne/v3/&lt;br /&gt;
* Vortrag von Stephen Bourne, Entwickler der Bourne-Shell: https://www.youtube.com/watch?v=2kEJoWfobpA&lt;br /&gt;
* “Csh Programming Considered Harmful”: https://www-uxsup.csx.cam.ac.uk/misc/csh.html&lt;br /&gt;
* Historische Shells praktisch ausprobieren: https://unix50.org/&lt;br /&gt;
&lt;br /&gt;
=== Benutzung ===&lt;br /&gt;
&lt;br /&gt;
* POSIX, Abschnitt “Shell Command Language” (aka “POSIX-Shell”): https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html&lt;br /&gt;
* Manpage der “Debian Almquist Shell”: https://linux.die.net/man/1/dash&lt;br /&gt;
* Manual der Bourne Again Shell, Abschnitt “Expansions”: https://www.gnu.org/software/bash/manual/html_node/Shell-Expansions.html&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FIXME]]&lt;/div&gt;</summary>
		<author><name>Tilt</name></author>
	</entry>
	<entry>
		<id>https://wiki.uugrn.org/index.php?title=Wissen/Bourne_Shell&amp;diff=12778</id>
		<title>Wissen/Bourne Shell</title>
		<link rel="alternate" type="text/html" href="https://wiki.uugrn.org/index.php?title=Wissen/Bourne_Shell&amp;diff=12778"/>
		<updated>2021-02-07T22:03:54Z</updated>

		<summary type="html">&lt;p&gt;Tilt: Beispiel deltmp.sh aus dem Vortrag hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Bourne-Shell: Geschichte und Grundlagen =&lt;br /&gt;
&lt;br /&gt;
* Datum: 5. Februar 2021&lt;br /&gt;
* Referent: Tilman Kranz [mailto:tilt@linuxfoo.de tilt@linuxfoo.de]&lt;br /&gt;
* Ca. 120 Minuten&lt;br /&gt;
&lt;br /&gt;
== Teil 1: Geschichte ==&lt;br /&gt;
&lt;br /&gt;
=== Thompson-Shell ===&lt;br /&gt;
&lt;br /&gt;
* Erste Shell für AT&amp;amp;amp;T UNIX (“UNICS”) Version 1 bis 6&lt;br /&gt;
* Name des Programms: “sh” (liegt im Verzeichnis “/bin”). Also lautet der absolute Pfadname &amp;lt;code&amp;gt;/bin/sh&amp;lt;/code&amp;gt;,&lt;br /&gt;
* Aufgaben:&lt;br /&gt;
** Starten von Programmen&lt;br /&gt;
** Umleiten von Ausgaben (“Redirection”) in andere Programme (“Filter”) oder in Dateien.&lt;br /&gt;
* Siehe auch Manpage https://www.in-ulm.de/~mascheck/bourne/v3/&lt;br /&gt;
&lt;br /&gt;
=== Bourne-Shell ===&lt;br /&gt;
&lt;br /&gt;
* Nachfolger der Thompson-Shell ab AT&amp;amp;amp;T UNIX Version 7.&lt;br /&gt;
* Hauptaugenmerk auf “Command Language” (mit Bedingunge, Schleifen u.v.a.m.).&lt;br /&gt;
** Syntax der Sprache inspiriert von ALGOL68.&lt;br /&gt;
* Außerdem können Shell-Skripten selbst Filter sein (ging bei Thompson Shell nicht).&lt;br /&gt;
* Seit 1989 quasi quasi unverändert, vergleiche auch: https://en.wikipedia.org/wiki/Bourne_shell#Features_introduced_after_1979&lt;br /&gt;
* Code der Bourne Shell war die Inspiration für den International Obfuscated C Code Contest&amp;amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== C-Shell ===&lt;br /&gt;
&lt;br /&gt;
* Entwickelt von der “Berkeley Group” (BSD) als Alternative zu Bourne Shell.&lt;br /&gt;
* Inspiriert von C-Syntax.&lt;br /&gt;
* Komfortabler als die Bourne Shell für interaktive Benutzung.&lt;br /&gt;
* Gilt inzwischen als veraltet (“C Shell Programming considered harmful”).&lt;br /&gt;
&lt;br /&gt;
=== Korn-Shell ===&lt;br /&gt;
&lt;br /&gt;
* Kompatibel zur Bourne-Shell.&lt;br /&gt;
* Mehr Funktionen.&lt;br /&gt;
* Sehr viel besser für interaktive Benutzung:&lt;br /&gt;
** History,&lt;br /&gt;
** Commandline editing,&lt;br /&gt;
** Job-Kontrolle.&lt;br /&gt;
* Wichtige Versionen:&lt;br /&gt;
** 88: Grundlage für POSIX:&lt;br /&gt;
*** https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html&lt;br /&gt;
** 93: Kompletter Rewrite, viel mächtiger, verbraucht aber viel mehr Speicher und CPU.&lt;br /&gt;
&lt;br /&gt;
=== Bourne-Again-Shell ===&lt;br /&gt;
&lt;br /&gt;
* Autragsarbeit eines Festangestellten der Free Software Foundation für das GNU-Projekt.&lt;br /&gt;
** Auf BSD nicht standardmäßig installiert bzw. oft in &amp;lt;code&amp;gt;/usr/local/bin&amp;lt;/code&amp;gt; o.ä.&lt;br /&gt;
* Kompatibel zu Bourne Shell:&lt;br /&gt;
** Spezieller Kompatibilitätsmodus wenn als “sh” aufgerufen&lt;br /&gt;
* Arrays.&lt;br /&gt;
* “shopt” statt “set” für Bash-spezifische Optionen&lt;br /&gt;
* Stark erweiterte Parameter-Expansion&lt;br /&gt;
** z.B. Substitution,&lt;br /&gt;
** Siehe Manpage.&lt;br /&gt;
* Verbesserte Arithmetik.&lt;br /&gt;
* Erweiterte Redirection.&lt;br /&gt;
* Sehr stark verbesserter interaktiver Modus ähnlich Korn Shell.&lt;br /&gt;
&lt;br /&gt;
=== Almquist-Shell (“ash” bzw. “dash”) ===&lt;br /&gt;
&lt;br /&gt;
* Reimplementation der Bourne Shell unter anderer Lizenz.&lt;br /&gt;
* Zuerst für BSD, später portiert auf Debian (dort “dash”).&lt;br /&gt;
&lt;br /&gt;
=== Z-Shell ===&lt;br /&gt;
&lt;br /&gt;
* Reimplementation der Bourne Shell mit stark erweiterten Features.&lt;br /&gt;
* Empfohlen als interaktive, nicht aber als nicht-interaktive Shell.&lt;br /&gt;
** Grund: Shell-Skripten in zsh setzen installierte zsh voraus.&lt;br /&gt;
&lt;br /&gt;
=== Kompatibilität ===&lt;br /&gt;
&lt;br /&gt;
* Kern: Bourne Shell.&lt;br /&gt;
* Aber Vorsicht: Auch in Bourne-kompatinlen Shells (also allen ausser C-Shell) kann man Code schreiben, der in Bourne &#039;&#039;nicht&#039;&#039; geht.&lt;br /&gt;
&lt;br /&gt;
== Teil 2: Grundlagen ==&lt;br /&gt;
&lt;br /&gt;
=== Funktionsweise ===&lt;br /&gt;
&lt;br /&gt;
* Betriebsmodus “interaktiv”.&lt;br /&gt;
** Spezialfall “Login-Shell”.&lt;br /&gt;
** Zeilenweise Ein- und Ausgabe über ein tty (“Teletype”, Printer, serielle Schnittstelle, Terminal, Terminal Emulator).&lt;br /&gt;
* Betriebsmodus “non-interaktiv”&lt;br /&gt;
* “Shebang”-Konvention in Skripten (erste Zeile &amp;lt;code&amp;gt;#!/bin/sh&amp;lt;/code&amp;gt;).&lt;br /&gt;
* Kommentare&lt;br /&gt;
* Line Continuation&lt;br /&gt;
* Shell-Optionen, die den Betriebsmodus verändern (z.B. &amp;lt;code&amp;gt;-e&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;-x&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Zeilenbasierter Parser&lt;br /&gt;
* Expansionen&lt;br /&gt;
** Siehe dazu z.B. die Manpage von “dash”, Abschnitt “Word Expansions”&lt;br /&gt;
* Kontrollstrukturen&lt;br /&gt;
* Redirection und Pipes&lt;br /&gt;
&lt;br /&gt;
=== Grundsätzliche Features ===&lt;br /&gt;
&lt;br /&gt;
* “Strings are first-class citizens and the only citizens” – Stephen Bourne&lt;br /&gt;
* Es gibt kein “goto” (Bourne ist ALGOL-Fan)&lt;br /&gt;
* Hauptaufgaben:&lt;br /&gt;
** Zuweisungen&lt;br /&gt;
*** Spezialfall: “export”&lt;br /&gt;
** Kommandos ausführen&lt;br /&gt;
*** builtins vs. executables&lt;br /&gt;
* Variablen:&lt;br /&gt;
** Einfach: “foo=bar”&lt;br /&gt;
** Export an Subprozesse: “export FOO=bar”&lt;br /&gt;
** Zugriff auf den Wert der Variable:&lt;br /&gt;
*** &amp;lt;code&amp;gt;echo &amp;amp;quot;$foo&amp;amp;quot;&amp;lt;/code&amp;gt; (“verkürzte Syntax”)&lt;br /&gt;
*** &amp;lt;code&amp;gt;echo &amp;amp;quot;${foo}&amp;amp;quot;&amp;lt;/code&amp;gt; (“vollständige Syntax”)&lt;br /&gt;
** Variablen mit Bedeutung für die Shell selbst (Beispiele): PATH, PS1, IFS, …&lt;br /&gt;
** “Interessante” Umgebungsvariablen: PATH, USER, SHELL, PPID, …&lt;br /&gt;
* Expansion:&lt;br /&gt;
** Gute Übersicht:&lt;br /&gt;
&lt;br /&gt;
https://www.gnu.org/software/bash/manual/html_node/Shell-Expansions.html&lt;br /&gt;
** Besonders wichtig: Parameter-Expansion:&lt;br /&gt;
*** Kommandozeilen-Argumente &amp;lt;code&amp;gt;$*&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$@&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;$0&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$1&amp;lt;/code&amp;gt;, …&lt;br /&gt;
*** Spezial-Features mit “ausführlicher Syntax”:&lt;br /&gt;
**** &amp;lt;code&amp;gt;config=${1:-config.inc}&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
“Der Wert der Variable”config&amp;amp;quot; ist der Wert des ersten Kommandozeilen-Arguments, es sei denn, dieses wäre leer oder nicht gesetzt, dann soll der Wert ‘config.inc’ lauten.&amp;amp;quot;&lt;br /&gt;
*** Bourne Shell hat noch andere interessante Parameter-Exansion-Tricks, und Bourne Again Shell noch viel mehr.&lt;br /&gt;
** Wichtig: Command Substitution:&lt;br /&gt;
** Mit Backticks:&lt;br /&gt;
&lt;br /&gt;
   output=`ls | grep foo`&lt;br /&gt;
&lt;br /&gt;
** &amp;lt;em&amp;gt;oder&amp;lt;/em&amp;gt; mit Klammerung:&lt;br /&gt;
&lt;br /&gt;
   output=$(ls | grep foo)&lt;br /&gt;
&lt;br /&gt;
*** Die geklammerte Syntax hat u.a. den Vorteil, dass sie einfacher verschachtelt werden kann.&lt;br /&gt;
** Nützlich: Arithmetik (nur Ganzzahlen): &amp;lt;code&amp;gt;a=0 ; a=$((a+2)) ; echo $a&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Arbeiten mit Rückgabewerten&lt;br /&gt;
** Abgespeichert in &amp;lt;code&amp;gt;$?&amp;lt;/code&amp;gt;&lt;br /&gt;
** Konvention: 0: Erfolg; Sonst: Fehler.&lt;br /&gt;
&lt;br /&gt;
* Quotierung&lt;br /&gt;
** Klassisch mit &amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;, desweiteren auch mit &amp;lt;code&amp;gt;&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
** Spezialfall: Here-Documents&lt;br /&gt;
&lt;br /&gt;
   sed -e &#039;s/foo/bar/g&#039; &amp;lt;&amp;lt; EOF&lt;br /&gt;
   Ein foo kam daher&lt;br /&gt;
   zum foo und danach noch zu einem anderen foo. &lt;br /&gt;
   EOF&lt;br /&gt;
&lt;br /&gt;
** &amp;lt;em&amp;gt;Hinweis:&amp;lt;/em&amp;gt; Here-Documents kamen im Vortrag aus Zeitgründen nicht dran.&lt;br /&gt;
** Herausforderung: Escaping:&lt;br /&gt;
** Beispiel 1: &amp;lt;code&amp;gt;echo &amp;amp;quot;\&amp;amp;quot;Doppelte\&amp;amp;quot; Anführungszeichen&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
** Beispiel 2: &amp;lt;code&amp;gt;echo &#039;\&#039;Einfache\&#039; Anführungszeichen&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Kontrollstrukturen:&lt;br /&gt;
** &amp;lt;code&amp;gt;if true ; then echo &amp;amp;quot;passt.&amp;amp;quot; ; else echo &amp;amp;quot;komisch&amp;amp;quot; ; fi&amp;lt;/code&amp;gt;&lt;br /&gt;
** bzw. auf mehreren Zeilen:&lt;br /&gt;
&lt;br /&gt;
   if true ; then&lt;br /&gt;
      echo &amp;quot;passt&amp;quot;&lt;br /&gt;
   else&lt;br /&gt;
      echo &amp;quot;komisch&amp;quot;&lt;br /&gt;
   fi&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;while true ; do echo &amp;amp;quot;idle ...&amp;amp;quot; ; sleep 1 ; done&amp;lt;/code&amp;gt;&lt;br /&gt;
* bzw.&lt;br /&gt;
&lt;br /&gt;
   while true ; do&lt;br /&gt;
      echo &amp;quot;idle ...&amp;quot;&lt;br /&gt;
   done&lt;br /&gt;
&lt;br /&gt;
* Generell:&lt;br /&gt;
** Interaktiver Modus: Einzeiler-Syntax.&lt;br /&gt;
** Non-Interaktiver Modus/Skript: Mehrzeilige Syntax.&lt;br /&gt;
&lt;br /&gt;
* Funktionen definieren&lt;br /&gt;
** Bourne und Bourne Again Shell: &amp;lt;code&amp;gt;xxx() { echo &amp;amp;quot;xxx&amp;amp;quot; ; }&amp;lt;/code&amp;gt;&lt;br /&gt;
** Nur Bourne Again Shell: &amp;lt;code&amp;gt;function xxx() { echo &amp;amp;quot;xxx&amp;amp;quot; ; }&amp;lt;/code&amp;gt;&lt;br /&gt;
** Empfehlung: Bourne Syntax verwenden, da vorwärtskompatibel.&lt;br /&gt;
&lt;br /&gt;
* Source Files&lt;br /&gt;
** &amp;lt;em&amp;gt;Hinweis:&amp;lt;/em&amp;gt; Kam im Vortrag aus Zeitgrpnden nicht dran.&lt;br /&gt;
** Inhalt einer anderen Datei an dieser Stelle komplett als Shellcode laden und ausführen.&lt;br /&gt;
** Beispiel: &amp;lt;code&amp;gt;. /usr/local/lib/shell-stuff/config.sh&amp;lt;/code&amp;gt;&lt;br /&gt;
** Problem (u.a.): &amp;lt;code&amp;gt;. ./config.sh&amp;lt;/code&amp;gt; (Welcher Speicherort von “config.sh” wird hier erwartet?)&lt;br /&gt;
&lt;br /&gt;
== Anhang: Das Beispiel &amp;quot;deltmp.sh&amp;quot; aus dem Vortrag ==&lt;br /&gt;
&lt;br /&gt;
   #!/bin/sh&lt;br /&gt;
   # set -e&lt;br /&gt;
   dir=${1:-/tmp}&lt;br /&gt;
   if find &amp;quot;$dir&amp;quot; -name &#039;*.tmp&#039; &amp;gt; /tmp/find.log 2&amp;gt; /tmp/find.err ; then&lt;br /&gt;
      echo &amp;quot;Ausgabe abgeschlossen am $(date)&amp;quot; &amp;gt;&amp;gt; /tmp/find.log&lt;br /&gt;
   else&lt;br /&gt;
      echo &amp;quot;Fehler beim Durchsuchen am $(date)&amp;quot; &amp;gt;&amp;gt; /tmp/find.log&lt;br /&gt;
   fi&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
=== Geschichte ===&lt;br /&gt;
&lt;br /&gt;
* Die (vereinfachte) Evolution der UNIXe und UNIX-artigen Betriebssysteme: https://upload.wikimedia.org/wikipedia/commons/7/77/Unix_history-simple.svg&lt;br /&gt;
* Grundsätzliche Funktionsweise (Diagramm): https://developer.ibm.com/developer/default/tutorials/l-linux-shells/images/figure2.gif&lt;br /&gt;
* Ken Thompson, Entwickler der ersten UNIX-Shell: https://de.wikipedia.org/wiki/Ken_Thompson&lt;br /&gt;
* Handbuch für “sh” (Thompson-Shell) in UNIX Version 3 (1973): https://www.in-ulm.de/~mascheck/bourne/v3/&lt;br /&gt;
* Vortrag von Stephen Bourne, Entwickler der Bourne-Shell: https://www.youtube.com/watch?v=2kEJoWfobpA&lt;br /&gt;
* “Csh Programming Considered Harmful”: https://www-uxsup.csx.cam.ac.uk/misc/csh.html&lt;br /&gt;
* Historische Shells praktisch ausprobieren: https://unix50.org/&lt;br /&gt;
&lt;br /&gt;
=== Benutzung ===&lt;br /&gt;
&lt;br /&gt;
* POSIX, Abschnitt “Shell Command Language” (aka “POSIX-Shell”): https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html&lt;br /&gt;
* Manual der Bourne Shell, Abschnitt “Expansions”: https://www.gnu.org/software/bash/manual/html_node/Shell-Expansions.html&lt;br /&gt;
* Manpage der “Debian Almquist Shell”: https://linux.die.net/man/1/dash&lt;br /&gt;
* Abschnitt “Pipeline Subprocesses” auf meinem privaten Blog: https://tk-sls.de/wp/5591/7&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FIXME]]&lt;/div&gt;</summary>
		<author><name>Tilt</name></author>
	</entry>
	<entry>
		<id>https://wiki.uugrn.org/index.php?title=FIXME/Themen&amp;diff=12777</id>
		<title>FIXME/Themen</title>
		<link rel="alternate" type="text/html" href="https://wiki.uugrn.org/index.php?title=FIXME/Themen&amp;diff=12777"/>
		<updated>2021-02-07T21:20:12Z</updated>

		<summary type="html">&lt;p&gt;Tilt: Protokoll 5.2.2021 verlinkt auf Seite &amp;quot;Bourne Shell&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== ??. ?????? 2021 Thema &amp;quot;Fossil, ein sqlite basiertes Source Code Management System&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
    Sdk schaut mal ob er was zu fossil scm vorbereiten kann...&lt;br /&gt;
&lt;br /&gt;
== ??. ?????? 2021 Thema &amp;quot;Makefiles&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
    Tilt könnte einen Vortrag zu Makefiles halten&lt;br /&gt;
&lt;br /&gt;
== 5. Februar 2021 Thema &amp;quot;Geschichte der Bourne Shell&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
    Tilt hat schon öfter Vorträge zur Geschichte der Bourne Shell gehalten und hat sich bereit erklärt auch uns an seinem Wissen teilhaben zu lassen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Protokoll:&#039;&#039;&#039; Siehe [[Bourne Shell]]&lt;br /&gt;
&lt;br /&gt;
== 8. Januar 2021 Thema &amp;quot;Ports und Packages&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
  Zugschlus wird vorstellen wie man Debian Pakete baut. Falls die Zeit ausreicht, wird sdk das OpenBSD Ports und Paketkonzept vorstellen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Protokoll:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Zugschlus hat uns anhand des Debian [https://tracker.debian.org/hello &amp;quot;hello&amp;quot; Pakets] gezeigt wie ein Debian Paket aufgebaut ist. Dokumentation zum Thema:&lt;br /&gt;
** [https://www.debian.org/doc/manuals/maint-guide Debian New Maintainer&#039;s Guide]. &lt;br /&gt;
** [https://www.debian.org/doc/manuals/developers-reference/ Debian Developer&#039;s Reference].&lt;br /&gt;
** [https://tracker.debian.org/ Debian Package Tracker]&lt;br /&gt;
* Sdk hat gezeigt wie man auf OpenBSD einen Port anlegt und daraus ein Paket erzeugt. Als Beispiel wurde der Port [https://github.com/openbsd/ports/tree/master/misc/sent &amp;quot;misc/sent&amp;quot;] verwendet. Als Beispiel eines einfachen Port Updates haben wir [https://github.com/openbsd/ports/tree/master/archivers/gtar archivers/gtar] aktualisiert und sdk hat die aktualisierte auf der [https://marc.info/?l=openbsd-ports&amp;amp;m=161015098701111&amp;amp;w=2 OpenBSD Ports Mailingliste eingereicht]. Die Präsentatation findet ihr [https://codevoid.de/0/slides/2021-01-08-openbsd-ports-and-packages hier] und sie kann mit [https://tools.suckless.org/sent sent] oder einfach als Text angeschaut werden. BSD Ports verhalten sich mehr oder weniger ähnlich. Handbücher über das Portssystem gibt es von und für [https://www.openbsd.org/faq/ports/ OpenBSD], [http://www.netbsd.org/docs/pkgsrc/developers-guide.html NetBSD] und [https://www.freebsd.org/doc/en_US.ISO8859-1/books/porters-handbook/ FreeBSD].&lt;br /&gt;
&lt;br /&gt;
== 4. Dezember 2020 Thema &amp;quot;Kleine Helfer&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
  Stelle uns ein kleines Programm oder Script vor, welches du sehr oft verwendest oder welches ein Problem deiner Meinung nach auf sehr gute Art und Weise löst.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Protokoll:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
sdk hat xpick vorgestellt. Das ist ein kleines tool um ohne GUI die Farbe eines Pixels in Xorg zu ermitteln. Es gab eine Diskussion über das Makefile und sur5r hat geholfen es portabler zu machen. Das Programm kann man hier herunterladen: git clone git://git.codevoid.de/xpick&lt;/div&gt;</summary>
		<author><name>Tilt</name></author>
	</entry>
	<entry>
		<id>https://wiki.uugrn.org/index.php?title=Wissen/Bourne_Shell&amp;diff=12776</id>
		<title>Wissen/Bourne Shell</title>
		<link rel="alternate" type="text/html" href="https://wiki.uugrn.org/index.php?title=Wissen/Bourne_Shell&amp;diff=12776"/>
		<updated>2021-02-07T21:17:37Z</updated>

		<summary type="html">&lt;p&gt;Tilt: Kategorie &amp;quot;FIXME&amp;quot; hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Bourne-Shell: Geschichte und Grundlagen =&lt;br /&gt;
&lt;br /&gt;
* Datum: 5. Februar 2021&lt;br /&gt;
* Referent: Tilman Kranz [mailto:tilt@linuxfoo.de tilt@linuxfoo.de]&lt;br /&gt;
* Ca. 120 Minuten&lt;br /&gt;
&lt;br /&gt;
== Teil 1: Geschichte ==&lt;br /&gt;
&lt;br /&gt;
=== Thompson-Shell ===&lt;br /&gt;
&lt;br /&gt;
* Erste Shell für AT&amp;amp;amp;T UNIX (“UNICS”) Version 1 bis 6&lt;br /&gt;
* Name des Programms: “sh” (liegt im Verzeichnis “/bin”). Also lautet der absolute Pfadname &amp;lt;code&amp;gt;/bin/sh&amp;lt;/code&amp;gt;,&lt;br /&gt;
* Aufgaben:&lt;br /&gt;
** Starten von Programmen&lt;br /&gt;
** Umleiten von Ausgaben (“Redirection”) in andere Programme (“Filter”) oder in Dateien.&lt;br /&gt;
* Siehe auch Manpage https://www.in-ulm.de/~mascheck/bourne/v3/&lt;br /&gt;
&lt;br /&gt;
=== Bourne-Shell ===&lt;br /&gt;
&lt;br /&gt;
* Nachfolger der Thompson-Shell ab AT&amp;amp;amp;T UNIX Version 7.&lt;br /&gt;
* Hauptaugenmerk auf “Command Language” (mit Bedingunge, Schleifen u.v.a.m.).&lt;br /&gt;
** Syntax der Sprache inspiriert von ALGOL68.&lt;br /&gt;
* Außerdem können Shell-Skripten selbst Filter sein (ging bei Thompson Shell nicht).&lt;br /&gt;
* Seit 1989 quasi quasi unverändert, vergleiche auch: https://en.wikipedia.org/wiki/Bourne_shell#Features_introduced_after_1979&lt;br /&gt;
* Code der Bourne Shell war die Inspiration für den International Obfuscated C Code Contest&amp;amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== C-Shell ===&lt;br /&gt;
&lt;br /&gt;
* Entwickelt von der “Berkeley Group” (BSD) als Alternative zu Bourne Shell.&lt;br /&gt;
* Inspiriert von C-Syntax.&lt;br /&gt;
* Komfortabler als die Bourne Shell für interaktive Benutzung.&lt;br /&gt;
* Gilt inzwischen als veraltet (“C Shell Programming considered harmful”).&lt;br /&gt;
&lt;br /&gt;
=== Korn-Shell ===&lt;br /&gt;
&lt;br /&gt;
* Kompatibel zur Bourne-Shell.&lt;br /&gt;
* Mehr Funktionen.&lt;br /&gt;
* Sehr viel besser für interaktive Benutzung:&lt;br /&gt;
** History,&lt;br /&gt;
** Commandline editing,&lt;br /&gt;
** Job-Kontrolle.&lt;br /&gt;
* Wichtige Versionen:&lt;br /&gt;
** 88: Grundlage für POSIX:&lt;br /&gt;
*** https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html&lt;br /&gt;
** 93: Kompletter Rewrite, viel mächtiger, verbraucht aber viel mehr Speicher und CPU.&lt;br /&gt;
&lt;br /&gt;
=== Bourne-Again-Shell ===&lt;br /&gt;
&lt;br /&gt;
* Autragsarbeit eines Festangestellten der Free Software Foundation für das GNU-Projekt.&lt;br /&gt;
** Auf BSD nicht standardmäßig installiert bzw. oft in &amp;lt;code&amp;gt;/usr/local/bin&amp;lt;/code&amp;gt; o.ä.&lt;br /&gt;
* Kompatibel zu Bourne Shell:&lt;br /&gt;
** Spezieller Kompatibilitätsmodus wenn als “sh” aufgerufen&lt;br /&gt;
* Arrays.&lt;br /&gt;
* “shopt” statt “set” für Bash-spezifische Optionen&lt;br /&gt;
* Stark erweiterte Parameter-Expansion&lt;br /&gt;
** z.B. Substitution,&lt;br /&gt;
** Siehe Manpage.&lt;br /&gt;
* Verbesserte Arithmetik.&lt;br /&gt;
* Erweiterte Redirection.&lt;br /&gt;
* Sehr stark verbesserter interaktiver Modus ähnlich Korn Shell.&lt;br /&gt;
&lt;br /&gt;
=== Almquist-Shell (“ash” bzw. “dash”) ===&lt;br /&gt;
&lt;br /&gt;
* Reimplementation der Bourne Shell unter anderer Lizenz.&lt;br /&gt;
* Zuerst für BSD, später portiert auf Debian (dort “dash”).&lt;br /&gt;
&lt;br /&gt;
=== Z-Shell ===&lt;br /&gt;
&lt;br /&gt;
* Reimplementation der Bourne Shell mit stark erweiterten Features.&lt;br /&gt;
* Empfohlen als interaktive, nicht aber als nicht-interaktive Shell.&lt;br /&gt;
** Grund: Shell-Skripten in zsh setzen installierte zsh voraus.&lt;br /&gt;
&lt;br /&gt;
=== Kompatibilität ===&lt;br /&gt;
&lt;br /&gt;
* Kern: Bourne Shell.&lt;br /&gt;
* Aber Vorsicht: Auch in Bourne-kompatinlen Shells (also allen ausser C-Shell) kann man Code schreiben, der in Bourne &#039;&#039;nicht&#039;&#039; geht.&lt;br /&gt;
&lt;br /&gt;
== Teil 2: Grundlagen ==&lt;br /&gt;
&lt;br /&gt;
=== Funktionsweise ===&lt;br /&gt;
&lt;br /&gt;
* Betriebsmodus “interaktiv”.&lt;br /&gt;
** Spezialfall “Login-Shell”.&lt;br /&gt;
** Zeilenweise Ein- und Ausgabe über ein tty (“Teletype”, Printer, serielle Schnittstelle, Terminal, Terminal Emulator).&lt;br /&gt;
* Betriebsmodus “non-interaktiv”&lt;br /&gt;
* “Shebang”-Konvention in Skripten (erste Zeile &amp;lt;code&amp;gt;#!/bin/sh&amp;lt;/code&amp;gt;).&lt;br /&gt;
* Kommentare&lt;br /&gt;
* Line Continuation&lt;br /&gt;
* Shell-Optionen, die den Betriebsmodus verändern (z.B. &amp;lt;code&amp;gt;-e&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;-x&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Zeilenbasierter Parser&lt;br /&gt;
* Expansionen&lt;br /&gt;
** Siehe dazu z.B. die Manpage von “dash”, Abschnitt “Word Expansions”&lt;br /&gt;
* Kontrollstrukturen&lt;br /&gt;
* Redirection und Pipes&lt;br /&gt;
&lt;br /&gt;
=== Grundsätzliche Features ===&lt;br /&gt;
&lt;br /&gt;
* “Strings are first-class citizens and the only citizens” – Stephen Bourne&lt;br /&gt;
* Es gibt kein “goto” (Bourne ist ALGOL-Fan)&lt;br /&gt;
* Hauptaufgaben:&lt;br /&gt;
** Zuweisungen&lt;br /&gt;
*** Spezialfall: “export”&lt;br /&gt;
** Kommandos ausführen&lt;br /&gt;
*** builtins vs. executables&lt;br /&gt;
* Variablen:&lt;br /&gt;
** Einfach: “foo=bar”&lt;br /&gt;
** Export an Subprozesse: “export FOO=bar”&lt;br /&gt;
** Zugriff auf den Wert der Variable:&lt;br /&gt;
*** &amp;lt;code&amp;gt;echo &amp;amp;quot;$foo&amp;amp;quot;&amp;lt;/code&amp;gt; (“verkürzte Syntax”)&lt;br /&gt;
*** &amp;lt;code&amp;gt;echo &amp;amp;quot;${foo}&amp;amp;quot;&amp;lt;/code&amp;gt; (“vollständige Syntax”)&lt;br /&gt;
** Variablen mit Bedeutung für die Shell selbst (Beispiele): PATH, PS1, IFS, …&lt;br /&gt;
** “Interessante” Umgebungsvariablen: PATH, USER, SHELL, PPID, …&lt;br /&gt;
* Expansion:&lt;br /&gt;
** Gute Übersicht:&lt;br /&gt;
&lt;br /&gt;
https://www.gnu.org/software/bash/manual/html_node/Shell-Expansions.html&lt;br /&gt;
** Besonders wichtig: Parameter-Expansion:&lt;br /&gt;
*** Kommandozeilen-Argumente &amp;lt;code&amp;gt;$*&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$@&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;$0&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$1&amp;lt;/code&amp;gt;, …&lt;br /&gt;
*** Spezial-Features mit “ausführlicher Syntax”:&lt;br /&gt;
**** &amp;lt;code&amp;gt;config=${1:-config.inc}&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
“Der Wert der Variable”config&amp;amp;quot; ist der Wert des ersten Kommandozeilen-Arguments, es sei denn, dieses wäre leer oder nicht gesetzt, dann soll der Wert ‘config.inc’ lauten.&amp;amp;quot;&lt;br /&gt;
*** Bourne Shell hat noch andere interessante Parameter-Exansion-Tricks, und Bourne Again Shell noch viel mehr.&lt;br /&gt;
** Wichtig: Command Substitution:&lt;br /&gt;
** Mit Backticks:&lt;br /&gt;
&lt;br /&gt;
   output=`ls | grep foo`&lt;br /&gt;
&lt;br /&gt;
** &amp;lt;em&amp;gt;oder&amp;lt;/em&amp;gt; mit Klammerung:&lt;br /&gt;
&lt;br /&gt;
   output=$(ls | grep foo)&lt;br /&gt;
&lt;br /&gt;
*** Die geklammerte Syntax hat u.a. den Vorteil, dass sie einfacher verschachtelt werden kann.&lt;br /&gt;
** Nützlich: Arithmetik (nur Ganzzahlen): &amp;lt;code&amp;gt;a=0 ; a=$((a+2)) ; echo $a&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Arbeiten mit Rückgabewerten&lt;br /&gt;
** Abgespeichert in &amp;lt;code&amp;gt;$?&amp;lt;/code&amp;gt;&lt;br /&gt;
** Konvention: 0: Erfolg; Sonst: Fehler.&lt;br /&gt;
&lt;br /&gt;
* Quotierung&lt;br /&gt;
** Klassisch mit &amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;, desweiteren auch mit &amp;lt;code&amp;gt;&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
** Spezialfall: Here-Documents&lt;br /&gt;
&lt;br /&gt;
   sed -e &#039;s/foo/bar/g&#039; &amp;lt;&amp;lt; EOF&lt;br /&gt;
   Ein foo kam daher&lt;br /&gt;
   zum foo und danach noch zu einem anderen foo. &lt;br /&gt;
   EOF&lt;br /&gt;
&lt;br /&gt;
** &amp;lt;em&amp;gt;Hinweis:&amp;lt;/em&amp;gt; Here-Documents kamen im Vortrag aus Zeitgründen nicht dran.&lt;br /&gt;
** Herausforderung: Escaping:&lt;br /&gt;
** Beispiel 1: &amp;lt;code&amp;gt;echo &amp;amp;quot;\&amp;amp;quot;Doppelte\&amp;amp;quot; Anführungszeichen&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
** Beispiel 2: &amp;lt;code&amp;gt;echo &#039;\&#039;Einfache\&#039; Anführungszeichen&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Kontrollstrukturen:&lt;br /&gt;
** &amp;lt;code&amp;gt;if true ; then echo &amp;amp;quot;passt.&amp;amp;quot; ; else echo &amp;amp;quot;komisch&amp;amp;quot; ; fi&amp;lt;/code&amp;gt;&lt;br /&gt;
** bzw. auf mehreren Zeilen:&lt;br /&gt;
&lt;br /&gt;
   if true ; then&lt;br /&gt;
      echo &amp;quot;passt&amp;quot;&lt;br /&gt;
   else&lt;br /&gt;
      echo &amp;quot;komisch&amp;quot;&lt;br /&gt;
   fi&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;while true ; do echo &amp;amp;quot;idle ...&amp;amp;quot; ; sleep 1 ; done&amp;lt;/code&amp;gt;&lt;br /&gt;
* bzw.&lt;br /&gt;
&lt;br /&gt;
   while true ; do&lt;br /&gt;
      echo &amp;quot;idle ...&amp;quot;&lt;br /&gt;
   done&lt;br /&gt;
&lt;br /&gt;
* Generell:&lt;br /&gt;
** Interaktiver Modus: Einzeiler-Syntax.&lt;br /&gt;
** Non-Interaktiver Modus/Skript: Mehrzeilige Syntax.&lt;br /&gt;
&lt;br /&gt;
* Funktionen definieren&lt;br /&gt;
** Bourne und Bourne Again Shell: &amp;lt;code&amp;gt;xxx() { echo &amp;amp;quot;xxx&amp;amp;quot; ; }&amp;lt;/code&amp;gt;&lt;br /&gt;
** Nur Bourne Again Shell: &amp;lt;code&amp;gt;function xxx() { echo &amp;amp;quot;xxx&amp;amp;quot; ; }&amp;lt;/code&amp;gt;&lt;br /&gt;
** Empfehlung: Bourne Syntax verwenden, da vorwärtskompatibel.&lt;br /&gt;
&lt;br /&gt;
* Source Files&lt;br /&gt;
** &amp;lt;em&amp;gt;Hinweis:&amp;lt;/em&amp;gt; Kam im Vortrag aus Zeitgrpnden nicht dran.&lt;br /&gt;
** Inhalt einer anderen Datei an dieser Stelle komplett als Shellcode laden und ausführen.&lt;br /&gt;
** Beispiel: &amp;lt;code&amp;gt;. /usr/local/lib/shell-stuff/config.sh&amp;lt;/code&amp;gt;&lt;br /&gt;
** Problem (u.a.): &amp;lt;code&amp;gt;. ./config.sh&amp;lt;/code&amp;gt; (Welcher Speicherort von “config.sh” wird hier erwartet?)&lt;br /&gt;
&lt;br /&gt;
== Interessante Links ==&lt;br /&gt;
&lt;br /&gt;
=== Geschichliches ===&lt;br /&gt;
&lt;br /&gt;
* Die (vereinfachte) Evolution der UNIXe und UNIX-artigen Betriebssysteme: https://upload.wikimedia.org/wikipedia/commons/7/77/Unix_history-simple.svg&lt;br /&gt;
* Grundsätzliche Funktionsweise (Diagramm): https://developer.ibm.com/developer/default/tutorials/l-linux-shells/images/figure2.gif&lt;br /&gt;
* Ken Thompson, Entwickler der ersten UNIX-Shell: https://de.wikipedia.org/wiki/Ken_Thompson&lt;br /&gt;
* Handbuch für “sh” (Thompson-Shell) in UNIX Version 3 (1973): https://www.in-ulm.de/~mascheck/bourne/v3/&lt;br /&gt;
* Vortrag von Stephen Bourne, Entwickler der Bourne-Shell: https://www.youtube.com/watch?v=2kEJoWfobpA&lt;br /&gt;
* “Csh Programming Considered Harmful”: https://www-uxsup.csx.cam.ac.uk/misc/csh.html&lt;br /&gt;
* Historische Shells praktisch ausprobieren: https://unix50.org/&lt;br /&gt;
&lt;br /&gt;
=== Technische Dokumentation ===&lt;br /&gt;
&lt;br /&gt;
* POSIX, Abschnitt “Shell Command Language” (aka “POSIX-Shell”): https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html&lt;br /&gt;
* Manual der Bourne Shell, Abschnitt “Expansions”: https://www.gnu.org/software/bash/manual/html_node/Shell-Expansions.html&lt;br /&gt;
* Manpage der “Debian Almquist Shell”: https://linux.die.net/man/1/dash&lt;br /&gt;
* Abschnitt “Pipeline Subprocesses” auf meinem privaten Blog: https://tk-sls.de/wp/5591/7&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FIXME]]&lt;/div&gt;</summary>
		<author><name>Tilt</name></author>
	</entry>
	<entry>
		<id>https://wiki.uugrn.org/index.php?title=Wissen/Bourne_Shell&amp;diff=12775</id>
		<title>Wissen/Bourne Shell</title>
		<link rel="alternate" type="text/html" href="https://wiki.uugrn.org/index.php?title=Wissen/Bourne_Shell&amp;diff=12775"/>
		<updated>2021-02-07T21:15:35Z</updated>

		<summary type="html">&lt;p&gt;Tilt: Schriftliche Zusammenfassung aus dem Vortrag &amp;quot;Bourne Shell&amp;quot; von tilt auf der FIXME am 5. Februar 2021&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Bourne-Shell: Geschichte und Grundlagen =&lt;br /&gt;
&lt;br /&gt;
* Datum: 5. Februar 2021&lt;br /&gt;
* Referent: Tilman Kranz [mailto:tilt@linuxfoo.de tilt@linuxfoo.de]&lt;br /&gt;
* Ca. 120 Minuten&lt;br /&gt;
&lt;br /&gt;
== Teil 1: Geschichte ==&lt;br /&gt;
&lt;br /&gt;
=== Thompson-Shell ===&lt;br /&gt;
&lt;br /&gt;
* Erste Shell für AT&amp;amp;amp;T UNIX (“UNICS”) Version 1 bis 6&lt;br /&gt;
* Name des Programms: “sh” (liegt im Verzeichnis “/bin”). Also lautet der absolute Pfadname &amp;lt;code&amp;gt;/bin/sh&amp;lt;/code&amp;gt;,&lt;br /&gt;
* Aufgaben:&lt;br /&gt;
** Starten von Programmen&lt;br /&gt;
** Umleiten von Ausgaben (“Redirection”) in andere Programme (“Filter”) oder in Dateien.&lt;br /&gt;
* Siehe auch Manpage https://www.in-ulm.de/~mascheck/bourne/v3/&lt;br /&gt;
&lt;br /&gt;
=== Bourne-Shell ===&lt;br /&gt;
&lt;br /&gt;
* Nachfolger der Thompson-Shell ab AT&amp;amp;amp;T UNIX Version 7.&lt;br /&gt;
* Hauptaugenmerk auf “Command Language” (mit Bedingunge, Schleifen u.v.a.m.).&lt;br /&gt;
** Syntax der Sprache inspiriert von ALGOL68.&lt;br /&gt;
* Außerdem können Shell-Skripten selbst Filter sein (ging bei Thompson Shell nicht).&lt;br /&gt;
* Seit 1989 quasi quasi unverändert, vergleiche auch: https://en.wikipedia.org/wiki/Bourne_shell#Features_introduced_after_1979&lt;br /&gt;
* Code der Bourne Shell war die Inspiration für den International Obfuscated C Code Contest&amp;amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== C-Shell ===&lt;br /&gt;
&lt;br /&gt;
* Entwickelt von der “Berkeley Group” (BSD) als Alternative zu Bourne Shell.&lt;br /&gt;
* Inspiriert von C-Syntax.&lt;br /&gt;
* Komfortabler als die Bourne Shell für interaktive Benutzung.&lt;br /&gt;
* Gilt inzwischen als veraltet (“C Shell Programming considered harmful”).&lt;br /&gt;
&lt;br /&gt;
=== Korn-Shell ===&lt;br /&gt;
&lt;br /&gt;
* Kompatibel zur Bourne-Shell.&lt;br /&gt;
* Mehr Funktionen.&lt;br /&gt;
* Sehr viel besser für interaktive Benutzung:&lt;br /&gt;
** History,&lt;br /&gt;
** Commandline editing,&lt;br /&gt;
** Job-Kontrolle.&lt;br /&gt;
* Wichtige Versionen:&lt;br /&gt;
** 88: Grundlage für POSIX:&lt;br /&gt;
*** https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html&lt;br /&gt;
** 93: Kompletter Rewrite, viel mächtiger, verbraucht aber viel mehr Speicher und CPU.&lt;br /&gt;
&lt;br /&gt;
=== Bourne-Again-Shell ===&lt;br /&gt;
&lt;br /&gt;
* Autragsarbeit eines Festangestellten der Free Software Foundation für das GNU-Projekt.&lt;br /&gt;
** Auf BSD nicht standardmäßig installiert bzw. oft in &amp;lt;code&amp;gt;/usr/local/bin&amp;lt;/code&amp;gt; o.ä.&lt;br /&gt;
* Kompatibel zu Bourne Shell:&lt;br /&gt;
** Spezieller Kompatibilitätsmodus wenn als “sh” aufgerufen&lt;br /&gt;
* Arrays.&lt;br /&gt;
* “shopt” statt “set” für Bash-spezifische Optionen&lt;br /&gt;
* Stark erweiterte Parameter-Expansion&lt;br /&gt;
** z.B. Substitution,&lt;br /&gt;
** Siehe Manpage.&lt;br /&gt;
* Verbesserte Arithmetik.&lt;br /&gt;
* Erweiterte Redirection.&lt;br /&gt;
* Sehr stark verbesserter interaktiver Modus ähnlich Korn Shell.&lt;br /&gt;
&lt;br /&gt;
=== Almquist-Shell (“ash” bzw. “dash”) ===&lt;br /&gt;
&lt;br /&gt;
* Reimplementation der Bourne Shell unter anderer Lizenz.&lt;br /&gt;
* Zuerst für BSD, später portiert auf Debian (dort “dash”).&lt;br /&gt;
&lt;br /&gt;
=== Z-Shell ===&lt;br /&gt;
&lt;br /&gt;
* Reimplementation der Bourne Shell mit stark erweiterten Features.&lt;br /&gt;
* Empfohlen als interaktive, nicht aber als nicht-interaktive Shell.&lt;br /&gt;
** Grund: Shell-Skripten in zsh setzen installierte zsh voraus.&lt;br /&gt;
&lt;br /&gt;
=== Kompatibilität ===&lt;br /&gt;
&lt;br /&gt;
* Kern: Bourne Shell.&lt;br /&gt;
* Aber Vorsicht: Auch in Bourne-kompatinlen Shells (also allen ausser C-Shell) kann man Code schreiben, der in Bourne &#039;&#039;nicht&#039;&#039; geht.&lt;br /&gt;
&lt;br /&gt;
== Teil 2: Grundlagen ==&lt;br /&gt;
&lt;br /&gt;
=== Funktionsweise ===&lt;br /&gt;
&lt;br /&gt;
* Betriebsmodus “interaktiv”.&lt;br /&gt;
** Spezialfall “Login-Shell”.&lt;br /&gt;
** Zeilenweise Ein- und Ausgabe über ein tty (“Teletype”, Printer, serielle Schnittstelle, Terminal, Terminal Emulator).&lt;br /&gt;
* Betriebsmodus “non-interaktiv”&lt;br /&gt;
* “Shebang”-Konvention in Skripten (erste Zeile &amp;lt;code&amp;gt;#!/bin/sh&amp;lt;/code&amp;gt;).&lt;br /&gt;
* Kommentare&lt;br /&gt;
* Line Continuation&lt;br /&gt;
* Shell-Optionen, die den Betriebsmodus verändern (z.B. &amp;lt;code&amp;gt;-e&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;-x&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Zeilenbasierter Parser&lt;br /&gt;
* Expansionen&lt;br /&gt;
** Siehe dazu z.B. die Manpage von “dash”, Abschnitt “Word Expansions”&lt;br /&gt;
* Kontrollstrukturen&lt;br /&gt;
* Redirection und Pipes&lt;br /&gt;
&lt;br /&gt;
=== Grundsätzliche Features ===&lt;br /&gt;
&lt;br /&gt;
* “Strings are first-class citizens and the only citizens” – Stephen Bourne&lt;br /&gt;
* Es gibt kein “goto” (Bourne ist ALGOL-Fan)&lt;br /&gt;
* Hauptaufgaben:&lt;br /&gt;
** Zuweisungen&lt;br /&gt;
*** Spezialfall: “export”&lt;br /&gt;
** Kommandos ausführen&lt;br /&gt;
*** builtins vs. executables&lt;br /&gt;
* Variablen:&lt;br /&gt;
** Einfach: “foo=bar”&lt;br /&gt;
** Export an Subprozesse: “export FOO=bar”&lt;br /&gt;
** Zugriff auf den Wert der Variable:&lt;br /&gt;
*** &amp;lt;code&amp;gt;echo &amp;amp;quot;$foo&amp;amp;quot;&amp;lt;/code&amp;gt; (“verkürzte Syntax”)&lt;br /&gt;
*** &amp;lt;code&amp;gt;echo &amp;amp;quot;${foo}&amp;amp;quot;&amp;lt;/code&amp;gt; (“vollständige Syntax”)&lt;br /&gt;
** Variablen mit Bedeutung für die Shell selbst (Beispiele): PATH, PS1, IFS, …&lt;br /&gt;
** “Interessante” Umgebungsvariablen: PATH, USER, SHELL, PPID, …&lt;br /&gt;
* Expansion:&lt;br /&gt;
** Gute Übersicht:&lt;br /&gt;
&lt;br /&gt;
https://www.gnu.org/software/bash/manual/html_node/Shell-Expansions.html&lt;br /&gt;
** Besonders wichtig: Parameter-Expansion:&lt;br /&gt;
*** Kommandozeilen-Argumente &amp;lt;code&amp;gt;$*&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$@&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;$0&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$1&amp;lt;/code&amp;gt;, …&lt;br /&gt;
*** Spezial-Features mit “ausführlicher Syntax”:&lt;br /&gt;
**** &amp;lt;code&amp;gt;config=${1:-config.inc}&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
“Der Wert der Variable”config&amp;amp;quot; ist der Wert des ersten Kommandozeilen-Arguments, es sei denn, dieses wäre leer oder nicht gesetzt, dann soll der Wert ‘config.inc’ lauten.&amp;amp;quot;&lt;br /&gt;
*** Bourne Shell hat noch andere interessante Parameter-Exansion-Tricks, und Bourne Again Shell noch viel mehr.&lt;br /&gt;
** Wichtig: Command Substitution:&lt;br /&gt;
** Mit Backticks:&lt;br /&gt;
&lt;br /&gt;
   output=`ls | grep foo`&lt;br /&gt;
&lt;br /&gt;
** &amp;lt;em&amp;gt;oder&amp;lt;/em&amp;gt; mit Klammerung:&lt;br /&gt;
&lt;br /&gt;
   output=$(ls | grep foo)&lt;br /&gt;
&lt;br /&gt;
*** Die geklammerte Syntax hat u.a. den Vorteil, dass sie einfacher verschachtelt werden kann.&lt;br /&gt;
** Nützlich: Arithmetik (nur Ganzzahlen): &amp;lt;code&amp;gt;a=0 ; a=$((a+2)) ; echo $a&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Arbeiten mit Rückgabewerten&lt;br /&gt;
** Abgespeichert in &amp;lt;code&amp;gt;$?&amp;lt;/code&amp;gt;&lt;br /&gt;
** Konvention: 0: Erfolg; Sonst: Fehler.&lt;br /&gt;
&lt;br /&gt;
* Quotierung&lt;br /&gt;
** Klassisch mit &amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;, desweiteren auch mit &amp;lt;code&amp;gt;&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
** Spezialfall: Here-Documents&lt;br /&gt;
&lt;br /&gt;
   sed -e &#039;s/foo/bar/g&#039; &amp;lt;&amp;lt; EOF&lt;br /&gt;
   Ein foo kam daher&lt;br /&gt;
   zum foo und danach noch zu einem anderen foo. &lt;br /&gt;
   EOF&lt;br /&gt;
&lt;br /&gt;
** &amp;lt;em&amp;gt;Hinweis:&amp;lt;/em&amp;gt; Here-Documents kamen im Vortrag aus Zeitgründen nicht dran.&lt;br /&gt;
** Herausforderung: Escaping:&lt;br /&gt;
** Beispiel 1: &amp;lt;code&amp;gt;echo &amp;amp;quot;\&amp;amp;quot;Doppelte\&amp;amp;quot; Anführungszeichen&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
** Beispiel 2: &amp;lt;code&amp;gt;echo &#039;\&#039;Einfache\&#039; Anführungszeichen&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Kontrollstrukturen:&lt;br /&gt;
** &amp;lt;code&amp;gt;if true ; then echo &amp;amp;quot;passt.&amp;amp;quot; ; else echo &amp;amp;quot;komisch&amp;amp;quot; ; fi&amp;lt;/code&amp;gt;&lt;br /&gt;
** bzw. auf mehreren Zeilen:&lt;br /&gt;
&lt;br /&gt;
   if true ; then&lt;br /&gt;
      echo &amp;quot;passt&amp;quot;&lt;br /&gt;
   else&lt;br /&gt;
      echo &amp;quot;komisch&amp;quot;&lt;br /&gt;
   fi&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;while true ; do echo &amp;amp;quot;idle ...&amp;amp;quot; ; sleep 1 ; done&amp;lt;/code&amp;gt;&lt;br /&gt;
* bzw.&lt;br /&gt;
&lt;br /&gt;
   while true ; do&lt;br /&gt;
      echo &amp;quot;idle ...&amp;quot;&lt;br /&gt;
   done&lt;br /&gt;
&lt;br /&gt;
* Generell:&lt;br /&gt;
** Interaktiver Modus: Einzeiler-Syntax.&lt;br /&gt;
** Non-Interaktiver Modus/Skript: Mehrzeilige Syntax.&lt;br /&gt;
&lt;br /&gt;
* Funktionen definieren&lt;br /&gt;
** Bourne und Bourne Again Shell: &amp;lt;code&amp;gt;xxx() { echo &amp;amp;quot;xxx&amp;amp;quot; ; }&amp;lt;/code&amp;gt;&lt;br /&gt;
** Nur Bourne Again Shell: &amp;lt;code&amp;gt;function xxx() { echo &amp;amp;quot;xxx&amp;amp;quot; ; }&amp;lt;/code&amp;gt;&lt;br /&gt;
** Empfehlung: Bourne Syntax verwenden, da vorwärtskompatibel.&lt;br /&gt;
&lt;br /&gt;
* Source Files&lt;br /&gt;
** &amp;lt;em&amp;gt;Hinweis:&amp;lt;/em&amp;gt; Kam im Vortrag aus Zeitgrpnden nicht dran.&lt;br /&gt;
** Inhalt einer anderen Datei an dieser Stelle komplett als Shellcode laden und ausführen.&lt;br /&gt;
** Beispiel: &amp;lt;code&amp;gt;. /usr/local/lib/shell-stuff/config.sh&amp;lt;/code&amp;gt;&lt;br /&gt;
** Problem (u.a.): &amp;lt;code&amp;gt;. ./config.sh&amp;lt;/code&amp;gt; (Welcher Speicherort von “config.sh” wird hier erwartet?)&lt;br /&gt;
&lt;br /&gt;
== Interessante Links ==&lt;br /&gt;
&lt;br /&gt;
=== Geschichliches ===&lt;br /&gt;
&lt;br /&gt;
* Die (vereinfachte) Evolution der UNIXe und UNIX-artigen Betriebssysteme: https://upload.wikimedia.org/wikipedia/commons/7/77/Unix_history-simple.svg&lt;br /&gt;
* Grundsätzliche Funktionsweise (Diagramm): https://developer.ibm.com/developer/default/tutorials/l-linux-shells/images/figure2.gif&lt;br /&gt;
* Ken Thompson, Entwickler der ersten UNIX-Shell: https://de.wikipedia.org/wiki/Ken_Thompson&lt;br /&gt;
* Handbuch für “sh” (Thompson-Shell) in UNIX Version 3 (1973): https://www.in-ulm.de/~mascheck/bourne/v3/&lt;br /&gt;
* Vortrag von Stephen Bourne, Entwickler der Bourne-Shell: https://www.youtube.com/watch?v=2kEJoWfobpA&lt;br /&gt;
* “Csh Programming Considered Harmful”: https://www-uxsup.csx.cam.ac.uk/misc/csh.html&lt;br /&gt;
* Historische Shells praktisch ausprobieren: https://unix50.org/&lt;br /&gt;
&lt;br /&gt;
=== Technische Dokumentation ===&lt;br /&gt;
&lt;br /&gt;
* POSIX, Abschnitt “Shell Command Language” (aka “POSIX-Shell”): https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html&lt;br /&gt;
* Manual der Bourne Shell, Abschnitt “Expansions”: https://www.gnu.org/software/bash/manual/html_node/Shell-Expansions.html&lt;br /&gt;
* Manpage der “Debian Almquist Shell”: https://linux.die.net/man/1/dash&lt;br /&gt;
* Abschnitt “Pipeline Subprocesses” auf meinem privaten Blog: https://tk-sls.de/wp/5591/7&lt;/div&gt;</summary>
		<author><name>Tilt</name></author>
	</entry>
	<entry>
		<id>https://wiki.uugrn.org/index.php?title=Benutzer:Tilt&amp;diff=12452</id>
		<title>Benutzer:Tilt</title>
		<link rel="alternate" type="text/html" href="https://wiki.uugrn.org/index.php?title=Benutzer:Tilt&amp;diff=12452"/>
		<updated>2019-04-19T14:54:30Z</updated>

		<summary type="html">&lt;p&gt;Tilt: /* Kontakt */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Kontakt==&lt;br /&gt;
&lt;br /&gt;
* Mail: tilt@linuxfoo.de&lt;br /&gt;
* Web: www.linuxfoo.de&lt;br /&gt;
&lt;br /&gt;
== Bio ==&lt;br /&gt;
&lt;br /&gt;
* Linux- und UNIX-User seit ca. 1999.&lt;br /&gt;
* Beruflich: Trainer &amp;amp; Consultant für Linux &amp;amp; Open-Source.&lt;br /&gt;
&lt;br /&gt;
== Warum ==&lt;br /&gt;
&lt;br /&gt;
Leute kennenlernen, quatschen, Skills.&lt;/div&gt;</summary>
		<author><name>Tilt</name></author>
	</entry>
	<entry>
		<id>https://wiki.uugrn.org/index.php?title=Benutzer:Tilt&amp;diff=12451</id>
		<title>Benutzer:Tilt</title>
		<link rel="alternate" type="text/html" href="https://wiki.uugrn.org/index.php?title=Benutzer:Tilt&amp;diff=12451"/>
		<updated>2019-04-19T10:52:18Z</updated>

		<summary type="html">&lt;p&gt;Tilt: Kleines Profil mit Kontaktinfos hinzugefügt.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Kontakt==&lt;br /&gt;
&lt;br /&gt;
* Mail: tilt@linuxfoo.de&lt;br /&gt;
* WWW: www.linuxfoo.de&lt;br /&gt;
&lt;br /&gt;
== Bio ==&lt;br /&gt;
&lt;br /&gt;
* Linux- und UNIX-User seit ca. 1999.&lt;br /&gt;
* Beruflich: Trainer &amp;amp; Consultant für Linux &amp;amp; Open-Source.&lt;br /&gt;
&lt;br /&gt;
== Warum ==&lt;br /&gt;
&lt;br /&gt;
Leute kennenlernen, quatschen, Skills.&lt;/div&gt;</summary>
		<author><name>Tilt</name></author>
	</entry>
</feed>