Shell

bash

  • .bashrc inital File falls keine login shell
  • /etc/profile und dann .bash_profile für nicht login shell
  • /etc/inputrc (und nach .inputrc) wird libreadline konfiguriert (see man readline)

Bourn shell

  • heisst: bash aber!! es gibt auch noch sh die noch weniger kann (z.B. function versteht sie nicht!)
  • PATH variable unter denen commands gesucht werden (normalerweise /bin), chmod +x damit sie auch ausgeführt werden können!
  • Bei ernsthaften Fehlern (redirections fail etc.) verlässt die shell den aktuellen command, also die subshell, oder FunktionsAufruf, aber { } oder ander strukturierte Statements (if while) erzeugen keine solche Hülle!
  • scanning: Input in Wörter teilen mit whiteSpace, und metaChars: < > | & ; ( ) , space tab newline (synonym für ;) ( } dagegen ist ein reserviertes Wort, vorangehender Command muss mit ; abgeschlossen werden!)
  • Struktur:
  • command: parameterAssignments commandWords redirection (assignments vor commandWords)
  • pipes: |, ! pipe kehrt then exitstatus (des letzten Commands der pipe) um
  • list: pipes mit || && oder &, |& und ;
  • compound commands (case,... while) werden nur Anfangs Zeile erkannt, redirections müssen also nachher komm
  • { list } (mit ; siehe oben) compound
  • ( list ) wird in subshell ausgeführt, aus Subshell kommen keine Variabeln zurück!
  • if list then list elif list else list fi usw. immer listen als Bedingung erlaubt!
  • $(( )) equivalent to let, arithmetische Ausdrücke, C-like, inklusive emedded assignment, Variabeln werden ohne $ expandiert
  • [] test
  • [[ ]] Variante von [ ] test ohne fileChar substituion usw.
  • substitutionen:
  • command susbstitution ersetzt command durch seinen standard output. $(...) mit normale QuotingRules aber in `...` werden die \ von \$ \` und \\ entfernt
  • arithmetic substitution $((...)) berechnet ausdruck
  • parameter substitution mit $var oder ${var} oder ${var[arith expr]} array,
  • ${name:-ifNull}, ${name:+ifNotNull}, ${name:=assignIfNull}, ${name:?errorMsgIfNull} ${#name} stringLength, ${#name[*]} Anzahl array Elemente
  • ${name#pat} if pat matches begin of name, delete shortest match, ## longest, % from end
  • ~ tilde expansion home of user bis nächstem /
  • braces expansion: a{b,c}d wird abd acd
  • parameter assingments innerhalb command (ohne ;!) gelten nur temporär für diesen command, werden aber exportiert!
  • filename patters:
  • * 0-n chars, ? 1 char, [...] charset [!...] not charset,
  • *(..|....) 0-n pattern in Klammer, +(..|...) 1-n, ?(..|...) 0-1 !(..|...) alles was nicht matched
  • . und .. werden nie erzeugt, mit option markdir wird ein / and directories appended
  • Input/Output Redirection
  • > StdOut, >> StdOut append, < StdIn, << marker inline Input bis Zeile mit Marker, nach verarbeiten dieser Zeile
  • 3> 5< analog > bzw < auf entsprechendem fileDescriptor (0..9) bezogen
  • fileDescriptoren 0 stdIn, 1 stdOut, 2 stdErr 3 - 9 zur freien Verfügungen (werden durch reDirection deklariert und geöffnet)
  • 2>&1 stdError nach stdOutput analog für ander FileDescriptoren

Characters (siehe stty -a)

  • ctrl d eof (aber nur als erstes Zeichen der Zeile)
  • ctrl z: suspend ( background)
  • ctrl c:: intr (Interrupt Signal)
  • \ escape z.B. \enter interpretiert return nicht und erlaubt mehrzeilige Eingaben
  • *, ?, [] activates filename Susbtitution: wildcard
  • $ variable substitution
  • `cmd` backQuotes: führt cmd aus und führt dann den Befehl mit dem zurückgegebenen String aus, in subShells, hat zwar alle Variablen, kann sie aber nicht zurückverändern!
  • \ escapes ein Zeichen
  • 'text' simple Quotes: escapes den ganzen Text
  • "text" double Qutes: nur \, $ und ` ` werden interpretiert
  • function: benutzt denselben nameSpace (ausser $*)
  • Variablen:
  • Konvention: rein uppercase für Unterscheidung zu commands
  • ${varName} wenn Ende des Namens usw. nicht klar (geht nicht rekursiv)
  • ${var:-defaultValue} -> gibt defaultValue zurück, fall var undef
  • ${var:+tValue} -> gibt Value zurück, falls var definiert ist
  • ${variable:?message} -> falls undefiniert message nach stderr und exit
  • unset var: entDeklarieren (gleiche Wirkung wie auf leeren String setzen)
  • $0 command name
  • $1 -$9 Argumente
  • $* alle Argumente (auch $@, Unterschied liegt in quoting)
  • $# Anzahl Argumente
  • $$ processId
  • $? exitStatus von letztem Command exit Werte sind Modulo 256 und alphas -> 0
  • readonly var: macht var readonly
  • export -> var für subshells sichtbar machen (für alle zukünftigen mit aktuellen Werten, aber aus subSchell kommen Werte nicht zurück!"

builtins

  • if elif else fi: cmd; then schaut auf returnWerte des cmd. 0 oder '' sind TRUE, alles andere falsch (aber rc von expr kehrt es um, damit man normal arbeiten kann…
  • : (colon) leerer cmd
  • . command in current environment ausfüren
  • : empty
  • eval ... Argumente werden expandiert und nachher wieder ausgeführt (geht aber auch ohne eval!)
  • exec cmd cmd ohne forking ausführen
  • export: variable für subProzesse sichtbar machen
  • false, true
  • fc command history anzeigen bearbeiten...
  • getopts Optionen einScannen
  • hash: geHashte cmds anzeigen
  • jobs, kill
  • set shellOptions
  • time cmd: time to execute cmd, without of shell
  • trap um Signale / Interrupts aufzufangen, see kill -l (wenn trap kein exit mach, läuft Programm weiter!)

Korn Shell >= Bourn

  • history [von] [bis]: command History, von: 555: Nummer, -10 relative Nr, ls : commandAnfang
  • r [old=new] [line] repeat [line] wie [von] von oben
  • set -e vi: edit mode vi setzen, wie üblich mit ESC in CommandMode und durch history skippen