shell in unix
von Jürg Oehler, im August 2001 n.Chr


einführung

alternativ dazu gibt es graphische benutzerinterfaces wie kde, gnome. diese greifen jedoch auch auf shell- funktionalitäten zurück. die shell wird insbesondere zum aufstarten der graphischen umgebung (xinit) und zum aufstarten von programmen verwendet.
  • im wesentlichen werden in der shell programmumgebungen zur laufzeit aufgebaut, was die flexibilität von unix ausmacht. die shell ermöglicht das aufstarten von mehreren programmen gleichzeitig, wobei die programme miteinander über systempipes kommunizieren können. dazu wird die streams philosophie von unix genutzt..
  • die shell ist für korrekte verarbeitung der signale (signalhandling) der einzelnen programme verantwortlich. stirbt ein programm in der kette, so muss die shell die anderen prozesse in dieser kette korrekt beenden.
  • die rückgabewerte der einzelnen prozesse müssen an den ursprungsprozess zurückgegeben werden.
  • prozesse können im vordergrund oder hintergrund laufen. über die shell können solche parameter direkt beeinflusst werden.
  • zur steigerung der effizienz des betriebssystems gibt es verschiedene mechanismen in der shell wie zum beispiel der programmcache. doch vorsicht, in speziellen situationen kann diese funtkion auch seine tücken haben.
  • in den unterschiedlichen shells gibt es verschiedene eingabe funktionen. die funktionen unterstützen jedoch meist die interaktiven aufgaben. es handelt sich hierbei um history, dateisuche (tab-substitution) und anderes. allerdings werden solche spezialitäten mit allerhand nachteilen erkauft.
    • durch die zahlreichen funktionen werden wesentlich mehr resourcen (rechenzeit und speicher) nötig.
    • das aufstarten der programme ist langsamer und vorallem ineffizienter.
    • die scripts sind nicht portable, das heisst, sie können nicht auf andere unixsysteme übernommen werden.
    • diese shells sind meist dynamisch gelinkt. dynamisch gelinkte shells sind zum reparieren von defekten systemen nicht geeignet, da sie in extremen situationen auch nicht mehr lauffähig sind. deshalb sollten als root shell immer statisch gelinkte shells verwendet werden (passwd).
  • standardmässig werden parameter auf metazeichen (*, ?, [....]) und steuerzeichen (&, &&, |, ||, >, >>, <, <<, (), {}, ;) untersucht und falls nötig substituiert, bevor das programm aufgerufen wird.
  • die meisten shells erlauben das definieren und aufrufen von funktionen.
  • hält programmumgebung (environment):
    • $HOME
    • $LOGNAME, $USER
    • $PATH
    • $CDPATH
    • $PS1, $PS2
    • $IFS
    • $HOME
    • $MAIL
    • $MAILCHECK
    • $MAILPATH
    • $SHELL
    • $SHACCT
    • $TZ

Kommandos / Programme

zur steuerung eines mulituser betriebssystems werden verschiedene programme verwendet. die programme befinden sich in /bin, /sbin, /usr/bin oder /usr/sbin. nachstehend sind die wichtigsten commandos nach themen aufgelistet. die meisten programme sind auf den standardmässigen unixderivaten verfügbar, womit shellscripts mit diesen funktionen auf den meisten systemen ohne grosse änderungen lauffähig sind. die tabellen vermitteln nur einen überblick. die korrekte anwendung muss auf jedem system verifiziert werden. dazu dienen die unix hilfeseiten (manual pages: versuche <man ls>).

System-Info

