Shell-Tutorial M. Merschmeyer 1
Download der Vorträge Link Link http://indico.cern.ch/conferencedisplay.py?confid=91326 http://indico.cern.ch/conferencedisplay.py?confid=91326 Passwort: Passwort: 'BSC' 'BSC' (ohne (ohne '' ')') 2
Inhalt Teil 1 wichtige Shell-Befehle und Programme Teil 2 Shell-Skripte 3
Warum klicken... 4
...wenn man auch Tippen kann 5
Wichtige Shell-Befehle kurzer Überblick über grundlegende interaktive Befehle wie finde ich heraus, was ein Shell-Befehl tut? Linux Manual Pages (Beenden mit 'q'): man [Befehl] (manchmal) Option für Hilfe: [Befehl] --help etwas Vorsicht ist angebracht, ein sorgloser Umgang z.b. mit rm -rf * kennt (fast) kein Zurück ( Backup M. Winkler) 6
Linux-Verzeichnisstruktur Verzeichnisebenen werden durch '/' angezeigt nach dem Öffnen eines Terminals befindet ihr euch in eurem Home-Verzeichnis, in meinem Fall z.b. /home/home1/institut_3a/merschm unterhalb dieser Ebene liegen dann eure Dateien und Verzeichnisse Pfadnamen: absolute Pfade beginnen mit '/' starten also immer ganz oben in der Verzeichnishierarchie, z.b. /verz1/verz2/verz3(/dateiname) relative Pfade beginnen nicht mit '/' und beziehen sich immer auf die aktuelle Position in der Verzeichnishierarchie, z.b. verz4/verz5(/dateiname) oder../verz6(/dateiname) 7
Linux-Verzeichnisstruktur Befehle pwd (print working directory) wo bin ich gerade? cd (change directory) cd zum Home-Verzeichnis cd ~ zum Home-Verzeichnis cd.. eine Ebene höher cd [pfadname (abs./rel.)] (Normalfall) zum besagten Verzeichnis cd - zum vorherigen Verzeichnis es gibt noch viel mehr Möglichkeiten, lest die 'man'-seiten 8
Datei- / Verzeichnisinformationen Befehle tree (tree-like listing of dir. cont.) was ist ab hier zu finden? ls (list directory contents) ls einfache Auflistung ls -l erweiterte Informationen ls -(l)r rekursive Auflistung ls -ltr zeitgeordnet (alt neu) ls -C1 *.txt Auflistung aller.txt-dateien in einer Spalte lest die man-seiten... 9
Informationen / Zugriffsrechte Gruppe d. Größe Datum d. letzten Besitzer Besitzers in Bytes Änderung Zugriffsrechte -rw-------rw-r-----rw-rw-rwdrwx------ 1 1 1 5 merschm merschm merschm merschm inst3a 7357 Apr 18 14:41 inst3a 9822 Apr 18 14:42 inst3a 0 Apr 18 14:40 inst3a 42 Apr 18 14:40 rwx rwx rwx Rest der Welt Besitzer-Gruppe Besitzer r steht für Lesen w steht für Schreiben x steht für Ausführen Name datei1.txt datei2.txt datei3.txt verz1 Klaus Gerhardt, 08.2005 Zugriffsrechte können mit 'chmod' geändert werden Syntax: chmod [u,g,o] [+,-] [r,w,x] [D.-/Vz.-Name] z.b.: chmod go+r [Name] Leserechte f. Gruppe / Rest chmod o-rwx [Name] Wegnahme aller Rechte f. Rest 10
Platzhalter: Wildcards Klaus Gerhardt, 08.2005 11
Erstellen und Löschen Erstellen (...geht natürlich auch mit anderen Programmen...) Verzeichnisse: mkdir [(Pfad/)Verzeichnisname] mkdir -p [(Pfad/)VZ1/VZ2/VZ3/VZ4] erstellt ALLE fehlenden Verzeichnisse bis hin zu VZ4 Dateien: touch [(Pfad/)Dateiname] falls Datei nicht existiert wird eine leere Datei erstellt, andernfalls werden Zugriffsdaten auf aktuelle Zeit/Datum gesetzt Löschen (Verzeichnisse + Dateien) rm [(Pfad/)Dateiname] rm -rf [(Pfad/)Name] rm -rf * shred -u [Name] löscht besagte Datei rekursives Löschen (Dat./Verz.) (!!!) löscht alles ab akt. Verz. sicheres Löschen (mit Überschr.) 12
Kopieren und Verschieben Kopieren: 'cp [Optionen] [Quelle] [Ziel]' z.b.: cp Datei1 (Pfad/)Datei2 kopiere Datei1 in Datei2 bzw. überschreibe Datei2 mit Datei1 cp -r Verz1 (Pfad/)Verz2 rekursives Kopieren von Verz1 (inkl. Untervz.) in Verz2 cp -u Datei1 (Pfad/)Datei2 Kopieren nur, falls Quelle neuer als Ziel Verschieben: 'mv [Optionen] [Quelle] [Ziel]' z.b.: mv Datei1 (Pfad/)Datei2 verschiebe Datei1 in Datei2 mv Verz1 (Pfad/)Verz2 verschiebe Verz1 in Verz2 mv -u Datei1 (Pfad/)Datei2 Verschieben nur, falls Quelle neuer als Ziel 13
Suchen & Finden Situation Lösungen: 'find' bzw. 'which' find [Startpfad] (-type [Typ]) -name [Name] suche Datei/Verz. und kenne z.b. nur einen Teil des Namens suche Programmort Startpfad : wo soll's losgehen Typ : Datei ('f'), Verz. ('d') Name : Objektname Wildcards which [Programmname] 14
Speicherplatz Speicherplatzverbr. bzw. freier Platz? disk space usage : 'df' file space usage : 'du' df : freier Platz auf allen 'Platten' df [Pfad] : freier Platz dort, wo ich bin du (-h) : belegter Platz hier u. unterhalb du -s(h) : nur Gesamtspeicherbedarf 15
Kompression von Dateien Es gibt verschiedene Kompressionsprogramme Syntax gzip / gunzip tar zip / unzip gzip -[1 9] [Dateiname] gzip -d [Dateiname] tar -c(z)f [Archivname] [Dateiliste/Verz.] tar -x(z)f [Archivname] zip/unzip : ähnlich 16
Rund um Textdateien Textdateien auf dem Terminalfenster ausgeben N erste / letzte Zeilen einer Textdatei ausgeben head -[# Zeilen] [Dateiname] oder tail... Zeilen in einer Textdatei zählen more [Datei] : seitenw. Ausgabe, Blättern mit [space], Ende: 'q' less [Datei] : ähnlich 'more' + Vor- und Rückwärtsscrollen wc -l [Dateiname] DOS/MAC und Unix/Linux verwenden verschiedene Zeichen für das Zeilenende (CR+LF LF) Konvertierung dos2unix [Dateiname] oder unix2dos... 17
Mit Text hantieren neu: neu: ' '' ' (Pipe) (Pipe) verarbeite verarbeite die die Ausgabe Ausgabe eines eines Kommandos Kommandos mit mit einem einem weiteren weiteren Kommando Kommando $PWD $PWD Umgebungsvariable Umgebungsvariable '`Kommando`' '`Kommando`' Ausführen Ausführen in in der der Eingabezeile Eingabezeile '\(...)' '\(...)' Schützen Schützen bestimmter bestimmter Spezialzeichen Spezialzeichen grep : Textdateien nach Worten/Mustern durchsuchen cat : Textdateien auf Terminal 'dumpen' sed : Ersetzen von Worten/Mustern in Texten echo : Textausgabe im Terminal cut : Zerlegen von Text in Felder 18
Keyboard-Abkürzungen CTRL+P : vorheriges Shell-Kommando CTRL+A/E : springe zum Anfang/Ende der Kommandozeile CTRL+S/Q : Stop/Start der Terminalausgabe CTRL+D : beendet die laufende Terminal-Sitzung CTRL+C : Abbruch des gerade laufenden Programms CTRL+Z : hält das gerade laufende Programm an Wiederaufnahme in den Hintergrund verschieben mit 'bg' exklusive Wiederaufnahme im Vordergrund mit 'fg' CTRL+R : Durchsuchen der Bash-Kommando-Historie Suchbegriff eingeben Auswahl des gesuchten Kommandos mit CTRL+R 19
Prozesse (laufende Programme) Programme in Hintergrund starten '&' nach Kommando anhängen Ansicht laufender Prozesse Beenden von (z.b. verrückten) Prozessen ps aux ( grep...) top 'u' [username] top 'k' [Proz..-ID] kill (-9) [Proz.-ID] killall [Proz.-Name] 20
Ein- und Ausgaben, Pipes Ausgabe von Text und/oder Variablen echo text1 $var text2 Einlesen von Werten oder Text read [Variablenname] echo ${Variablenname} Ausgabe in Textdateien ls -l./ > [Dateiname] echo text1 > [Dateiname] Datei erzeugen + füllen echo \n text2 >> [Dateiname] an Datei anhängen Augaben eines Befehls durch weitere Befehle verarbeiten echo Ein Text sed -e 's/text/neuer Text/' ls -lr grep -i datei 21
Dies und Das Dateien direkt aus dem WWW laden mit 'wget' wget http://tldp.org/ldp/abs/abs-guide.pdf Datum und Uhrzeit abfragen mit 'date' date date +%H:%M:%S date +%d.%m.%y Tue Apr 20 09:37:17 CEST 2010 09:37:44 20.04.2010 Tab Completion : Bash kann Teile von Namen und Pfaden vervollständigen wenn man 'tab' drückt 'ac' eingeben 'tab' einmal drücken 'tab' nochmals drücken nichts passiert (Shell piept) Shell macht Vorschläge ac aclocal-1.4 aclocal-1.6 aclocal-1.9 acpi_listen activation-client aclocal aclocal-1.5 aclocal-1.7 aconnect acroread acyclic 22
Shell-Skripte Was sind Shell-Skripte? Wozu das alles? Sammlung von Shell-Kommandos (+ Programmiersprache ) in einem Text-File mit Shell-Skripten kann man eigene Befehle (mit Parametern und Ausgaben) erzeugen Durchführung von automatisierten Arbeitsabläufen Was braucht man zum Schreiben solcher Skripte einen Texteditor: vi, (X)emacs, (nicht: Word, OpenOffice, ) Shell-Kommandos: 'vi', 'emacs', 'xemacs' ((x)emacs mit '&' starten, um im interaktiven Modus zu sein) ein zu lösendes Problem, viele Beispiele und Geduld... 23
24
Shells Welche Shells gibt es? Welche sollte man verwenden? sh, csh, ksh, tcsh, bash, zsh Kriterien: Support, Up-to-date-ness, Funktionsumfang http://consult.cern.ch/writeup/shellchoice/main.ps wir werden die Bash (Bourne-again shell) verwenden, da sie extrem weit verbreitet und recht aktuell ist CMS-Software (CMSSW) verwendet csh / bash (+ Python), eigene Skripte können natürlich in Bash formuliert werden... höhere Skriptsprachen: Perl, Python, Ruby (nicht hier/heute) 25
Grundlegende Shell-Skripte Zwei Shell-Skripte, die jede(r) haben sollte.profile : wird beim Login ausgeführt... # Set up Prompt export PS1="\[\e[31m\]\u\[\e[0m\]@\[\e[32m\]\h\[\e[0m\]:\[\e[34m\]\W\[\e[0m\] > "... ( Prompt: merschm@lxportal1:temp > ) + Setzen vom Umgebungsvariablen, Funktionen,....bashrc : wird beim Start einer Shell (Terminal) ausgeführt... alias ll="ls -l --color" alias psdouble="pstops'2:0l@0.7(21cm,0)+1l@0.7(21cm,14.85cm)' " mmldc () { dcls /cms/store/user/merschme/$1; } export PATH=$PATH":"$HOME/bin/... definiert Aliases, Funktionen, Umgebungsvariablen, NB: versteckte Dateien ('.' am Anfang) werden nur mit 'ls -a' sichtbar) 26
Ein erstes Beispiel Hallo Welt -Skript #!/bin/bash echo Hallo Welt! exit 0 1. Zeile: Skript soll durch Bash verarbeitet werden (wo ist die?) öffne Sub-Shell (bei Ausführung durch './' ja, mit 'source' nein) ('#' ist sonst Kommentarzeichen) 2. Zeile: Textausgabe mit 'echo' 3. Zeile: Rücksprung zur übergeordneten Shell 27
Variablen I Umgebungsvariablen bestimmen Verhalten von Shell, Programmen und Benutzerinterface (Ansehen mit 'env') Beispiele HOME : Pfad des Home-Verzeichnisses PWD : aktueller Pfad PATH : Liste von Verzeichnissen, in denen Programme/Skripte liegen LD_LIBRARY_PATH : Verzeichnisse, in denen Programmbibliotheken liegen Zugriff auf Inhalt durch '$[Variable]', also z.b. 'echo $PATH' Lokale Variablen innerhalb eines Skripts IDIR="/tmp" NOPT=10 # installation directory # no. of options Bash-Variablen haben keinen Typ (kontextabhängig) Zugriff auf Inhalt wie bei Umgebungsvariablen 28
Variablen II Rechnen mit Variablen count=0 let count=$count+1 echo count: $count count: 1 ( Operationen: '+', '-', '*', '/', '**', '%' ) Zusammenstückeln von Strings var1= text var2=1234 var3=${var1} _ ${var2} echo var3: $var3 var3: text_1234 Variablen immer initialisieren um Probleme zu vermeiden Bash ist nicht zum number crunching gedacht! 29
Tests Logische Bedingungen ( '&&' : logisches UND, ' ' : log. ODER ) z.b. [ Bedingung1 ] && [! Bedingung2 ] '!' : invertiert 'Bedingung2' unbedingt an 'space' zwischen '[', ']' und 'Bedingung' denken! häufige Tests $VAR = string : Strings vergleichen $VAR -eq 101 : Zahlen vergleichen ( -eq, -gt, -ge, -lt, -le, -ne oder ==, >, >=, <, <= ) -e $file : Datei existiert -f $file : $file ist eine Datei -d $dir : $dir ist ein Verzeichnis 30
if, then, else und while if [ B1 ]; then (Anweisungen) else if [ B2 ]; then (Anweisungen) else (Anweisungen) fi Verschachtelung bei zu vielen Bedingungen while [ B ]; do (Anweisungen) done Abbruchbedingung beachten! 31
for loop und case for arg in [list]; do (Anweisungen) done 'arg' nimmt alle Werte der Einträge oder Variablen in '[list]' an classical example: 'arg' :i '[list]' : `seq 10` case $OPT in a) (Anweisungen) ;;... z) (Anweisungen) ;; esac mehrere, durch ';' getrennte komplexe (if, for,...) Anw. möglich ';;' nicht vergessen! (Akzent '`' : ausführen) c-syntax möglich 32
for -Beispiel durch Erzeugung von komplexen Listen mittels ' `Befehl(e)` ' kann die for-schleife sehr mächtig werden (`[Bef.]` : 'command substitution') 33
Parameter Man kann einem Shell-Skript Parameter übergeben : n-ter Par. (${n} ab n>9) : Name des Skripts : Anzahl der Parameter : alle Parameter : Prozess-ID 'shift' : schiebt alle echten Parameter um eins 'nach links' $n $0 $# $@ $$ $1 wird verworfen $2 $1 usw. 34
Optionen Optionen sind komfortabler als Parameter, allerdings auch komplexer in der Handhabung ermöglichen Skripte, die fast einem Programm gleichen Reihenfolge spielt keine Rolle Optionen können Parameter haben oder einfach nur 'Schalter' sein machen eine 'Hilfe'-Funktion 'sehr wünschenswert' 35
Hilfe Advanced Bash-Scripting Guide http://tldp.org/ldp/abs/html/ http://tldp.org/ldp/abs/abs-guide.pdf BASH Guide for Beginners http://tldp.org/ldp/bash-beginners-guide/html/index.html http://tldp.org/ldp/bash-beginners-guide/bash-beginners-guide.pdf Others http://wiki.bash-hackers.org/doku.php http://linuxseiten.kg-it.de/index.php?index=themes_bash http://subsignal.org/doc/aliensbashtutorial.html http://www.linuxconfig.org/bash_scripting_tutorial http://www.hypexr.org/bash_tutorial.php 36
37
38
Aufgabe: Macht euch diese Referenzkarte selbst 1. findet das tex-file 'refcard' (unter /usr) 2. kopiert das File in ein lokales Verzeichnis 3. ändert die Anzahl der Spalten/Seite mit 'vi' 4. kompiliert die Datei mit 'tex' 5. macht mit 'dvips' eine Postscript-Datei (A4, Landscape-Modus '-t'-option) 6. konvertiert diese Datei in eine PDF-Datei 39