Post on 28-Aug-2019
transcript
Shellprogrammierung: Bash... ein kleiner Einblick ...
Basierend auf Bash 2.05b oder Bash 3.0 unter Debian 3.1 Sarge von Michael Arlt
Grundlagen Pfade
• Linux verwendet keine Laufwerksbuchstaben wie Windows oder DOS
• Nicht \ sondern / als Trennzeichen der Pfade/Dateien• Platteneinheiten werden an bestimmte Stellen im
Filesystem eingebunden• / ist das Root-Verzeichnis• Absolute Pfade beginnen mit /• Relative Pfade stehen im Verhältnis zum aktuellen
Verzeichnis• . steht für das aktuelle Verzeichnis• .. für das übergeordnete "
~ für das Homeverzeichnis• ~benutzer für das Homeverzeichnis eines Benutzers
/
home usr tmp
Historie der Shells
1971-79 osh Thompson-Shell197[4|7]- sh Bourne Shell von Steve Bourne197[8|9]- csh C-Shell von Bill Joy - C-Syntax1979- bash Bourne Again Shell
Features aus sh, csh und ksh1981- tcsh TENEX-C-Shell Christos Zoulas
Erweiterung der C-Shell1983- ksh Korn-Shell von David Korn
OS seit 2000 → ksh88 und ksh93<=1989- ash Almquist Shell von Kenneth Almquist
sehr schnelle, einfache bash-Variante19[89|90]- zsh Z-Shell von Paul Falstad
Features aus bash, csh und tcsh<=1995- pdksh PD Version der ~ ksh88, teilweise ksh932002 dash Umbenennung der portierten FreeBSD ash
aus dem Jahre 1997 (→ Debian ash?)2004 bash3 Debugging
Eigenschaften der bash
• http://www.gnu.org/software/bash/bash.html• sh-kompatibel (Korn- und System V Shell)• IEEE POSIX P1003.2/ISO 9945.2 konform• Features aus sh, csh und ksh• Zusätzliche Features
• Kommandozeile editieren• Unbegrenzte Historie• Job Control• Shell Funktionen und Aliase• Arrays unbegrenzter Größe• Integer Arithmetik der Basis 2 bis 64• Debugging seit Version 3.0 (?)
NützlicheTastenkombinationen
Cursorbewegungen• ↑ ↓ Historie blättern• ← → Cursor
positionieren• Ctrl-a Zeilenanfang• Ctrl-e Zeilenende• Alt-f Wort vorwärts• Alt-b Wort zurück
Zeile bearbeiten• Alt-d Wort löschen• Ctrl-k Lösche bis
Zeilenende
Suche• Ctrl-r Suche (Historie)
Vervollständigung• Tab Dateinamen• Tab Variablen
Sonstiges• Ctrl-Alt-e Shellexpansion• Ctrl-xx Cursor tauschen• Alt-# Kommentarzeile
Mit der bash vertraut machen
Einfacher Einstieg(Start eines Programmes)
Start eines Programmes mit mehreren Parametern:
Unter Angabe des Pfades:
$ ./programm parameter1 parameter2
Ohne Pfad, da interner Befehl oder Befehl aus Suchpfad $PATH=/usr/bin:/home/ich/bin
$ befehl parameter1 ...
manDie Onlinehilfe über den Befehl echo aufrufen
Aufbau der Manpage
pwd(1) - Linux man pageNAME pwd - print name of current/working directorySYNOPSIS pwd [OPTION]DESCRIPTION
Print the full filename of the current working directory.--help display this help and exit --version output version information and exit
AUTHOR ...COPYRIGHT ...SEE ALSO ... info pwdshould give you access to the complete manual.REFERENCED BY gindxbib(1), indxbib(1), pawd(1)
Wird auch vonanderer Stelle
referenziert
Kategorie derManpage:
1 Programme2 Systemaufrufe
3 Bibliotheksaufrufe4 Spezielle Dateien
5 Dateiformate6 Spiele
7 Makropakete8 Systemadmin9 Kernelroutinen
Syntax
AllgemeineBeschreibung
$ man -k passwd $ man 5 passwd
man passwdman 5 passwd
Andere Toolspassend zum
Thema
Syntax
[ ] optionaler Parameter| oder... kann wiederholt auftreten-f datei Schalter -f benötigt eine Dateiangabe-axcvf Diese Parameter können beliebig
kombiniert werden
grep [options] [-e PATTERN | -f FILE] [FILE...]cut -f list [-d delim] [-s] [file ...]
Einfacher Einstieg (Variablen)
Wertzuweisung einer Variable definiert diese
$ name=meier
Zugriff auf den Inhalt einer Variableerfolgt durch Ersetzung der Shell
$ echo $name # Shell ersetzt $name$ echo meier # durch meier
echoDen Text „Hallo“ zusammen mit der Variable „name“ ausgeben
Start der Bash
Aufruf• Eingabe von „bash“• /etc/passwd• Erste Zeile eines
Scriptes:#!/bin/bash
Start als sh• Versucht Bourne Shell
kompatibel zu sein• Posix Standard
1. /etc/profile2. ~/.profile
Start als Loginshell (Bash)1. /etc/profile2. Erster Treffer von
• ~/.bash_profile• ~/.bash_login• ~/.login
Stopp der Loginshell• ~/.bash_logout
Start als interaktive Shell1. /etc/bash.bashrc2. ~/.bashrc
x=1w=2r=4
Summe derRechterwxr-x--=750
Rechte im Filesystem
Es gibt diverse Attribute im Filesystem
$ ls -al # listet alle Dateien - auch mit "." am Anfang
drwxr-x--x 5 root sys 4096 Oct 10 20:37drwx--x--x 7 root sys 12288 Oct 7 09:20 ..-rw------- 1 root sys 8208 Oct 10 20:37 .bash_history-rw-r--r-- 1 root sys 197 Nov 25 2003 .profile
Typ (d Verzeichnis, - Datei, l Link usw.)
Rechte des Eigentümers (user)
Rechte der Gruppenmitglieder (group)
Rechte vom Rest der Welt (others)
Owner
Group
Rechte im Filesystem ändern
Eigentümer ändern$ chown root datei
Gruppenzugehörigkeit ändern$ chgrp sys datei
Rechte ändern$ chmod 750 datei$ chmod g+rx,o+r datei$ chmod u=rwx,g=rx,o=r datei
chmod chownAuf ein File der Welt zusätzlich Leserecht geben und der Gruppe sys schenken
Besondere Zeichen I
# Kommentar – auch innerhalb einer Zeile; Mehre Befehle in eine Zeile" Einzelbetrachtung der Shell deaktivieren
$ echo a b "a b"a b a b
' Keine Interpretation der Zeichenkette\ Nächstes Zeichen nicht interpretieren& Verarbeitung im Hintergrund-- Das Ende von Optionen
$ rm -- -a # löscht Datei -a- StdIn oder StdOut, wenn als Datei angegeben{} Textsubstitution – alle Variationen werden erzeugt
$ echo test{1,2}.{c,o} test1.c test2.c test1.o test2.o
sleepBefehl in den Hintergrund legenecho + printfText „$alter=18“ ausgeben
Besondere Zeichen II
` Kommandosubstitution (Shift haltenund dann die Taste links vonBackspace drücken). Der Befehls in`` wird durch sein StdOut ersetzt.Danach wird die Zeile ausgeführt.$ echo Hallo `whoami`
. Verarbeitung in der aktuellen Umgebung -Variablen und Funktionen bleiben erhalten$ . ./script.sh; echo $neuevariable
() Startet eine Subshell - (z. B. Ausgabe Bündeln)$ (echo hans; echo paul) | wc -l
{} Wie (), startet jedoch keine Subshell$ { echo hans; echo paul;} | wc -l
~ ~[user] expandiert zum jeweiligen Homeverzeichnis
echo pwd„Sie befinden sich in <Pfad>“ ausgeben( read ) echoVariable in Subshell setzen; ausgeben
Kanäle
Pgm1StdIn→
StdOut→
Pgm2StdIn→
StdOut→
Standard:Bildschirm
Standard:Tastatur
|
Pipe verbindetStdOut+StdIn.
Somit ist StdOutvon Pgm1 StdIn
von PGM2
> Datei # Ausgabeumlenkung (hinter dem Programm)< Datei # Eingabeumlenkung (auch hinter dem Programm)Kanal 1 ist StandardOut, 2 ist ErrorOut$ echo hans >logfile 2>errorfile
whoAngemeldete Benutzer in Datei protokollierentail sortDie letzten Zeile einer Datei sortiert ausgeben
Ein- / Ausgabeumlenkung
| Pipe verbindet StdOut → StdIn$ echo hans | less
> Leitet StdOut um (create) - z. B. → Datei$ echo hans >logfile
>> Leitet StdOut anhängend um (append)$ echo hans >>langeslogfile
< Eingabeumlenkung - liest StdIn aus Datei$ echo hans
<< here-document liest Datenbis zur Endemarke$ grep hans <<EOFhansEOF
dateDatum an Datei anhängensed here-doc.Text hans durch paul ersetzengrep tee cut 2>errorPipesequenz mit Logfile
Konsole-Editor: vim
• ESC→Kommandomodus• Cursorbewegungen
– ←h ↓j ↑k →l– w word jump– G Zeilenende– 6G Zeile 6
• Text einfügen→Schreibmodus– I insert– a append– A append EOL– o neue Zeile ↓– O neue Zeile ↑– cw change word– r replace char
• Text kopieren• yy copy line• p paste
• Text löschen– dd delete line– x delete char– Shift+d delete EOL
• vi verlassen• :x [file] save&quit• :wq! [file] save&quit• :q! force quit
• Sonstiges• /PAT<cr> Suchen• :n next file• u undo• . repeat last action• J join lines• :syntax enable
vim man lessÜben!
Konsole-Editoren: mp und le
• mp bzw. mped ()• Debian Paket mped• C, C++, Perl, Shell Scripts,
Ruby, Php, SQL, Python, HTML...
• Kontext-Hilfe (man) - je nach Sprache, Regular Expressions Suche
• le ()• Debian Paket le• C, C++, nroff, Eiffel, Python,
Sather, Shell, java, po, html, Lout, Perl
• Hex-Mode und mmap-Edit (nur Ersetzen), Multibyte-support, Blockoperationen
Konsole-Editoren: fte und jed
• fte (2002)• Debian Paket fte-terminal• C(++), Java, Perl, Sh,
Pascal, SQL, PHP, Python, Ada, HTML, makefiles...
• Parse Comp.+grep-Output, Regular Expr. Suche, Multi-File, Blockoperationen
• jed (10/2005)• Debian Paket jed• C, C++, FORTRAN, TeX,
HTML, SH, python, IDL, DCL, NROFF
• Blockoperationen, Multi-Fenster, S-lang Sprache, Regular Expressions Suche
mped le fte jedAusprobieren!
Grundlagen zum Stil
Regeln:• Sinnvolle Namen für
Variablen und Dateien• Variablen durchgängig
gleich schreiben• if, while, ... mit zwei
Leerzeichen einrücken• Modularisieren• Kommentieren• Strings in Vergleichen in ""
fassen!?• Shellscripte enden mit .sh• Ziel: gleicher Wissensstand
und Stil aller Entwickler
while read n b;dotest $n!=$a && eval "echo $a \
$s;s=0"s=s+b;a=$ndone <xecho $a $s
while read name betragdo # Gruppenwechsel prüfen if [ "$name" != "$altername" ] then summeausgeben summe=0 fi # Summe pro Kunde bilden summe=summe+betrag # alten Namen für GW merken altername=$namedone <buchungsliste.csvsummeausgeben
Schleifen
Die for-Schleife verarbeitet Listen$ for i in a b c>do> echo $i>done
Die for-Schleife mit arithmetischen Ausdrücken$ for ((i=0;i<8;i++))>do> echo $i>done
Die while-Schleife arbeitet, solange kein Fehler auftritt$ while befehl>do> :>doneDie until-Schleife arbeitet, solange ein Fehler auftritt$ until befehl>do> :>done
for ls cpAlle Dateien auf *.kopie duplizierenwhile read rm Strg+DSolange Dateinamen eingegeben werden: Ohne Fehler löschen!
Bedingte Verarbeitung
$ if befehl> then> :> else> :> fi
befehl kann wie bei while[ bedingung ]sein.
Alternative Konstruktionen
• Bei Erfolg$ cmd1 && cmd2
• Bei Mißerfolg$ cmd1 || cmd2
$ case $i in> a) echo $a;> b) echo $b;> *) echo rest;> esac
if mkdir cd ln || echoVerzeichnis erzeugen, hineingehen und test.txt aus Home- ins Arbeitsverzeichnis linken. Fehlermeldungen!
Der Befehltest
Der Befehl „test“ prüft – Ergebnis ist Returncode
• Numerische Vergleiche• -eq gleich• -ne ungleich• -lt kleiner• -gt größer• -le kleiner gleich• -ge größer gleich
• Stringvergleiche• = gleich• != ungleich• < kleiner (locale) ?• > größer (locale) ?
• Filesytem• -f reguläre Datei• -d Verzeichnis• -w beschreibbar• -r lesbar
• Logisch• \( \) gruppieren• -a und• -o oder• ! nicht
$ test $alter -eq 18$ [ "$name" = "oli" ]
test = [ →LeerzeichenwegenParametern!
while test head tail sleepSolange Datei existiert: Dritte Zeile ausgebenif test wc du cut rmWenn Datei >5 Zeilen oder >1KB: löschen
[[ - die Alternative
! nicht[[ ! $a = b ]]
== Pattern Matching – funktioniert nur ohne "" -? einzelnes Zeichen* beliebige Zeichen[abcf-g] bestimmte Zeichen[:class:] Zeichenklasse[!a] negierte Zeichen[[ $a == a?b*[f-h] ]]
!= Pattern Matching
[[ ` touchAussagen prüfen
< kleiner[[ "a" < "b" ]]
> größer
&& und|| oder[[ $a = b || $b = b ]]Der zweite Ausdruck wird nicht geprüft, wenn der erste Ausdruck entscheidet.
() Gruppieren
Dateinamenexpandierungder Shell
Die Shell expandiert auf dieentsprechenden Trefferim Filesystem.
? ein beliebiges Zeichen ?[ ] eine Zeichenklasse [abc123]- beschreibt ein Intervall [a-z]! negiert die Zeichenklasse [!a-z]* beliebige Zeichen – auch keins *Beispiel: $ ls [abcg-k][0-9]a[!b]*.???
echo und lsObjekte ausgeben:1: kleine Buchstaben oder Zahlen2: beliebig3-5: Buchstaben a+b6: nicht a + nicht b
RegularExpressions
Standards diverser Befehle (vi, grep, awk, expr, sed usw.) zur Mustererkennung
. genau ein Zeichen .[ ] eine Zeichenklasse [abc123]- beschreibt ein Intervall [a-z]^ negiert die Zeichenklasse [^a-z]* vorheriges Zeichen beliebig oft a*^ Zeilenanfang ^a$ Zeilenende a$:class: bestimmte Zeichenklassen :digit:
grep /etc/passwd cutBenutzer mit einstelliger Userid ausgeben
Shell-parameter
$0 Name des aktuellen Programms
$1 Erster Parameter ...$# Anzahl der Parameter$* Alle Parameter
"$*" → "$1 $2 $3"$@ Alle Parameter -
"@*" → "$1" "$2" "$3"$$ Prozessnummer$- Gesetzte Shelloptionen$? Returncode des letzten
Befehls$! Prozessnummer des
zuletzt abgehängten Befehls
msg="Aufruf: $0 [-a] [-f datei]
while [ $# -gt 0 ]do case $1 in -a) mode=a;shift;; -f) datei=$2;shift;; *) echo $msg >&2; esacdone
while getopts :af opt;do case $opt in a) mode=a;; f) datei=$OPTARG;; *) echo $msg >&2; esacdone
basename dirnameName und Pfad des Scriptes ausgebenwhile echo shiftAlle Parameter ausgeben
Variablendefinieren
Normale Variablen$ name=meier$ declare name$ declare name=meier
Lokale Variablen in Funktionen – sterben nach Beendigung der Funktion$ declare x=5$ local y=6
Temporäre Variablen$ LC_ALL=de_DE date
Globale (exportierte) Variablen$ export name$ export alter=18$ export -n name # normal
Variablen anzeigen• Alle Variablen$ set
• Nur exportierte Variablen$ env # oder export
Variablen löschen$ unset name
a=5 echo $aAusgabe erklären!for env cut eval echo ` ` grep unsetExportierte Variablen mit Zahleninhalten löschen
Variablenexportieren
Shell 1
NormaleVariablen
ExportierteVariablen
export
a=10
a=10
startet
Kopie
Shell 1
NormaleVariablen
ExportierteVariablen a=10
• Beim Start einer Shell wird dieser eine Kopie der exportierten Variablen zur Verfügung gestellt.
• Veränderungen an der Kopie haben keine Auswirkung auf das Original.
Arrayvariable deklarieren (optional)$ declare -a name
Zugriff auf Arrayelemente$ name[0]=meier$ alter=(7 3)$ echo ${name[0]}$ echo ${name[*]}$ echo ${name[@]}
VariablenRechnen und Arrays
Rechnen mit externem Befehl$ x=`expr x + 5`
Definition als Integervariable$ declare -i x=2$ x=x+5
Interne Shellfunktion: let$ let x=x+5
Arithmetischer Ausdruck$ ((x=x+8#11)) # oct:9
Arithmetische Expansion$ echo $((1+1))
typeset time while expr ... Ausführungszeit diverser Rechenvarianten testenwhile echoArray „name“ ausgeben
VariablenExtras
Zugriff auf eine Datei$ echo $(<datei)
Kommandosubstitution (` `)$ echo $(ls)
Escaped Characters$ echo $'string' \n Newline \r Carriage Return \b Backspace \t Tab \v Vertical Tab \xHH Hex \NNN Octal
IFS read echoText mit Leerzeichen in Variable lesen und unverändert ausgeben
Arithmetische Ausdrücke
x++ x-- Nach Verarbeitung +1 oder -1++x --x Vor Verarbeitung +1 oder -1! ~ Logische und bitweise Negierung** Potenzierung* / % Multiplikation, Division und Restwert- + Subtraktion oder Addition&& || Logische Operatoren
<= >= < > != == Vergleiche= += -= *= /= Wertzuweisungenexpr?expr:expr Bedingte Werte
Beispiele: ((a+=5)) ((a=b>2?0:1))
echo $ (( )) = += ?: ++Diverse arithmetische Ausdrücke anwenden
Parameter-substitution
${parameter} Der Parameter selbst${#parameter} Anzahl der Buchstaben${#parameter[*]} Anzahl der Elemente${parameter:-word} Wenn Parameter null
dann word, sonst Parameter${parameter:=word} Wenn Parameter null → Parameter=word${parameter:+word} Wenn Parameter != null dann word,
sonst Parameter${parameter#pattern} Pattern von links entfernen$ name=katze$ echo ${name#k}atze${parameter%pattern} Pattern von rechts entfernen${parameter/pattern/string} Pattern einmalig durch String ersetzen${parameter//pattern/string} Pattern mehrfach durch String ersetzen${parameter:offset:length} Substring ermitteln
find file while read mv Alle Shellscripte die nicht auf .sh enden dahin umbenennen
Funktionen
Definition auf der Befehlszeile$ groesse() { ls -l|sort -k1.35n;}
Definition im Shellscriptgroesse(){ ls -l|sort -k1.35n return $?}
Funktion listen$ typeset -f [fname]
Funktion löschen$ unset -f fname
Parameter
$0 Name des Scriptes$1 1. Parameter ...$# Anzahl der Parameter
Einfache Funktionslibrary$ . library
sleep & ps kill echoFunktion aus externer Datei starten und diese aus der Prozessliste entfernen
Schalter
- schaltet die Schalter ein + schaltet die Schalter ausAlternativ können Schalter beim Start der Shell übergeben werden$ bash -x ./script.sh#!/bin/bash -x$ set [-|+] Schalter ...val1 val2 Setzt Parameter 1 auf val1, Parameter 2 auf val2a Alle Variablen werden bei Wertzuweisung automatisch
exportiert.e Bei Fehler Verarbeitung beendenf Dateinamenexpandierung der Shell ausschaltenn Befehle lesen, aber nicht ausführen (Syntaxcheck)p Ignoriere ENV BASH_ENV Funktionen SHELLOPTSP Folge nicht symbolischen Linkss Positionalparameter alphabetisch sortierenu Ungesetzte Parameter als Fehler betrachtenv Verbose gibt die jeweilige Zeile auf StdOut ausx Debugging (PS4)
set a e f u for xAngegebene Schalter bezüglich ihres Verhaltens testen
Verarbeitungsfolge der bash
• {} Expansion• ~ Expansion• Parameter Expansion• Variablen Expansion• Arithmetische
Expansion• Kommando
Substitution
• Word splitting• Pathname Expansion• Redirection• Alias oder Funktion – je
nach Laune (Aliase im Script nur durch Setzen von expand_aliases durch shopt)
• Befehle aus $PATH
Generell von links nach rechts
";" ist wie ein Return zu betrachten
Debugging
Möglichkeiten zum Start des Debugging• Beim Start der Shellbash -x script
• Durch set -x innerhalb des Shellscriptesset -xecho hans # Debugging ist hier einset +x
Effektiverer Prompt beim Debuggen – das erste Zeichen wird je nach Hierarchie mehrfach ausgegeben (angeblich).export PS4='>$0/$FUNCNAME $LINENO: '
` echo $Testscript debuggen
bash debugger
Durch bash-doc bei Debian unter /usr/share/doc/bash/examples/bash$ bashdb filenameStopped at line 3./test.sh:3 >echo Hallo `whoami`bashdb> nHallo arltStopped at line 4./test.sh:4 >declare -i i=0break [N] setzt Breakpoint für Zeile N oder zeigt alledelete [N] löscht Breakpoint für Zeile N oder allecondition foo setzt Breakbedingungcondition löscht Breakbedingungenprint expr Anzeige von Variablennext [N] nächste [N] Befehlszeile[n]continue bis zum nächsten Breakpoint weiterarbeitenlist [N] zeigt 5 Zeilen Quellcode ab Zeile [N]h Help
Abbruchsteuerung
Durch set -e kann im Shellscript entschieden werden, dass bei Fehler abgebrochen werden soll.$ set +e$ ls nichtda$ set -e$ ls nichtda$ echo Endenichtda not foundnichtda not found
Performance-betrachtungen
• Shellinterne Befehle sind oft schneller als der Start externer Befehle
• Dateinamen-expandierung ist bei vielen Treffern "langsam"
• find• xargs oder• Ausführungszeichen
• Schleifen• analysieren
Die Shell ist prinzipiell für die meisten Anwendungen gut geeignet, wenn man ein paar grundsätzliche Dinge nicht außer Acht lässt.• Pipe
• Schnell, (keine temporären Daten)
• Returncode des letzten Befehls → ${PIPESTATUS[*]}
find xargs `` rmZwei Varianten um eine Liste von Dateien zu löschen
Die wichtigsten Shellvariablen
Bash Shell Variablen (Auszug)
EUID Effektive UseridFUNCNAME Name der FunktionHISTFILE Dateiname der HistoryHISTFILESIZE Größe der HistoryHISTIGNORE Wird für History ignoriertHISTSIZE Anzahl Befehle ...LANG Sprache komplettLC_ALL Globale LC-VariableLC_xxx Spezielle LC-VariableLINENO Aktuelle ScriptzeilePIPESTATUS Returncode bei PipesPS3 Select PromptPS4 Debug PromptPWD ArbeitsverzeichnisRANDOM ZufallszahlTMOUT Sekunden bis zum LogoutUID Reale Userid
Bourne Shell Variablen (komplett)
CDPATH SuchpfadlisteHOME Users homeIFS Input field separatorMAIL MailfileMAILPATH Mehrere MailfilesOPTARG Letzter Wert von getoptsOPTIND Letzter Index von getoptsPATH SuchpfadPS1 Primärer PromptPS2 Sekundärer Prompt
CDPATH HISTIGNOREPIPESTATUSVerwendung testen
Sicherheitsbetrachtungen
• Ablauf unter einer anderen Identität• sudo -u user -H script # NOPASSWD:
Shellvariablen beeinflussen das Laufzeitverhalten z. B. IFS PATH LD_* - darum kümmert sich jedoch sudo.
• Einfluss auf das Environment eines Scriptes• env -i # leeres Environment• bash -p # Sonstiges
• Temporäre Dateien• datei=`mktemp`
• Mit welchen Rechten werden Dateien erzeugt?• 666 | umask = Datei• 777 | umask = Ordner
Rechnerübergreifend arbeiten
Unix → Unix (ungesichert)$ rcp datei [user@]rechner:pfad # .rhosts$ rsh [user@]rechner befehl
Unix → Unix (gesichert)$ scp datei [user@]rechner:pfad # ssh-keygen$ ssh [user@]rechner befehl # oder .shosts
Unix → Windows (halbgesichert) - setzt Samba bzw. Teile aus Samba voraus$ man smbclient$ man smbmount
Archive und Kompressoren
Packen von Daten: gzip und bzip2$ gzip -9 datei # Packt → datei.gz (max.)$ bzip2 datei.bz2 # Entpackt bzip2-Datei
Erzeugen und extrahieren von Archiven: tar$ tar cvf txt-archiv.tar *.txt # Erzeugt$ tar xvf txt-archiv.tar # Entpackt
Kombination von tar und Kompressoren$ tar czf mein.tar.gz * # Archiv mit gzip$ tar cjf mein.tar.bz2 * # Archiv mit bzip2$ tar xjf mein.tar.bz2 # Entpackt Archiv
Alternative unter Windows und Linux: http://www.7-zip.org
Unterschiede sh/ksh/zsh/bash
• Funktionsumfang• $0 innerhalb von Funktionen → bei der bash:
$FUNCNAME• Standardverhalten bei leeren Veriablen:set +u
• echo mit Zeilenumbrüchen (-e bei der bash)echo -e "Hallo!\n\nAnbei..."
• Subshell bei Pipe → Gültigkeit der Variablenecho hans | while read namedo liste="$liste $name" # in Subshell!doneecho $liste $name # leer...
Empfehlung
• Verständnis für die Arbeitsweise der Shell• Regelmäßiges Arbeiten mit der bash• Lesen der weiteren Möglichkeiten (man)• Sinn der Bash (wie auch jeder anderen
Programmiersprache) in der jeweiligen Situation hinterfragen