date zeigt das aktuelle systemdatum an. als root kann damit die systemuhr auch richtig gestellt werden.
logname, id zeigt die identiät des benutzers an. logname ist der verwendete login name und id zeigt die aktuelle identiät an.
hostname zeigt den aktuellen namen des komputers am ersten netzwerkinterface an.
echo (internes) shellkommando zum anzeigen von informationen auf stdout. die funktion löst auch umgebungsvariablen auf (<echo $HOME>)
stty zeigt die einstellungen der seriellen zugänge. als root können die einstellungen auch verändert werden.
who zeigt wer auf dem system arbeitet. auf at&t systemen kann auch der runlevel (-r) und die bootzeit -b sichtbar gemacht werden.
ps zeigt die prozesse an
set zeigt die programmumgebung an. die programmumgebung kann aber mit der funktion auch angepasst werden. zu der programmumgebung gehören variablen und funktionen.
iostat im unixkernel werden an allen zentralen orten zähler nachgeführt. mit iostat können diese zähler abgefragt und in form von statistiken ausgegeben werden. es werden sämtliche knotenpunkte für ein und ausgabe erfasst. im linux fehlte die funktion bis anhin. sie ist neu im sarpaket enthalten.
vmstat statistik des virtuellen speichers
netstat statistik des netzwerkverkehrs
finger finger ist ein bsd (berkley) kommando und zeigt etwas mehr informationen über den benutzer als  who. finger ist auch netzwerkfähig und sollte nur dann aktiviert werden, wenn die sicherheitsfragen geklärt sind.
type, whereis suchen ausführbare programme im PATH
uptime zeigt seit wann der komputer läuft und vermittelt anhaltspunkte über die auslastung.

Dateisystem (filesystem)

filesystem

mkfs legt filesysteme auf rawdevices an. das kommando legt auch dort neue dateisysteme an, wo bereits solche vorhanden sind. ist ein dateisystem bereits am system angehängt (gemountet), kann die operation nicht ausgeführt werden.
labelit damit können softpartitions bezeichnet werden.
fsch filesystemcheck: überprüft das dateisystem. das kommando wird nach systemabstürzen oder gelegentlich auch nach dem einsatz des staubsauger's nützlich.
du zeigt die platzbelegung (in blocks a 512bytes) für die einzelnen verzeichnisse/dateien an.
df zeigt die freien blöcke a 512bytes für die einzelnen dateisysteme an.
mount zeigt angehängte dateisysteme im betriebssystem. als root können neue dateisystem eingehängt oder herausgelöst werden.
sync unix arbeitet nie direkt auf den harddisks. die zu sichernden daten werden in einem cash speicher gesammelt und miteinander auf die entsprechenden devices geschrieben. mit sync wird dieser vorgang erzwungen.
mkdir legt neue verzeichnisse im dateisystem an.
rmdir löscht die verzeichnisse gnadenlos, sofern die entsprechenden berechtigungen vorhanden sind.
file programm, welches versucht, den dateiinhalt zu ermittel. siehe auch (magic)
ls zeigt den inhalt eines verzeichnisses an.
pwd zeigt den standort im dateibaum absolut an.
find findet dateien mit bestimmten eigenschaften im dateibaum.
cd change directory: erlaubt den standort im dateibaum zu wechseln.

datei - manipulation

touch setzt den zugriffszeitpunkt einer datei auf die aktuelle zeit. kann aber noch mehr
chmod verändert die zugriffsberechtiungen der dateien oder verzeichnisse
chown verändert den eigentümer der dateien oder verzeichnisse
ln erstellt hard und soft links. links sind lediglich neue namen zu einem i-node. hinter jeder i-node verwaltet das system eine datei. innerhalb des dateisystems ist die i-node eindeutig. das system arbeitet immer ohne namen. die dateinamen sind nur für uns menschen vorhanden.
rm löscht dateien oder verzeichnisse. rm wird verzeichnisse mit inhalt nicht löschen wie dies rmdir macht.
mv verschiebt dateien im dateisystem, falls dateien über das dateisystem hinaus verschoben werden, muss kopiert und gelöscht werden.
cp kopiert dateien.
ed, vi (emacs, joe, vim, nvi...) ascii datei editoren können dateiinhalte verändern und zurückschreiben
sed streameditor: ascii editor, welcher gemäss commandos ascii dateien nicht interaktiv durchführt. (im batchmode)

