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