Bearbeiten von „Wissen/Bourne Shell“

Aus UUGRN

Warnung: Du bist nicht angemeldet. Deine IP-Adresse wird bei Bearbeitungen öffentlich sichtbar. Melde dich an oder erstelle ein Benutzerkonto, damit Bearbeitungen deinem Benutzernamen zugeordnet werden.

Die Bearbeitung kann rückgängig gemacht werden. Bitte prüfe den Vergleich unten, um sicherzustellen, dass du dies tun möchtest, und speichere dann unten deine Änderungen, um die Bearbeitung rückgängig zu machen.

Aktuelle Version Dein Text
Zeile 21: Zeile 21:
 
* Hauptaugenmerk auf “Command Language” (mit Bedingunge, Schleifen u.v.a.m.).
 
* Hauptaugenmerk auf “Command Language” (mit Bedingunge, Schleifen u.v.a.m.).
 
** Syntax der Sprache inspiriert von ALGOL68.
 
** Syntax der Sprache inspiriert von ALGOL68.
* Außerdem können Shell-Skripte selbst Filter sein (ging bei Thompson Shell nicht).
+
* Außerdem können Shell-Skripten selbst Filter sein (ging bei Thompson Shell nicht).
 
* Seit 1989 quasi quasi unverändert, vergleiche auch: https://en.wikipedia.org/wiki/Bourne_shell#Features_introduced_after_1979
 
* Seit 1989 quasi quasi unverändert, vergleiche auch: https://en.wikipedia.org/wiki/Bourne_shell#Features_introduced_after_1979
 
* Code der Bourne Shell war die Inspiration für den International Obfuscated C Code Contest".
 
* Code der Bourne Shell war die Inspiration für den International Obfuscated C Code Contest".
Zeile 37: Zeile 37:
 
* Mehr Funktionen.
 
* Mehr Funktionen.
 
* Sehr viel besser für interaktive Benutzung:
 
* Sehr viel besser für interaktive Benutzung:
** History  
+
** History,
 
** Commandline editing,
 
** Commandline editing,
 
** Job-Kontrolle.
 
** Job-Kontrolle.
Zeile 47: Zeile 47:
 
=== Bourne-Again-Shell ===
 
=== Bourne-Again-Shell ===
  
* Auftragsarbeit eines Festangestellten der Free Software Foundation für das GNU-Projekt.
+
* Autragsarbeit eines Festangestellten der Free Software Foundation für das GNU-Projekt.
 
** Auf BSD nicht standardmäßig installiert bzw. oft in <code>/usr/local/bin</code> o.ä.
 
** Auf BSD nicht standardmäßig installiert bzw. oft in <code>/usr/local/bin</code> o.ä.
 
* Kompatibel zu Bourne Shell:
 
* Kompatibel zu Bourne Shell:
Zeile 69: Zeile 69:
 
* Reimplementation der Bourne Shell mit stark erweiterten Features.
 
* Reimplementation der Bourne Shell mit stark erweiterten Features.
 
* Empfohlen als interaktive, nicht aber als nicht-interaktive Shell.
 
* Empfohlen als interaktive, nicht aber als nicht-interaktive Shell.
** Grund: Shell-Skripte in zsh setzen installierte zsh voraus.
+
** Grund: Shell-Skripten in zsh setzen installierte zsh voraus.
  
 
=== Kompatibilität ===
 
=== Kompatibilität ===
  
* Kern: Bourne Shell (und deshalb eine Empfehlung).
+
* Kern: Bourne Shell.
* Vorsicht: In "Bourne-kompatiblen" Shells kann man Code schreiben, der in Bourne ''nicht'' geht.
+
* Aber Vorsicht: Auch in Bourne-kompatinlen Shells (also allen ausser C-Shell) kann man Code schreiben, der in Bourne ''nicht'' geht.
  
 
== Teil 2: Grundlagen ==
 
== Teil 2: Grundlagen ==
Zeile 84: Zeile 84:
 
** Zeilenweise Ein- und Ausgabe über ein tty (“Teletype”, Printer, serielle Schnittstelle, Terminal, Terminal Emulator).
 
** Zeilenweise Ein- und Ausgabe über ein tty (“Teletype”, Printer, serielle Schnittstelle, Terminal, Terminal Emulator).
 
* Betriebsmodus “non-interaktiv”
 