datei - ausgabe

grep, egrep, fgrep sucht nach zeichenketten in dateien
cat, split zusammenhängen oder aufsplitten von dateien. cat wird auch zum anzeigen von dateiinhalten verwendet. allerding sind pager dazu geeigneter.
head, tail zeigt dateianfänge oder dateienden an.
more, pg (less) sind sogenannte pagers. sie geben den inhalt von (ascii) dateien zeilen- oder seitenweise aus. blättern wie auch suchen von text wird meist erlaubt. am effizientesten ist more. dafür kann nicht zurückgeblättert werden.
sum rechnet quersummen von datei inhalten
wc word count, zählt buchstaben, worte und zeilen in dateien.

sicherungsmechanismen

mt manpulating tapes, damit können scsi-bänder gesteuert werden
dump schreibt den inhalt von dateisystemen auf einen stream, idealerweise ein sicherungsmedium. es könnte aber auch eine datei oder gar ein raw-device sein.
restore umkehrfunktion von dump. damit können die gesicherten daten bei notwendigkeit in das dateisystem eingespiesen werden.
tar, cpio, pax archivfunktionen: die archiv funktionen schreiben die datei inhalte mit verzeichnis auf einen stream. diese funktionen sind viel weniger effizient als dump. dafür sind diese archive über jahrzehnte lesbar.
dd diskdump: liest datenstreams (rawdevices) und schreibt sie auf datenstreams. dazwischen können auch umfangreiche konvertierungen vorgenommen werden. dd ist gegeignet, um disks zu klonen.

Diverse Kommandos

mknod legt spezielle i-nodes in dateibäumen an. über solche i-nodes können dann die treiber auf die devices im system zugreifen.
hash damit kann bei einigen shells der hashbuffer manipuliert werden.
kill damit können über signale prozesse beeinflusst werden. unter anderem können damit auch prozesse aus dem system entfernt werden.
write, wall scheibt eine meldung an einen anderen benutzer. wall schreibt die meldung allen eingeloggten benutzern
login autorisiert die benutzer. normalerweise wird login von getty aufgerufen. man kann das programm aber auch direkt von der shell verwenden. 
talk damit können 2 benutzer miteinander kommunizieren. wird vorallem gebraucht, wenn das modem die telefonleitung besetzt. beide benutzer können asynchron schreiben und lesen.
su superuser: das programm erlaubt das wechseln der identität. nur root muss die passworte nicht eingeben. alle andern müssen das entsprechende systempasswort wissen.
at, crontab at führt einen befehl zu einem vorgegebenen zeitpunkt aus. zum beispiel geburtstags erinnerungen der personalabteilung senden.
crontab ist ein scheduler. es führt funktionen regelmässig aus.
newgrp damit kann ich die benutzergruppe wechseln. möglicherweise gibt es auch ein gruppenpasswort.
script protokolliert die sitzung in einer datei
mail / mailx einfaches mail frontend zum sendmail. mailx ist die neue version von mail. mail ist ein ascii frontend und damint nicht mime-fähig.
man, catman, whatis, apropos, mandb.. umfangreiches hilfesystem
bc, dc desctop calculators, alte programme als taschenrechner für ascii terminals
basename, dirname die programme schneiden den entsprechenden teil aus einem dateinamen heraus.
expr wertet expressions aus. dies können auch rechnungen sein, womit sich zähler nachführen lassen. dies ist aber eine umständliche lösung.
eval auswerten von variablen in kommandoaufrufen und übergabe an die shell.
getopt analysiert die parameter vom aufruf und gibt die parameter mit den zusätzen zurück. nicht erlaubte parameter werden als fehlerhaft erkannt.
nohup hängt den prozess am scheduler direkt an, womit der prozess nicht mehr von der login shell abhängt. es kann problemlos ausgeloggt werden.
read einlesen von daten vom stdin
sleep der prozess wartet für x sekunden
tee die stdout wird zusätzlich auf einen anderen stream ausgegeben.
test testfunktion
time, timex die funktionen nehmen die ausführungszeiten für ein programm und geben die werte anschliessend auf stdout aus.
wait wir warten auf die beendigung eines prozesses
diff vergleicht zwei dateien und gibt die unterschiede aus.
crypt verschlüeelungsfunktion
join dateien werden zeilenweise zusammengehängt
sort sortiert die dateien nach bestimmten kriterien. die definition der sortierelemente ist anspruchsvoll.
cut schneidet felder oder zeichenstücke zeilenweise aus einem stream aus und gibt sie auf stdout aus.
unique entdeckt doppelte einträge in einem zeichenstrom und gibt sie einfach aus.
tr translate: entdeck zeichenkettten und ersetzt sie durch andere werte.
od octal dump: gibt datendateien in hexadezimaler, charakter oder binärer form aus.

 

