--bgcolor white --fgcolor black --title Shell effizient nutzen - Ein Einstieg in die Shell --author Frank Hofmann + Sven Guckes --color blue --center Di 9. und Do 11. Januar 2007 --center bei newthinking Kreuzberg, Berlin --center Kontakt: --center Frank Hofmann - Potsdam --center Sven Guckes - Berlin --color blue --withborder --newpage --heading Shell effizient nutzen --withborder --heading Übersicht * Tag 1 - Überblick - Begriffe - Einstieg * Tag 2 - Anwendung - Kommandos - Kniffe * Ziel: Grundlegender Umgang mit einer Shell (bash) --newpage --withborder --heading Inhalt (1) Definition: Was ist eine Shell? Location: Wo finde ich Shells auf meinem Rechner? Nutzen: Wozu ist eine Shell nützlich? Einstieg: Prinzipieller Umgang --newpage --withborder --heading Inhalt (2) Weiteres: Tipps und Tricks Prompt Kommandos, Variablen, Parameter Prozesse, Kanäle, Pipes, Umleitungen, Jobs Command History Abkürzungen: Aliase und Funktionen, Skripte RegExp: Muster/Wildcards Expansionen und Anführungszeichen Kür: Shell-Varianten --newpage --withborder --heading Wozu braucht man eine Shell? - Interaktive Eingabe und umgehende Umgesetzung - Starten von Programmen - Automatisieren von Vorgängen und Abläufen (Shell-Programmierung) - Zur Administration des Systems und der Dienste (Services) --- Daher: * Grundlegende Shell-Kenntnisse sind notwendig * weitere Kenntnisse sind empfehlenswert --newpage --withborder --heading Der Shell-Begriff - Nutzersicht: * Kommandozeile * Nutzeroberfläche * command.com 4dos (MSDOS, Windows) --- - Abstrakt * Schnittstelle zwischen Benutzer und Hardwware bzw. Betriebssystem (OS) --- - Bezeichnung/Begriff * engl. "Muschel" bzw "Schale" * legt sich wie eine Schale um den Betriebssystemkern * einfaches Programm --newpage --withborder --heading Shell-Aussehen (1) - echtes Terminal * eigene Endgeräte * Kassensysteme --- - Terminal /dev/ttyN * /dev/ttyN wird auch als Konsole bezeichnet * erreichbar mittels CTRL+ALT+F1 .. CTRL-Alt-Fn .. C-A-Fn * Konsole 7 zeigt X (Knoppix: Konsole 5) * prinzipiell textbasierte Programme --newpage --withborder --heading Shell-Aussehen (2) - Terminalemulatoren * Eigenes Fenster mit graphischer Darstellung * Beispiele: eterm, gnome-terminal, hanterm, konsole, kterm, mlterm, mpterm, pterm, rxvt, wterm, xterm, xvt, zvt. * G-Terminal: gnome-terminal * K-Terminal: kterm * X-Terminal: xterm --- - Themes steuern Darstellung --newpage --withborder --heading Shells - Varianten: ash bash csh es esh fish ksh pdksh rbash rc sash sh tcsh zsh ... --- - Zulassung auf dem System über /etc/shells --- - spezielle Fälle: passwd screen --newpage --withborder --heading Prompt - engl "Aufforderung", neudeutsch: "Eingabeaufforderung" - Eingabe von Kommandos bzw Kommandosequenzen --- - Aussehen (Standard-Schema) * user: benutzer@rechner:verzeichnis$ * root: root@rechner:verzeichnis# --newpage --withborder --heading Eine Shell beenden - 3 Möglichkeiten: --- * exit --- * logout --- * CTRL-D ( IGNOREEOF !) --newpage --withborder --heading Standard-Shell - seine Standard-Shell herausfinden * eingetragen in /etc/passwd * finger $USER * grep $USER /etc/passwd --- - eigene Standard-Shell wechseln * Kommando: chsh * ändert verwendete Shell in /etc/passwd * wird erst beim nächsten login wirksam --newpage --withborder --heading Setup-Dateien/Zusatzinfo - Manual: man bash --- - Dateien: * /bin/bash (binary) --- * /etc/profile die systemweite Initialisierungsdatei, ausgeführt von Login-Shells --- * ~/.bash_profile die persönliche Initialisierungsdatei, ausgeführt von Login-Shells --- * ~/.bashrc die Konfigurationsdatei des Benutzers --- * ~/.inputrc die Konfigurationsdatei des Benutzers für die Eingabe in der Shell --newpage --withborder --heading Wichtige Kommandos - chfn Wechseln des "real user name" und anderer Informationen --- - passwd Passwort wechseln --- - su "super-user" - zu einem anderen Nutzer wechseln --- - finger Anzeige von Informationen über einen Benutzer --- - last Anzeige der letzten Logins --- - who Anzeige der aktuell eingelogten Benutzer --- - whoami Anzeige des aktuellen Benutzernamen --newpage --withborder --heading Terminal mit bestimmer Shell öffnen - xterm -e /dir/shell & --- - weitere Optionen: * Farbe für Hintergrund und Vordergrund: xterm -bg white -fg black & * Fontgröße einstellen (Umschaltung) --newpage --withborder --heading Shell-Nutzung - warum? - Kommandosequenzen - Abkürzungen - Effizienz - Geschwindigkeit - Ressourcen - Nutzung anderer Rechner über das Internet --newpage --withborder --heading Anwendung - Möglichkeiten * Console: Shell pur * Graphisch: X pur * Kombination von X und Shell --- - keine Verpflichtung zur Nutzung, aber von Vorteil - Nutzung je nach Bedarf, nach Hardware und Einsatzzweck - muss jeder für sich selbst herausfinden --newpage --withborder --heading Integrierte Shell-Befehle - pwd (gib aktuelles Verzeichnis aus) --- - cd (Verzeichnis wechseln) --- - ls (Verzeichnisinhalt anzeigen) --- - echo/print/type --- - Auswahl: . alias bg chdir command dirs disown echo eval exec exit export fg functions history jobs kill logout popd pushd pwd rehash source unalias unfunction unset vared which - zsh goodies: fc vared --newpage --withborder --heading Anmeldung auf einem anderen Rechner - Hintergrund * Faulheit (?) * Netzwerkstruktur * verteiltes Arbeiten, Effektivität --- - Kommandos * ssh - secure Shell, sichere Verbindung * mc - sichere Verbindung (?) * rlogin - remote login, unsichere Verbindung * telnet - remote login, unsichere Verbindung --newpage --withborder --heading Prozesse - Prozessbegriff * ein Programm, in den Speicher geladen und ausgeführt --- - Prozessliste (Aufbau, Spalten) * Kommando ps * Listeneinträge für Prozess-ID, CPU-Last, Speicherlast, Größe des virtuellen Speichers, realer Speicherverbrauch, Kommando.. --newpage --withborder --heading Alternativen zu ps - top - zeigt Taskliste, geordnet nach CPU-Last - htop - wie top, aber bunt und Belegung der Funktionstasten - pstree - zeigt graphische Darstellung des Prozessbaumes - vmstat - zeigt Speicherauslastung --newpage --withborder --heading Prozesse steuern (1) - suspend+resume - Vordergrund+Hintergrund - CTRL+Z, bg+fg --- - in den Hintergrund schicken bg %Prozessnummer --- - wieder in den Vordergrund holen fg %Prozessnummer --newpage --withborder --heading Prozesse steuern (2) - löschen kill Prozessnummer kill -SIG Prozessnummer --- - Prozesse anzeigen, die im Hintergrund laufen oder unterbrochen wurden * jobs -r - Anzeige der laufenden Jobs * jobs -s - Anzeige der gestoppten Jobs --newpage --withborder --heading Prozesspriorität setzen mit nice - Anpassung der Priorität, mit der ein Prozess ausgeführt wird - Wertebereich von -20 (höchste) bis +19 (geringste Priorität) - Wert bestimmt zugewiesene Rechenzeit für den Prozess --- - Aufruf: * nice -10 xterm (starten eines xterms mit Priorität 10) * renice +1 9 (erhöhen der Priorität um eins für Prozess 9) * sleep 10 (Prozess 10 sek pausieren) --newpage --withborder --heading Kanäle - Eingabe: Kanal 0 - Ausgabe: Kanal 1 - Fehler: Kanal 2 --newpage --withborder --heading Umleitung der Eingabe - Umleitung der Eingabe eines Prozesses mit "<" - Beispiel * grep audio < suchergebnis.datei suchergebnis.datei wird nach Dateien durchsucht, die "audio" beinhalten --newpage --withborder --heading Umleitungen der Ausgabe (1) - Umleitung der Ausgabe eines Prozesses als Eingabe eines anderen Prozesses - Beispiel * du -h /home > home_size.dat erzeugt zunächst die datei home_size.dat und speichert die ausgabe von "du -h" darin. --newpage --withborder --heading Umleitungen der Ausgabe (2) * du -h /home >> home_size.dat fügt die Ausgabe des Kommandos "du -h" an das Ende der Datei home_size.dat an --- * find / -user helmut -print 2>/dev/null gibt alle Dateien aus, die dem Nutzer helmut gehören Kanal 2 (Fehlerkanal) wird dabei nach /dev/null umgeleitet, so dass diese Ausgaben verschwinden --newpage --withborder --heading Umleitung der Eingabe *und* der Ausgabe - Beispiel * grep audio < suchergebnis.datei > audioliste.datei suchergebnis.datei wird nach Dateien durchsucht, die "audio" beinhalten, das Ergebnis von "grep" wird in audioliste.datei abgelegt --- * du -h | sort -n | tee woche04.log ermittelt den belegten Speicherplatz, sortiert die Ausgabe numerisch, und teilt die ausgabe auf nach Standardsausgabe (terminal) als auch in die Datei woche04.log --newpage --withborder --heading Pipes (1) - Konzept * Umleitung der Ausgabe eines Prozesses als Eingabe eines anderen Prozesses --- - Beispiel * cat dateiname | wc -l gibt die Anzahl der Zeilen von dateiname aus einfacher: "wc -l dateiname" reicht aber auch aus ;-) --newpage --withborder --heading Pipes (2) * ls | sort -r gibt den Inhalt eines Verzeichnisses in umgedrehter Reihenfolge sortiert aus --- * find / -user helmut -print 2>/dev/null | more gibt alle Dateien aus, die dem Nutzer helmut gehören, und gibt dies an den "pager" "more" zum ansehen; Kanal 2 (Fehlerkanal) wird nach /dev/null umgeleitet --newpage --withborder --heading Named Pipes - Konzept * benannter Datenpuffer (FIFO) * ein Prozess schreibt in den FIFO * ein weiterer Prozess liest daraus, erst danach kann wieder in den FIFO geschrieben werden - Beispiel * mkfifo a_pipe # named pipe anlegen echo "Hallo User" > a_pipe # Daten ablegen tail -f a_pipe # Daten ausgeben * mknod second_pipe p # eine weitere named pipe anlegen --newpage --withborder --heading Reguläre Ausdrücke / Muster / Wildcards (1) - Idee * ein Muster mit Sonderzeichen bestimmt eine Menge an Dateien und Verzeichnissen --- * intelligente Auswahl von Dateien --- * Erfassen und Einschränkung auf ausgewählte Daten --- --newpage --withborder --heading Reguläre Ausdrücke / Muster / Wildcards (2) - Steuerung (Auswahl) * * beliebige lange Kette von (fast) beliebigen Zeichen * ? genau *ein* beliebiges Zeichen * + mindestens ein Vorkommen des vorherigens "Atoms" * [aeiou] genau *ein* Zeichen - entweder a, e, i, o oder u * [a-d] genau *ein* Zeichen - entweder a, b, c oder d * [0-9] genau *ein* Zeichen - eine der Ziffern 0 bis 9 * [a-zA-Z] genau *ein* Zeichen - ein Buchstabe, gross oder klein * [^a-zA-Z] genau *ein* Zeichen - ein Nicht-Buchstabe --newpage --withborder --heading Reguläre Ausdrücke / Muster / Wildcards (3) - Beispiel * ls chapter*.html liefert chapter1.html, chapter2.html etc. --- * df /mnt/hdb[1-3] zeigt den freien Speicherplatz an für die volumes /mnt/hdb1, /mnt/hdb2 und /mnt/hdb3 --newpage --withborder --heading Brace Expansion (1) - Idee * Benutzung der geschweiften Klammern { und } * Zeichenkette innerhalb der Klammern wird verwendet * mehrere Einträge werden durch Komma getrennt --- - Beispiel * ls *.{jpg,gif,png} zeigt alle jpg-, png- und gif-Dateien an --newpage --withborder --heading Brace Expansion (2) * mkdir -p projekte/{artikel,programme,test} legt die folgende vier Verzeichnisse an: projekte/artikel, projekte/programme, projekte/test an, und ebenso projekte/ (falls noch nicht vorhanden) --newpage --withborder --heading Suchen und Finden (1) - Kommando "find" - allgemeine Syntax: find verzeichnisse suchkriterien --newpage --withborder --heading Suchen und Finden (2) - Beispiel * find -type d Ausgabe aller Unterverzeichnisse des aktuellen Verzeichnisses --- * find / -name core -ok rm {} \; ermittelt alle core-Dateien und löscht diese nach Bestätigung --newpage --withborder --heading Subshells - Ausführung eines Kommandos im Hintergrund durch Abschluss mit einem Ampersand/Kaufmannsund kommando & - Vorteile: * die Shell bleibt benutzbar (wird nicht blockiert) * gleichzeitige Abarbeitung mehrerer Aktionen möglich --newpage --withborder --heading Logische Verknüpfungen (1) - Operatoren ";", "&&" und "||" --- - kommando1; kommando2 Nacheinanderausführung beider Kommandos --- - kommando1 && kommando2 kommando2 wird nur dann ausgeführt, wenn kommando1 *keinen* Fehler zurückgeliefert hat --newpage --withborder --heading Logische Verknüpfungen (2) - kommando1 || kommando2 kommando2 wird nur dann ausgeführt, wenn kommando1 einen Fehler zurückgeliefert hat --- - Beispiel * cd bilder && ls -la *.png nur falls "cd bilder" erfolgreich war, wird der Verzeichnisinhalt auf der Konsole ausgegeben --newpage --withborder --heading Aliase (1) - Konzept * Erstellung von kurzen Namen für Kommandos/Befehle mit Parametern --- - Funktionsweise * alias Liste anzeigen * alias dir ls -l erzeugt Kommando dir, welches ls -l entspricht --newpage --withborder --heading Aliase (2) - weitere Beispiele * which, type zeigen Pfad und jedes Alias eines Kommandos an * whereis lokalisiert Binärdateien und Handbuchabschnitte * unalias Alias wieder entfernen --newpage --withborder --heading Kommandozeile editieren - Anfang und Ende CTRL-A Anfang CTRL-E Ende --- - vorwärts und zurück CTRL-F vorwärts CTRL-B zurück ESC B ein Wort zurück ESC F ein Wort nach vorn --- - löschen CTRL-D delete (forward) CTRL-H delete (backward) CTRL-W word delete (backward) CTRL-K kill rest of line CTRL-U undo (delete all) --newpage --withborder --heading History (allgemein) Auffinden von vorherigen Kommandos: * Im Terminal hochscrollen und dann Copy+Paste (meist mit der Maus) * "Durchscrollen" per Cursortasten * "history" zeigt eine Liste der Kommandos, die zuletzt eingegeben wurden * Steuerung der Ausgabe über Variable "history" * "history | grep wort" und dann Copy+Paste (meist mit der Maus) * ineffiziente Vorgehensweise! --newpage --withborder --heading History (Auswahl der Zeile) - Beispiel * !2 wählt Eintrag #2 aus der Liste * !-2 wählt den vorletzten Eintrag * !! wählt den letzten Eintrag * !string wählt den letzten Eintrag, der mit "string" *beginnt* * !?string wählt den letzten Eintrag, in dem "string" *enthalten* ist --newpage --withborder --heading History - Auswahl der Parameter * !# alle Parameter der aktuellen Zeile * :* alle Parameter, z.B. !!:* * :^ erster Parameter, z.B. !less:^ * :$ letzter Parameter, z.B. !3:$ * :2 zweiter Parameter, z.B. !-2:2 * :2-4 Zweiter bis vierter Parameter, z.B. !#:-2 --newpage --withborder --heading History Expansion - Modifizierer * :h entfernt letzte Pfadkomponente, z.B. /foo/bar ??? /foo * :t entfernt Pfad von einer Datei, z.B. /foo/bar ??? bar * :r entfernt letzte Dateiendung, z.B. foo.x.y ??? :r:r ??? foo --newpage --withborder --heading History Expansion: Kurzformen * !^, !$, !:2, !* Erster, letzter, zweiter bzw. alle Parameter des letzten Befehls. Entspricht !!:^, !!:$, !!:2, !!:* * ^a^b Ersetze das erste "a" durch "b" im letzten Befehl. Entspricht !!:s/a/b --newpage --withborder --heading Korrektes Quoting/Zitieren - "" Inhalt wird expandiert - '' Inhalt wird *nicht* expandiert - `` Inhalt wird in einer Untershell als Befehl ausgewertet --newpage --withborder --heading Quellen und Nachschlagewerke - Michael Kofler: "Linux - Installation, Konfiguration, Anwendung" Addison-Wesley, 2006, ISBN 3-8273-2342-8 - Hendrik Muhs: "Linux-Tuning", C&L, 2002, ISBN 3.932311-75-2 - Jürgen Wolf: "Shell-Programmierung", Galileo Press, 2005 ISBN 3-89842-683-1 --newpage --withborder --color blue ooooo o o oooo ooooo o oo o o o o oooo o o o o o oooo o o oo o o o ooooo o o oooo ooooo ... und vielen Dank für's Zuhören :)