Spawning processes Ein Prozeß wurde immer von einem anderen erzeugt Dieser heißt Vater-Prozeß (parent process) Ausnahme: Prozeß Nummer 1 ('init' oder 'launchd') Vorgang heißt engl. to spawn hild process erbt das komplette Environment (außer IDs u.ä.) top in der Shell 52 Ein erstes eigenes Unix-Programm (Hello World) 53 1
Prozesse aus Sicht der Shell 3 Zustände eines Prozesses (aus Sicht der Shell) Foreground: Default - Ausgabe (stdout) des Prozesses erscheint im Terminal-Fenster - Eingabe (stdin) des Prozesses kommt vom Keyboard Background: - Ausgabe erscheint im Fenster - Eingabe nicht erlaubt estoppt: - Prozeß schläft 54 Kommandos zur Prozesskontrolle Befehl Funktion ps ps -edfjw ps -auxw kill pid kill -9 pid command & jobs trl- trl-z fg bg trl-s trl-q top Prozesse anzeigen Alle Prozesse anzeigen dito für einige andere Unix-Varianten Prozeß mit PID pid abbrechen (wie trl-) wenn der Prozeß trotzdem nicht aufhören will J Prozeß im Hintergrund starten Prozesse im Hintergrund anzeigen Foreground-Prozeß abbrechen (interrupt) Foreground-Prozeß anhalten (stoppen) Zuletzt angehaltenen Prozeß im Foreground weiterlaufen lassen Angehaltenen Prozeß im Background weiterlaufen lassen Ausgabe des Foreground-Prozesses anhalten (Pr. läuft weiter) Ausgabe weiterlaufen lassen tabellarische Ansicht aller Prozesse und deren PU-Verbrauch 55 2
Weitere Tools / Utilities Utility Funktion more less head / tail cat file echo string(s) diff file1 file2 du sk dirs df h dir df -hl quota -v Speicherbedarf der Verzeichnisse in kb anzeigen röße und freien Platz auf einer Platte anzeigen röße und freien Platz aller lokalen Platten anzeigen Freie Quota anzeigen lpr [ Pdrucker] file.ps lpq [ Pdrucker] a2ps [ Pdrucker] file File anzeigen (more ist ein sog. Pager) Noch besser als more Anfang / Ende des Files ausgeben File ausgeben (keine Funktionalität) String(s) auf stdout (typ. Terminalfenster) ausgeben Unterschiede zwischen 2 Files anzeigen Postscript-File ausdrucken Printer-Queue anzeigen ASII-File (z.b. Listing) ausdrucken 56 Utility Funktion id who / w Eigene IDs ausgeben Wer ist eingeloggt? date cal Datum anzeigen Jahreskalender anzeigen locate file where command Ort von File anzeigen (auch Teilstrings) Ort(e) von ommand anzeigen tar czf archive.tgz dirs Komplettes Verzeichnis (inkl. Unterverzeichnisse) zusammenpacken und komprimieren tar xzf archive.tgz Archiv wieder auspacken gzip/gunzip File komprimieren / dekomprimieren mount /mnt/floppy Floppy mounten / unmounten 57 3
Bash vs. tcsh Annahme im folgenden: bash (ksh / sh) Häufig ist die Tcsh für die interaktive ommandline-nutzung komfortabler Wie stellt man fest, welche Shell man gerade hat? Einfach 'set' eingeben: Resultat unter tcsh % set tcsh 6.14.00 version tcsh 6.14.00 Resultat unter bash $ set BASH=/bin/bash BASH_VERSINFO=([0]=3 BASH_VERSION='3.2.17(1)- Wer (t)csh hat, kann eine Bash starten mit dem Kommando bash 58 Shells: Was passiert mit einem Kommando? Shell durchläuft folgenden Zyklus mit jedem eingegebenen Befehl: 1. Kommando wird aus der Eingabezeile oder einem Script gelesen 2. Aliases werden expandiert 3. Variable Substitutions werden vorgenommen 4. Wildcards (File-Patterns) werden expandiert 5. Das Kommando wird ausgeführt: - Entweder von der Shell selbst (built-in commands) - Oder in einem neuen Prozeß 59 4
1. Aliases Ersatz für häufige / längliche Kommandos Beispiel: % alias mo less % alias merrimac ssh merrimac.sdsc.edu l zach % mo program.cpp % merrimac alias zeigt alle Aliases an Alias 'merrimac' wird ersetzt Alias 'mo' wird ersetzt Definiert Alias 'merrimac' Definiert Alias 'mo' 60 2. Variablen Variable = Name + Wert, Wert = Zeichenkette 2 Arten: Normale Shell-Variablen Environment-Variablen, sind auch in Kind-Prozessen (child process) bekannt Setzen: $ export TMP=/tmp $ tmpdir=/home/stud/zach/tmp Achtung: kein Space beim =-Zeichen Verwenden des Wertes einer Shell-Variablen: % cp file ${tmpdir} % echo ${TMP} 61 5
Anhängen eines Strings an eine bestehende Shell-Variable: $ PATH=${PATH}:${HOME}/bin $ PATH=${HOME}/bin:${PATH} Ausdrucken des Wertes einer bestimmten Variablen: $ echo $var $ echo $VAR Ausdrucken aller Environment-Variablen: $ printenv 62 Wertzuweisung aus Kommandos (Back ticks) 63 6
Komplexere Variablen-Ersetzung Suffix bzw. Präfix löschen: ${VAR%suffix} ${VAR#prefix} Löscht Schluß der Variable VAR, falls er gleich suffix ist Löscht Anfang der Variable VAR, falls er gleich prefix ist Beispiel: % file=program.cpp % mv ${file} ${file%.cpp}.c % mv ${file} ${file%.p}.c % mv ${file} ${file#prog}prog wird ersetzt zu % mv program.cpp program.c % mv program.cpp program.cpp.c % mv program.cpp Program.c 64 4. File Patterns File-Pattern = File-Name mit Wildcards: *? [] Wildcard? * {0,1,2} [0-9] [a-za-z0-9] [^0-9] Bedeutung enau ein beliebiges Zeichen Beliebig viele beliebige Zeichen (auch 0) enau ein Zeichen aus der Menge {0,1,2} enau ein Zeichen aus der Menge {0,,9} enau ein Zeichen aus der Menge {a,,z,a,,z,0,,9} enau ein Zeichen nicht aus der Menge {0,,9} Beispiele: % ls % ls % ls % ls *.cpp *.h [0-9][0-9]*.ppt???R?? *[^a-za-z0-9_.,-]* 65 7
Weitere Beispiele Alle Latex-Files in allen Unterverzeichnissen von papers anzeigen: % ls papers/*/*.tex Alle JPE-Bilder aus /tmp (inklusive aller Unterverzeichnisse) nach ~/Pictures verschieben: % mv /tmp/*.jpg /tmp/*/*.jpg /tmp/*/*/*.jpg ~/Pictures Achtung: Die Expansion des Patterns erfolgt durch die Shell Folge: das Kommando (hier ls/mv) sieht nur eine Liste von File-Namen 66 Kleine Warnung zu rm Task: Shoot Yourself in The Foot The proliferation of modern programming languages (all of which seem to have stolen countless features from one another) sometimes makes it difficult to remember what language you're currently using. This handy reference is offered as a public service to help programmers who find themselves in such a dilemma. % ls foot.c foot.h foot.o toe.c toe.o % rm *.o rm:.o no such file or directory % ls % 67 8
Quotation Achtung: das Kommando sieht die Wildcards nie Die Shell expandiert Wildcards normalerweise immer Quotation verhindert, daß Wildcards (allg. Meta-Zeichen) von der Shell expandiert werden Quotation-Arten: \ verhindert die Expansion des folgenden Zeichens % echo \*.ppt \$PATH verhindert die Expansion der Wildcards, ersetzt aber Variablen % echo *.ppt $PATH ' ' verhindert jegliche Expansion (Wildcards, Variablen, ) % echo '*.ppt $PATH' 68 5. Wie die Shell ein Kommando ausführt 1. Built-in: Shell führt Kommando selbst aus Beispiel: echo 2. Sonst: externes Programm Beispiel: ls dir 3. command in PATH (Environment-Variable) suchen Falls nicht gefunden, Fehlermeldung, fertig 4. Kind-Prozeß erzeugen Erinnerung: erbt Environment des Vater-Prozesses (= Shell) 5. Argumente (Zeichenketten) dem Prozeß bereitstellen Argumente werden durch Space (i.a.) getrennt 6. Warten bis Kind-Prozeß beendet 69 9
Suchpfade Suchpfad = Environment-Variable mit Liste von durch : (Doppelpunkt) getrennten Verzeichnissen Beispiel: % echo $PATH.:/usr/bin:/bin:/usr/local/bin:/home/zach/bin Kommandos werden in PATH gesucht Test: File mit Namen des Kommandos im ersten Verzeichnis und dieses ist executable? ausführen Sonst: nächstes Verzeichnis in PATH untersuchen Analog für Man-Pages und andere 70 Wichtige Suchpfade Variable Bedeutung PATH MANPATH Suchpfad für Kommandos Suchpfad für Man-Pages LD_LIBRARY_PATH Suchpfad für dynamisch gelinkte Libraries 71 10
Kommandos zum Viewing von Files more, less Interaktiv, zeigen *jeden* File-Typ im Terminal-Fenster an Unter Linux/Mac ist more = less Suchen mit '/', weitersuchen mit 'n', rückwärts 'N', u.v.m. Environment-Variable: setenv PAER 'less -l' Nicht-interaktiv: cat (concatenate = aneinanderhängen) head, tail = einige der ersten / letzten Zeilen anzeigen 72 Standard-I/O Shell etabliert 3 Kanäle zu / vom Prozeß: Standard Input (stdin) Program Standard Output (stdout) Standard Error (stderr) Default-mäßig mit Terminal (= Fenster & Keyboard) verbunden 73 11
Redirection Verbindet Standard-I/O mit Files Prozeß (Programm) bemerkt davon nichts Redirection > file >> file >& file < file Bedeutung stdout wird nach file geschrieben stdout wird an file angehängt stdout und stderr umlenken Programm liest aus file, nicht von Keyboard Shell bietet noch viele weitere Möglichkeiten Beispiele: % ls -1 > dir-listing % sort dir-listing % ps -edfyl > procs.log % bc -l < berechnung.txt 74 Pipelines Effiziente Möglichkeit, komplexere Kommandos aus einfacheren zusammenzubauen Selber Mechanismus wie bei Redirection, um Prozesse miteinander zu verbinden: stdout Utility or User Program pipe stdin Utility or User Program Syntax: % command command command 75 12
Beispiele Listings weiterverarbeiten: % ls -1 sort more % ls -1 *.cpp wc l % ls -1 *.cpp sort > sorted-dir % ls -1 tr -s _ Tip: Bauen Sie eine Pipeline immer eine Stufe nach der anderen auf 76 Die Unix-Philosophie Small is beautiful Make each tool do one thing only Make it do it well Ein bisschen wie Zen Read from stdin, write to stdout (if sensible) Use ASII-Files 77 13
Filter Sind hauptsächlich dazu gedacht, um damit Pipelines aufzubauen enerelle Verwendung: Filter lesen von stdin, schreiben auf stdout Arbeiten fast immer zeilenweise Utility Funktion cut fmt sort uniq wc tr grep rev bc Felder oder Zeichenspalten ausschneiden Text umformatieren Zeilenweise sortieren (auch nach Teil-Key) Duplikate entfernen Zeichen, Wörter, und Zeilen zählen Zeichen ersetzen oder Mehrfachvorkommen stauchen Zeichenketten in der Eingabe suchen (s.u.) Reihenfolge der Zeichen umkehren (zeilenweise) Taschenrechner mit unendlich hoher enauigkeit 78 Beispiele Alle Filegrößen in einen File ausgeben: % ls -l tr -s cut -d' ' -f5 > sizes.txt Nur die letzten paar Zeilen eines langen Directory-Listings: % ls -l tail -10 79 14
Alle top-level Verzeichnisse in einem Zip-Archiv auflisten (jedes Vorkommen nur 1 Mal) % unzip -l Archive.zip tr -s cut -d' ' -f5 cut -d'/' -f1 sort uniq 80 Beispiel für sort uniq egeben: triangle { <-2, 1.5, 0>, <1, 1.5, 1.73205>, <1,1.5,-1.73205> } triangle { <0, -1, 2>, <1.73205, -1, -1>, <-1.73205, -1, -1> } triangle { <-2, 1.5, 0>, <1, 1.5, 1.73205>, <-1.73205, -1, -1> } triangle { <1, 1.5, 1.73205>, <1,1.5,-1.73205>, <0, -1, 2> } triangle { <-2, 1.5, 0>, <1,1.5,-1.73205>, <1.73205, -1, -1> } triangle { <0, -1, 2>, <-1.73205, -1, -1>, <1, 1.5, 1.73205> } triangle { <1.73205, -1, -1>, <-1.73205, -1, -1>, <-2, 1.5, 0> } triangle { <0, -1, 2>, <1.73205, -1, -1>, <1,1.5,-1.73205> } esucht: Liste der Eckpunkte, ohne doppelte Punkte (um den geg. File in ein anderes Format umzuwandeln): -1.73205, -1, -1-2, 1.5, 0 0, -1, 2 1, 1.5, 1.73205 1,1.5,-1.73205 1.73205, -1, -1 Schönhardt's Polyeder 81 15
Der Stream-Editor sed Ein sehr mächtiges Tool zum Pre-/Post-Processing von ASII-Files (= reine Text-Files): Als Standalone-Tool: file1.txt Liest eine Zeile nach der anderen aus dem File sed: bearbeitet jew. eine Zeile durch (mehrere) Anweisungen Schreibt eine bearbeitete Zeile in den File heraus file2.txt % sed arguments file1.txt > file2.txt Oder als Teil einer Pipeline: Utility stdout pipe stdin stdout sed stdin pipe Utility % sed arguments 82 Häufigste Verwendung von Sed = substitute: % sed -e 's/orig. string/new string/g' Triviales Beispiel: % echo Sunday sed -e 's/day/night/g' Anmerkung: Sed kann noch viel mehr (s. Man Page) Mehr Infos zu sed auf http://www.grymoire.com/unix/sed.html 83 16
Konvertierung von ASII-Files mit sed Häufige Aufgabe: einen File, z.b. Meßergebnisse in diesem Format, 1,23; 4,0; 3,1415926; 100; 1000,0; 10E3; 0,0001 in einen File dieses Formats umwandeln 1.23 4.0 3.1415926 100 1000.0 10E3 0.0001 Lösung: sed -e 's/;/ /g' -e 's/,/./g' tabelle1.txt > tabelle2.txt global flag = alle Vorkommen in einer Zeile ersetzen substitute command 84 Beispiel von vorhin: eometrie-file bereinigen / umwandeln 85 17
Suchen & Finden find: findet Files aus einem Verzeichnisbaum Kriterien: Name, Datum, röße, Aktionen: Filename ausgeben, Löschen, grep: findet Zeilen in einem File, in denen bestimmte Zeichenketten vorkommen locate: findet Files im kompletten Filesystem (mittels autom. erzeugter Datenbank) 86 Suchen nach Files mittels find Das Kommando zum Suchen nach Files unter bestimmten Kriterien Häufigste Verwendung: % find directory -name 'file-pattern' Liefert eine Liste von Files in directory und allen Unterverzeichnissen, die auf die Kriterien passen 87 18
find in aller Kürze Syntax: find dirs criteria actions Kriterien: -name file-pattern -type file-type -size file-size -date Aktionen: -print -exec command {} \; -ls ibt jeden gefunden Filenamen aus Führt command für jeden gefunden File aus und ersetzt dabei {} durch den jew. aktuellen Filenamen 88 Beispiele Den File foo im Home suchen (rekursiv): % find $HOME name foo Wenn man den Namen nicht mehr genau kennt: % find $HOME iname '*foo*' Alle JPE's finden und File-Namen in File schreiben: % find $HOME name '*.jpg' > image-list Alle JPE's größer als 100kB finden: % find $HOME name '*.jpg' size +100k Alle Backup-Kopien löschen: % find. name '*.bak' print exec rm {} \; 89 19
Anzahl Files in einem kompletten Verzeichnis-Baum zählen: % find. -type f wc l Wieviele Musik-Files habe ich? % cd Music % find. -iname '*.mp3' wc -l 90 20