einige fragen zum lösen

 
welchen runlevel haben wir?
seit wann läuft das system?
wie hoch ist die systemauslastung?
wozu wird das system verwendet?
wer bin ich?
was mache ich?
wer arbeitet am system?
was wissen wir vom benutzer x?
was läuft am netz?
läuft der prozess mit dem backup noch?
haben wir noch diskplatz?
wo wurde der diskplatz verbraucht?
welches sind dateien grösser als 1mb?
welches sind dateien älter als 90 tage?
von welchem typ ist die datei x?

 
 

was ist ein programm?

 
programme werden oft in den zusammenhang mit "binaries" gebracht. ein programm ist im grunde nichts anderes, als ein abfolge von instruktionen an den prozessor - in maschinensprache. da der mensch nicht so ideale voraussetzungen für das binäre mitbringt, werden immer übersetzer zwischen mensch und prozessor geschaltet. diese übersetzer werden meist als kompiler oder interpreter gebaut. die shell ist ein interpreter: sie interpretiert shell-code und übersetzt die bedeutung in maschinensprache. anschliessend übergibt sie das zeugs dem prozessor. die übersetzung findet laufend und wiederholend statt, was natürlich ineffizient ist. deshalb gibt es andere übersetzer welche die übersetzung einmal vornehmen und das binäre ergebnis in eine datei abspeichern - und das wird dann als "binary" bezeichnet. diese übersetzter sind landläufig als compiler bekannt.
auf unix systemen wird mit einem "magic string" am anfang der datei festgestellt, um welchen inhalt es sich handelt. die kennzeichnung ist aber nur für binaries obligatorisch. name oder endung der datei sind unwichtig. im weiteren muss die datei als ausführbar markiert sein, falls das system das programm vom system direkt ausgeführt werden soll. das system muss die datei auch finden. dazu wird die datei absolut aufgerufen, oder das system (shell) findet sie über den PATH.

 
 

welche programmierregeln sollten beachtet werden?

 
bitte besonderes augenmerk auf das WAS richten.
das WIE wird anschliessend wichtig. definiere ablauf und wiederholende aufgaben.
wähle das richtige werkzeug
ein programm macht wenig, aber gut.
KISS "keep it simple und stupid", es wird dann schon schwierig genug.
programmiere lesbar und übersichtlich - kommentiere
programmiere defensiv - frage fehler ab, mache meldung, und verhalte dich richtig
verwende stdin, stdout, stderr

welche funktionen stehen zur verfügung?

 
if
then
else
fi
test verzweigung
case
in
esac
fall unterscheidung, verzweigung wenn bestimmte variablen entsprechende werte aufweisen
while
do
done
eine schlaufe, welche durchlaufen wird bis ein test positiv ausfällt
for
do
done
eine schlaufe, mit initialiserten zählern

 

und wann fangen wir an?