* Betriebsmodus “non-interaktiv”
* “Shebang”-Konvention in Skripten (erste Zeile <code>#!/bin/sh</code> ).
+
* “Shebang”-Konvention in Skripten (erste Zeile <code>#!/bin/sh</code>).
 
* Kommentare
 
* Kommentare
 
* Line Continuation
 
* Line Continuation
Zeile 109: Zeile 109:
 
*** <code>echo &quot;$foo&quot;</code> (“verkürzte Syntax”)
 
*** <code>echo &quot;$foo&quot;</code> (“verkürzte Syntax”)
 
*** <code>echo &quot;${foo}&quot;</code> (“vollständige Syntax”)
 
*** <code>echo &quot;${foo}&quot;</code> (“vollständige Syntax”)
** Variablen mit Bedeutung für die Shell selbst (Beispiele): $PATH, $PS1, $IFS, …
+
** Variablen mit Bedeutung für die Shell selbst (Beispiele): PATH, PS1, IFS, …
** “Interessante” Umgebungsvariablen: $PATH, $USER, $SHELL, $PPID, …
+
** “Interessante” Umgebungsvariablen: PATH, USER, SHELL, PPID, …
 
* Expansion:
 
* Expansion:
 
** Gute Übersicht:
 
** Gute Übersicht:
Zeile 124: Zeile 124:
 
** Wichtig: Command Substitution:
 
** Wichtig: Command Substitution:
 
** Mit Backticks:
 
** Mit Backticks:
 +
 
   output=`ls | grep foo`
 
   output=`ls | grep foo`
 +
 
** <em>oder</em> mit Klammerung:
 
** <em>oder</em> mit Klammerung:
 +
 
   output=$(ls | grep foo)
 
   output=$(ls | grep foo)
** Die geklammerte Syntax hat u.a. den Vorteil, dass sie einfacher verschachtelt werden kann.
+
 
 +
*** Die geklammerte Syntax hat u.a. den Vorteil, dass sie einfacher verschachtelt werden kann.
 
** Nützlich: Arithmetik (nur Ganzzahlen): <code>a=0 ; a=$((a+2)) ; echo $a</code>
 
** Nützlich: Arithmetik (nur Ganzzahlen): <code>a=0 ; a=$((a+2)) ; echo $a</code>
 +
 
* Arbeiten mit Rückgabewerten
 
* Arbeiten mit Rückgabewerten
 
** Abgespeichert in <code>$?</code>
 
** Abgespeichert in <code>$?</code>
 
** Konvention: 0: Erfolg; Sonst: Fehler.
 
** Konvention: 0: Erfolg; Sonst: Fehler.
 +
 
* Quotierung
 
* Quotierung
 
** Klassisch mit <code>&quot;</code>, desweiteren auch mit <code>'</code>
 
** Klassisch mit <code>&quot;</code>, desweiteren auch mit <code>'</code>
 
** Spezialfall: Here-Documents
 
** Spezialfall: Here-Documents
 +
 
   sed -e 's/foo/bar/g' << EOF
 
   sed -e 's/foo/bar/g' << EOF
 
   Ein foo kam daher
 
   Ein foo kam daher
 
   zum foo und danach noch zu einem anderen foo.  
 
   zum foo und danach noch zu einem anderen foo.  
 
   EOF
 
   EOF
 +
 
** <em>Hinweis:</em> Here-Documents kamen im Vortrag aus Zeitgründen nicht dran.
 
** <em>Hinweis:</em> Here-Documents kamen im Vortrag aus Zeitgründen nicht dran.
 
** Herausforderung: Escaping:
 
** Herausforderung: Escaping:
 
** Beispiel 1: <code>echo &quot;\&quot;Doppelte\&quot; Anführungszeichen&quot;</code>
 
** Beispiel 1: <code>echo &quot;\&quot;Doppelte\&quot; Anführungszeichen&quot;</code>
 
** Beispiel 2: <code>echo '\'Einfache\' Anführungszeichen'</code>
 
** Beispiel 2: <code>echo '\'Einfache\' Anführungszeichen'</code>
 +
 
* Kontrollstrukturen:
 
* Kontrollstrukturen:
 
** <code>if true ; then echo &quot;passt.&quot; ; else echo &quot;komisch&quot; ; fi</code>
 
** <code>if true ; then echo &quot;passt.&quot; ; else echo &quot;komisch&quot; ; fi</code>
 
** bzw. auf mehreren Zeilen:
 
** bzw. auf mehreren Zeilen:
 +
 
   if true ; then
 
   if true ; then
 
       echo "passt"
 
       echo "passt"
Zeile 151: Zeile 161:
 
       echo "komisch"
 
       echo "komisch"
 
   fi
 
   fi
 +
 
* <code>while true ; do echo &quot;idle ...&quot; ; sleep 1 ; done</code>
 
* <code>while true ; do echo &quot;idle ...&quot; ; sleep 1 ; done</code>
 
* bzw.
 
* bzw.
 +
 
   while true ; do
 
   while true ; do
 
       echo "idle ..."
 
       echo "idle ..."
 
   done
 
   done
 +
 
* Generell:
 
* Generell:
 
** Interaktiver Modus: Einzeiler-Syntax.
 
** Interaktiver Modus: Einzeiler-Syntax.
 
** Non-Interaktiver Modus/Skript: Mehrzeilige Syntax.
 
** Non-Interaktiver Modus/Skript: Mehrzeilige Syntax.
 +
 
* Funktionen definieren
 
* Funktionen definieren
 
** Bourne und Bourne Again Shell: <code>xxx() { echo &quot;xxx&quot; ; }</code>
 
** Bourne und Bourne Again Shell: <code>xxx() { echo &quot;xxx&quot; ; }</code>
 
** Nur Bourne Again Shell: <code>function xxx() { echo &quot;xxx&quot; ; }</code>
 
** Nur Bourne Again Shell: <code>function xxx() { echo &quot;xxx&quot; ; }</code>
 
** Empfehlung: Bourne Syntax verwenden, da vorwärtskompatibel.
 
** Empfehlung: Bourne Syntax verwenden, da vorwärtskompatibel.
 +
 
* Source Files
 
* Source Files
** <em>Hinweis:</em> Kam im Vortrag aus Zeitgründen nicht dran.
+
** <em>Hinweis:</em> Kam im Vortrag aus Zeitgrpnden nicht dran.
 
** Inhalt einer anderen Datei an dieser Stelle komplett als Shellcode laden und ausführen.
 
** Inhalt einer anderen Datei an dieser Stelle komplett als Shellcode laden und ausführen.
 
** Beispiel: <code>. /usr/local/lib/shell-stuff/config.sh</code>
 
** Beispiel: <code>. /usr/local/lib/shell-stuff/config.sh</code>
 
** Problem (u.a.): <code>. ./config.sh</code> (Welcher Speicherort von “config.sh” wird hier erwartet?)
 
** Problem (u.a.): <code>. ./config.sh</code> (Welcher Speicherort von “config.sh” wird hier erwartet?)
  
== Anhang: Das Beispiel "deltmp.sh" aus dem Vortrag ==
+
== Interessante Links ==
 
 
  #!/bin/sh
 
  # set -e
 
  dir=${1:-/tmp}
 
  if find "$dir" -name '*.tmp' > /tmp/find.log 2> /tmp/find.err ; then
 
      echo "Ausgabe abgeschlossen am $(date)" >> /tmp/find.log
 
  else
 
      echo "Fehler beim Durchsuchen am $(date)" >> /tmp/find.log
 
  fi
 
 
 
== Links ==
 
  
=== Geschichte ===
+
=== Geschichliches ===
  
 
* Die (vereinfachte) Evolution der UNIXe und UNIX-artigen Betriebssysteme: https://upload.wikimedia.org/wikipedia/commons/7/77/Unix_history-simple.svg
 
* Die (vereinfachte) Evolution der UNIXe und UNIX-artigen Betriebssysteme: https://upload.wikimedia.org/wikipedia/commons/7/77/Unix_history-simple.svg
Zeile 192: Zeile 196:
 
* Historische Shells praktisch ausprobieren: https://unix50.org/
 
* Historische Shells praktisch ausprobieren: https://unix50.org/
  
=== Benutzung ===
+
=== Technische Dokumentation ===
  
 
* POSIX, Abschnitt “Shell Command Language” (aka “POSIX-Shell”): https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html
 
* POSIX, Abschnitt “Shell Command Language” (aka “POSIX-Shell”): https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html
 +
* Manual der Bourne Shell, Abschnitt “Expansions”: https://www.gnu.org/software/bash/manual/html_node/Shell-Expansions.html
 
* Manpage der “Debian Almquist Shell”: https://linux.die.net/man/1/dash
 
* Manpage der “Debian Almquist Shell”: https://linux.die.net/man/1/dash
* Manual der Bourne Again Shell, Abschnitt “Expansions”: https://www.gnu.org/software/bash/manual/html_node/Shell-Expansions.html
+
* Abschnitt “Pipeline Subprocesses” auf meinem privaten Blog: https://tk-sls.de/wp/5591/7
  
 
[[Kategorie:FIXME]]
 
[[Kategorie:FIXME]]

Bitte kopiere keine Inhalte, die nicht Deine eigenen sind!

Du gibst uns hiermit Deine Zusage, dass
  • Du den Text nicht aus Wikipedia kopiert hast
  • Du den Text selbst verfasst hast
  • oder der Text entweder
    • Allgemeingut (public domain) ist
    • oder der Copyright-Inhaber seine Zustimmung gegeben hat.
Wichtig
  • Benutze keine urheberrechtlich geschützten Werke ohne Erlaubnis des Copyright-Inhabers!
  • Falls dieser Text bereits woanders veröffentlicht wurde, weise bitte auf der 'Diskussion:'-Seite darauf hin.
  • Bitte beachte, dass alle UUGRN-Beiträge automatisch unter der der Creative Commons Lizenz stehen.
  • Falls Du nicht möchtest, dass Deine Arbeit hier von anderen verändert und verbreitet wird, dann drücke nicht auf "Artikel Speichern".

Bitte beantworte die folgende Frage, um diese Seite speichern zu können (weitere Informationen):

Abbrechen Bearbeitungshilfe (wird in einem neuen Fenster geöffnet)