FreeBSD Manual Pages
BSH(1L) Schily's USER COMMANDS BSH(1L) NAME bsh - ein Kommando-Interpreter mit Bildschirmeditor und History. SYNOPSIS bsh [ optionen ] [ arg1 ... argn ] Liest Kommandos aus dem File arg1. Wenn keine Argumente angegeben sind, liest er Kommandos von stdin. OPTIONEN -i Erzwingt interaktiven Prompt. -v Startet mit eingeschaltetem Verbose-Mode. -c Fhrt arg1 als Kommando mit arg2-n als Argumenten aus. -e Bricht ab wenn ein nichtinteraktives Kommando milingt. -n Liest die Kommandos, fhrt sie aber nicht aus. -s Fhrt Kommandos von stdin aus, auch wenn Argumente angegeben wur- den. -t Liest ein Kommando und fhrt es aus. -2 Liest nicht das ~/.init2 File. Auch wahr, wenn -c gesetzt und name == command. -h Liest/Schreibt nicht das ~/.history File. -g Liest/Schreibt nicht das ~/.globals File. -l Liest/Schreibt nicht das ~/.locals File. -f (fast) Entspricht -2h. -F (extra fast) Entspricht -2hgl. -o Bei einem exec werden offene Files nicht geschlossen. BESCHREIBUNG bsh ist ein Kommandointerpreter, der anstelle von sh oder csh verwendet werden kann. Seine Vorteile gegenber den beiden anderen Shells sind der Bildschirmeditor fr die Kommandozeile und der in diesem Editor integri- erte History-Mechanismus. Initialisierung Wenn der bsh durch ein Login gestartet wird, (das erkennt er daran, dass sein argv[0] mit einem '-' beginnt) dann liest er zunchst die Datei /etc/initbsh und fhrt die darin enthaltenen Kommandos aus. - Das kann auf System V dazu benutzt werden um z.B. die Environment-Variable TZ zu setzen. Wenn in av[0] ein 'r' enthalten ist (rbsh), dann folgt nach der Inter- pretation der Anweisungen aus der Datei /etc/initbsh die Ausfhrung der Kommandos aus /etc/initrbsh. Das kann z.B. dazu benutzt werden, weiter unten beschriebene mgliche Restriktionen zu aktivieren. Da das Verze- ichnis /etc/ normalerweise nur durch den Superuser schreibbar ist, kann ein so eingeschrnkter Benutzer nicht durch einfaches Lschen seiner ~/.init Datei diese Beschrnkungen wieder unwirksam machen. Nach der Interpretation der obengenannten Dateien werden die Kommandos aus der Datei ~/.init ausgefhrt. In dieser Datei kann der Benutzer pri- vate, immer ntige Anweisungen platzieren, wie z.B. das Einstellen des Prompts auf einen gegenber dem Standardprompt bevorzugten Wert oder Terminalinitialisierung. Jeder weitere Kommandointerpreter (nicht der Loginshell aber auch das in den bsh eingebaute suid Kommando), der vom Benutzer gestartet wird, fhrt whrend seiner Initialisierung die Datei ~/.init2 (falls vorhanden) aus. Wenn der bsh gestartet wird, liest er kurz vor dem ersten interaktiven Prompt das File /etc/termcap oder die Environmentvariable TERMCAP, um ein Standardmapping fr die Cursortasten zu bekommen. Es ist mglich, zustzlich zu den Standardeintrgen ku, kd, kr und kl fr Key-up, Key- down, Key-right und Key-left in /etc/termcap die Eintrge kB und kE einzufhren, falls das Terminal die Cursortasten Zeilenanfang bzw. Zeilenende hat. Der Loginshell fhrt, bevor er durch die Kommandos logout oder exit beendet wird, die Datei ~/.final aus. Auerdem liest jeder bsh noch folgende Dateien, wenn er gestartet wird: ~/.bshmap Datei mit Maps fr den Editor. ~/.globals Datei mit globalen Abkrzungen. .locals Datei mit lokalen Abkrzungen. (Siehe auch cd - Kom- mando.) Der bsh liest seine Initialisierungsdateien in folgender Reihenfolge und zu folgenden Zeiten: /etc/passwd falls es beim Starten des bsh keine Environment- Variable HOME gibt. ~/.globals Immer falls vorhanden. .locals Immer falls vorhanden. /etc/initbsh Nur Loginshell. /etc/initrbsh Nur Loginshell, wenn restricted. ~/.init Nur Loginshell. ~/.init2 Jeder nicht Loginshell. ~/.history Jeder interaktive bsh. /etc/termcap Jeder interaktive bsh kurz nach dem ersten Prompt, wenn sich der extrahierte TERMCAP Eintrag noch nicht im Environment befindet. Wenn die Variable TERM auf einen anderen Eintrag verweist als die Variable TERMCAP, dann wird auch das File /etc/termcap gelesen. ~/.bshmap Nach der Initialisierung der Cursormappings. Bedienung, Kommandoeingabe Eingabezeilen knnen mit folgenden Kommandos bzw. Kommandosequenzen editiert werden: ^H ein Zeichen nach links ^F ein Zeichen nach rechts ^D das Zeichen unter dem Textzeiger lschen DEL das Zeichen links vom Textzeiger lschen ^U ganze Zeile lschen ^L ganzen Bildschirm lschen ESC ^H ein Wort nach links ESC ^F ein Wort nach rechts ESC ^D das Wort rechts vom Textzeiger lschen ESC DEL das Wort links vom Textzeiger lschen Innerhalb der History kann man sich mit folgenden Kommandosequenzen be- wegen (nheres ber die History unter Punkt Eingebaute Kommandos ): ^P vorhergehende Zeile ^N nachfolgende Zeile ESC ^P rckwrts nach Zeile suchen ESC ^N vorwrts nach Zeile suchen ESC CR zurck zur Zeile vor dem letzten Suchkommando Jedes andere Zeichen wird in den vorhandenen Text eingeschoben. Die Tabulator-Taste erzeugt ein ^I. Sollen in der Eingabe Zeichen er- scheinen, die Editierungsfunktion haben, so mssen sie gequotet werden, dazu muss zuerst '^^' und dann das Zeichen, das in der Eingabezeile er- scheinen soll, eingegeben werden; es wird dann nicht interpretiert. Eine Zeile wird durch die Tasten CR oder LF beendet. Hierbei ist die Stellung des Textzeigers innerhalb der Zeile unerheblich. Editierungsmapping Bei der Initialisierung des bsh wird das File ~/.bshmap gelesen, in dem sich Editierungsmaps fr den bsh befinden. Es lsst sich fast alles ummappen. Wird ein Match festgestellt, so erfolgt eine textuelle Erset- zung direkt in die Eingabezeile. Es ist mglich, das Mapping fr den nch- sten Buchstaben mit Hilfe eines Quotebuchstabens aufzuheben. Dieser Quotebuchstabe ist standartmig auf NULL (Control @) gesetzt, und lsst sich ndern (z.Zt. noch nicht implementiert). Das File ~/.bshmap hat folgenden Aufbau: mapstr:textersatz:Kommentar mapstr ist dabei der String, der ersetzt werden soll. textersatz ist der String, der in der Eingabezeile erscheint. Kommentar ist ein op- tionaler Kommentar, der nicht beachtet wird. mapstr darf maximal 16 Zeichen lang sein, der textersatz darf maximal 128 Zeichen lang sein. Jeder Eintrag muss auf genau einer Textzeile stehen. Kontrollzeichen knnen wie in /etc/termcap durch eine Ersatzdarstellung eingetragen werden: Ein '^' vor einem Buchstaben bedeutet, dass das entsprechende Kontrol- lzeichen gemeint ist. Das Zeichen ESCAPE lsst sich durch '\E' darstellen. Diese beiden ebengenannten Escapezeichen lassen sich durch '\^' bzw. '\\' erzeugen. Es ist auerdem mglich die in C bekannte Oktal- darstellung zu verwenden. Nur mit der Oktaldarstellung ist es mglich, einen Doppelpunkt zu erzeugen in dem man \072 eintrgt. Weiterhin stehen fr: \t ^I Horizontaltabulator \v ^K Vertikaltabulator \b ^H Backspace \r ^M Wagenrcklauf \n ^J Zeilenvorschub \f ^L Seitenvorschub Das File ~/.bshmap, knnte folgendermaen aussehen. \Ep:\E^P^U:Search up and clear buf \En:\E^P^U:Search down and clear buf Das Standardmapping wird aus /etc/termcap gewonnen. Lexikalische Struktur Der bsh teilt Zeilen in Worte an den Stellen, wo Leerzeichen, Tabs oder die besonderen Buchstaben '&' , '|' , ';' , '<' , '>' , '(' und ')', sowie die Buchstabenpaare '&&' , '||' , '<<' oder '>>' stehen. Die besondere Bedeutung dieser Buchstaben lsst sich durch Voranstellen eines '\' verhindern. Ein '\', das direkt von einem Newline gefolgt wird, wird durch ein Blank ersetzt, falls es nicht in einem mit ''' gequoteten String erscheint. Strings, die in Paare von ''' oder '"' eingeschlossen sind, formen Worte. Werden die Strings in Paare von '"' eingeschlossen, dann erfolgt in diesen Strings eventuell eine textuelle Ersetzung von Abkrzungen oder Environment-Variablen. Eine textuelle Ersetzung lsst sich auch in diesem Falle durch Voranstellen eines '\' verhindern. In Strings, die durch Einschlieen in ''' gebildet werden, wird nichts ersetzt und der Buchstabe '\' hat keine besondere Wirkung, es sei denn, er steht vor einem Newline oder einem '''. Damit ist es mglich, diese Buchstaben in einen String einzugeben. In beiden Fllen erfolgt jedoch in diesen Strings keine Expansion von speziellen Pattern-Matching Buchstaben ber das File-System. Der Buchstabe '#' hat eine besondere Bedeutung, wenn er am Anfang einer Zeile steht (siehe '#' - Kommandos). Innerhalb von Kommando-Files leitet er eine Kommentarzeile ein, wenn direkt hinter ihm ein Blank, ein Tab oder ein Newline steht. Ein einfaches Kommando ist eine Sequenz von Worten, von denen das erste Wort der Kommando-Name des auszufhrenden Kommandos ist. Ein einfaches Kommando oder eine Sequenz von einfachen Kommandos, durch ein '|' getrennt, ergeben eine Pipeline. Der Output eines jeden Pro- gramms wird in den Input des folgenden geleitet. Sequenzen von Pipelines knnen durch ';' oder '&' getrennt werden. Steht hinter einer Pipeline ein '&', wird auf diese Pipeline nicht gewartet. Jedes dieser oben beschriebenen Kommandos oder Kommandosequenzen kann in Paare von '(' und ')' gepackt werden, um so ein einfaches Kommando zu erzeugen. Es ist auch mglich, einzelne Kommandos einer Pipeline durch '&&' oder '||' zu trennen. Dabei wird wie in der Programmier- sprache c das zweite bzw. folgende Kommando nur dann ausgefhrt, wenn das Erste bzw. Vorangehende gelang oder scheiterte. Auch hier knnen durch Verwendung von '(' und ')' Gruppen gebildet werden. Beispiele: Joerg> cd cmd/bsh && make bsh ... make bsh wird nur ausgefhrt, wenn das 'cd' - Kommando geglckt ist. Joerg> make bsh || echo bullshit ... Das echo Kommando wird nur dann ausgefhrt, wenn das make Kom- mando scheitert. Joerg> (make bsh && echo ok) || echo bullshit ... Wenn das make Kommando scheitert, dann wird das zweite echo Kom- mando ausgefhrt. Wenn das make Kommando gelingt, dann wird ok ausgegeben. Das ersetzt allerdings keine if then else Struktur, da fr den Fall, dass das Kommando echo ok scheitert, zustzlich bullshit ausgegeben wird, denn der Exitcode der Kommandogruppe in Klammern ist der Exitcode des letzten Kommandos. Jobs und Jobkontrolle Die Funktionalitten fr Jobs und Jobkontrolle sind implementiert, derzeit jedoch nicht dokumentiert. Textuelle Ersetzungen Textuelle Ersetzungen finden auf verschiedenen Ebenen statt. Zunchst durch das Editierungsmapping (direkt in der Kommandozeile sichtbar). Weiterhin durch Abkrzungsmakros aus den ~/.globals und .locals (siehe '#' - Kommandos) sowie durch Ersetzungen ber den Inhalt von Environ- ment-Variablen. Hier ist es wichtig zu wissen, durch welche Trennze- ichen Worte aus der Eingabezeile erkannt werden, die dann auf Expan- sionsmglichkeiten untersucht werden. Trennzeichen fr diese Expansionen sind: " \t\n\\'$~/|&;()><%\"=-" In der letzten Stufe finden textuelle Ersetzungen durch Expansion ber das Filesystem statt. (siehe Pattern-Matching) Pattern-Matching Metabuchstaben sind: ! # % * { } [ ] ? Fr die Expansion gilt folgende zeitliche Reihenfolge und Prferenz: Zuerst whrend des Editierens Editierungsmapping. Vor dem Parsing Lokale und globale Abkrzungen alter- nativ mit Prferenz fr die lokalen Abkrzungen. Noch vor dem Parsing z.Zt. !!! '$' - Variablen. Vom Interpreter (direkt vor der Ausfhrung des Programms) Expansionen ber das File-System. Alle diese Ersetzungen lassen sich durch das Voranstellen eines '\' vor den entsprechenden Identifier verhindern. Input/Output Jeder Prozess hat drei Files, mit denen er standardmig verbunden ist. stdin : Die Standardeingabedatei stdout : Die Standardausgabedatei stderr : Die Standarddiagnostikdatei Diese drei Dateien sind normalerweise dem Terminal zugeordnet. Sie lassen sich jedoch mit folgender Syntax umleiten: < name Die Datei name wird als Eingabedatei erffnet. << delimiter Der bsh liest solange von stdin, bis in einer Zeile delimiter steht. Alles, was bis dahin eingegeben wurde, wird nach Expan- sion ber Environment-Variablen und Abkrzungen (globals und lo- cals) dem Programm als Eingabedatei bergeben. Eine Anwendung sind Commandfiles, in denen eine Eingabe fr ein Programm z.B. fr einen Editor erforderlich ist; man kann dann alles in einem File halten. > name Das File name wird als Ausgabedatei erffnet. Falls es bereits besteht, wird der alte Inhalt verworfen. >> name Das File name wird als Ausgabedatei erffnet. Falls es bereits besteht, wird der kommende Output des Programmes an den bereits bestehenden Inhalt angehngt. % name Das File name wird als Fehlerdatei erffnet. Falls es bereits besteht, wird der alte Inhalt verworfen. %% name Das File name wird als Fehlerdatei erffnet. Falls es bereits besteht, wird der kommende Output des Programmes an den bereits bestehenden Inhalt angehngt. prog1 | prog2 Der Output von prog1 wird in einer Pipeline an den Input von prog2 geleitet. prog1 |% prog2 Der Fehleroutput von prog1 wird in einer Pipeline an den Input von prog2 geleitet. Bei name wird jeweils eine Expansion ber die Abkrzungen und Environ- ment-Variablen vorgenommen. Variablen, Environment-Variablen Im Environment (EV) knnen Variablen gespeichert und abgerufen werden. Der bsh gibt den aktuellen Inhalt seines Environments an die von ihm gestarteten Prozesse weiter. Der Abruf geschieht durch Expansion. Beginnt ein Wort mit '$', so wird innerhalb des EVs nach der entsprechenden Variablen gesucht und das gesamte Wort (einschlielich '$') durch den Wert dieser Variablen er- setzt. Die Expansion der Variablen geschieht zeilenweise. Es ist nicht mglich, innerhalb einer Kommandozeile den Wert einer Variablen zu setzen und ihren Wert danach auszugeben. Konnte das Wort nicht expandiert werden, wird es direkt bernommen. Beispiele: Joerg> set x=hallo Joerg> set PATH=:/bin HOME=: TERM=vterm PROMPT=Joerg> PROMPT2=> HISTORY=0 x=hallo Joerg> echo $x $y hallo $y Joerg> set lalue=test;echo $lalue $lalue Joerg> _ $name liefert den Wert der Variablen name. Folgende Variablen knnen nur gelesen, jedoch nicht explizit gesetzt werden. $0 liefert den Namen des laufenden command-files. $1..$n liefern die aktuellen Argumente eines command-files. $r1 liefert alle Argumente eines command-files (entsprechend argv+1 in c - files). $r3 liefert alle Argumente eines command-files beginnend bei dem dritten Argument (entsprechend argv+3 in c - files). $# liefert die Anzahl der Argumente des aktuellen command-files (Entsprechend argc in c - Argument $0 zhlt mit). $$ liefert die Prozess-ID des gerade laufenden bsh. Beispiele: Joerg> kill $$ name: _ Beendet den laufenden bsh. $! liefert die Prozess-ID des letzten gestarteten Hintergrund- prozesses. Beispiele: Joerg> ps -l $! Gibt den Status des letzten Hintergrundprozesses aus. $? liefert den Rckgabewert der letzten Kommandos. Beispiele: Joerg> test 6 '*' 4 Joerg> echo $? 0 Expansion des Zeichens '~' Das Zeichen '~' wird zu einem Pfadnamen expandiert. Es kann durch einen Benutzernamen gefolgt werden. Ohne Benutzernamen erzeugt es den Pfadna- men der eigenen HOME-Directory aus dem File /etc/passwd, mit Benutzer- namen erzeugt es den Pfadnamen der HOME-Directory des entsprechenden Benutzers. Beispiele: Joerg> pwd /user/joerg Joerg> echo ~ /user/joerg Joerg> echo ~peter /user/peter Joerg> ls ~peter/bin /user/peter/bin: bsh Joerg> ls ~/.. /user: gerd joerg peter reiner Joerg> ls ~/cmd/bsh/doc bsh.doc Joerg> _ Pattern-Matching Es gibt bestimmte Buchstaben, die bei der Expansion von Filenamen, beim Suchen in der History und bei der Ausgabe von '#' Abkrzungen eine besondere Bedeutung haben. Es sind: ! # % * { } [ ] ? Ihre Bedeutung ist : ! ALT Oder im Matching dies!das!jenes * STAR Jede beliebige Anzahl jedes beliebigen Buchstaben. ? ANY Genau ein beliebiges Zeichen. % NIL Genau kein !!! Zeichen. (Muss gequotet werden, damit keine Umlenkung von stderr erfolgt) {} GROUP Fr Vorrang Gruppierung. Kann geschachtelt werden. #c MULT Jede beliebige Anzahl eines bestimmten Zeichens. [] CLASS Umschliet eine Menge von Zeichen. - RANGE Bereich fr Mengen. ^ NOT/BEG Anfang einer Zeile, in [] das Boolsche nicht. \ ESC Escapezeichen fr den Pattern-Matcher. $ END Ende einer Zeile. Beispiele: Joerg> echo bsh.? bsh.c bsh.h Joerg> echo *.bak test.c.bak bsh.c.bak mem.c.bak Joerg> echo test#1 test1 test11 test111 Joerg> echo dies!das dies das Joerg> echo b*.{lint!c} bsh.c bsh.lint btab.c builtin.c Joerg> echo [a-i]*.c abbrev.c abbtab.c builtin.c input.c Joerg> echo ab[0-9].c ab1.c ab2.c ab3.c Joerg> echo [^i]*.c builtin.c mem.c test.c Eingebaute Kommandos $ Siehe fg-Kommando. : Dies ist ein Dummy Kommando. Es ist damit z.B. mglich Files zu erzeugen. Beispiele: Joerg> :>hallo Joerg> echo * hallo test.c Joerg> _ @ name = expr Der Environment-Variablen name wird der Wert des einfachen Aus- drucks expr zugewiesen. Statt '=' ist auch '+=' , '-=' , '/=' , '%=' oder '*=' mglich. Fr expr ist jeder Ausdruck erlaubt, der auch im test-Kommando mglich ist. Beispiele: Joerg> @ count = 1 Joerg> @ count = $count + 1 Joerg> echo $count Joerg> 2 Joerg> _ [ expr ] Synonym fr das test Kommando. Beschreibung siehe test. alias [fromstr] [tostr] Ersatz fr die '#'-Kommandos (noch nicht fertig implementiert). alloc [arg] Dient zum Debuggen der Allozierungs-Routine des bsh. Ohne Argu- mente werden Statistiken ber den allozierten Bereich ausgegeben. Mit einem Argument werden die Adressen und Gren der verwalteten Stcke, sowie der Zustand der Stcke ausgegeben. Dabei werden zer- strte Stcke durch einen Stern hinter der Statusinformation gekennzeichnet. Mit einem 'l' als Argument wird bei jedem Stck zustzlich der lesbare Inhalt ausgegeben, mit einem 'L' als Argu- ment wird bei nicht lesbarem Inhalt eine Ersatzdarstellung gezeigt. bg [job] Schickt den zuletzt gestoppten oder den angegebenen job in den Hintergrund. Dazu wird er wieder gestartet. Der job kann zur Zeit nur durch die Prozessid eines der Prozesse des jobs spezi- fiziert werden. break Bricht eine Schleife ab. Die Interpretation setzt bei dem Kom- mando fort, das nchsten end folgt. Beispiele: Joerg> for i in 1 2 3 4 5 6 > if test $i = 3 > then > echo ende. > break > fi > echo $i > end 1 2 ende. Joerg> _ case Wird fr das switch - Kommando zum Erkennen einer Mglichkeit bentigt. Auerhalb eines switch - Kommandos ist case nicht zulssig. cd [name] chdir [name] cwd [name] ndern der Arbeitsdirectory des bsh zur Directory name. Ist name nicht angegeben, erfolgt ein Wechsel zu der Directory, die in der Environment-Variablen HOME angegeben ist. Existiert die Environment-Variable CDPATH, wird name auch in den entsprechenden Directories aus der Liste in CDPATH gesucht. Er- folgt ein cd zu einer Directory aus der Liste, wird der gesamte Name ausgegeben. Bei jedem cd wird die Liste der lokalen Abkrzungen (./.locals) gegen die aktuelle getauscht. compute Veraltete Intrinsic-Routine des bsh fr die Grundrechenarten auf Integer-Zahlen. Setzt die Variable $? auf das Ergebnis der Berechnung. Da es keine Mglichkeit gibt fehlerhafte Parameter am Returncode zu erkennen wird sie demnchst abgeschafft. Bitte nur noch @ oder test verwenden. concat name val1 ... valn Die Werte der Strings val1 ... valn werden zu einem String in der Variablen name zusammengefasst. Beispiele: Joerg> concat test a b c . $$ Joerg> echo $test abc.5123 Joerg> _ dirs Ausgabe des Directory-Stacks. Die Spitze ist links und stellt die augenblickliche Arbeitsdirectory dar. Die Spitze des Direc- tory-Stacks hat den logischen Offset 0, die direkt rechts danebenstehende Directory den logischen Offset -1. Der logische Offset einer Directory im Stack lsst sich fr das pushd und das popd Kommando gebrauchen. do Das erste Argument des do - Kommandos wird als Kommandozeile aufgefasst und so interpretiert, als wren die weiteren Argumente des do - Kommandos die Argumente av[2] .. av[n] des bsh. Der Ef- fekt ist der gleiche wie bsh -c arg1 .. argn, ohne dass ein neuer Shell gestartet wird. Beispiele: Joerg> do 'echo hallo: $r1' 1 2 3 4 5 hallo: 1 2 3 4 5 Joerg> _ echo [-n|-nnl] [args] Das echo - Kommando hat die gleiche Funktion wie das /bin/echo - Kommando. Da es aber in den bsh eingebaut ist, ist seine Ausfhrungszeit wesentlich krzer (wichtig in command-files). Wird als erstes Argument '-n' oder '-nnl' angegeben, so erfolgt keine Ausgabe eines Newlinecharacters am Ende der Zeile. Werden keine Argumente angegeben, so erfolgt auch keine Ausgabe des Newlinecharacters. Wenn man nur ein Newline ausgeben mchte, dann muss man einen leeren String als Parameter angeben. Wenn keine Argumente angegeben werden, und stdin umgeleitet wird, dann liest echo von stdin und schreibt das Gelesene auf stdout (hnlich wie cat). Wenn das eingebaute echo - Kommando nicht benutzt werden soll, muss man /bin/echo schreiben. Beispiele: Joerg> echo test *.c test program.c t.c zz.c Joerg> echo -nnl huhu;echo .pas huhu.pas Joerg> echo < .EDTMP;echo '' bsh.c Joerg> _ else end Siehe Beschreibung von if , switch , loop und for. err Gleiche Funktion wie echo jedoch erfolgt die Ausgabe auf stderr. errstr errno Der Fehlertext zu der Fehlernummer errno wird ausgegeben. eval XXX exec [ av0=name] command [args] berschreiben des aktuellen Kommandointerpreters mit dem Kommando command. Mit der Option av0=name ist es mglich, dem Kommando einen von seinem Namen abweichendes av[0] zu bergeben. Wird beim Login- shell exec aufgerufen, so bekommt man einen neuen Login-Prompt, wenn das Kommando command beendet ist. Beispiele: Joerg> Joerg2> exec date Tue Aug 6 1985 13:57:52 Joerg> exec av0=- bsh Joerg 2> _ Das letzte Beispiel startet einen bsh, der glaubt, durch einen Login-Prozess entstanden zu sein. exit [Rckgabewert] Beenden eines Kommandointerpreters oder Abbruch einer Kommando- datei. Der Rckgabewert kann durch exit <n> definiert werden. exit ohne Parameter erzeugt einen Rckgabewert von Null. Beispiele: Joerg> bsh Joerg> exit 55 Joerg> echo $? 55 Joerg> _ fg XXX fi fi ist das Ende eines if Kommandos. for name in [Wortliste] Schleife. for i in a b c fhrt alle folgenden Kommandos (bis end) aus. Die Environment-Variable i erhlt fr die drei Schleifendurchlufe jeweils die Werte a, b, und c. Beispiele: Joerg> for i in 1 2 3 > echo $i > end 1 2 3 Joerg> _ function [name] ['cmdlist'] Definition einer Funktion mit Namen name und Body cmdlist. cmdlist sollte bei der Eingabe unbedingt in ''' gesetzt werden. cmdlist kann sich auch ber mehrere Zeilen erstrecken, wenn di- rekt vor dem Ende einer jeden Zeile ein '\' steht (siehe auch quoting). Funktionen knnen rekursiv aufgerufen werden. Der Aufruf erfolgt durch Eingabe des Funktionsnamens. Zur Zeit ist es nicht mglich, Argumente zu bergeben. Eine Funktion kann mit return beendet werden. glob [args] Hat die gleiche Funktion wie echo, nur das die einzelnen Worte in der Ausgabe durch NUL-Bytes getrennt sind. history Ausgabe der letzten ausgefhrten Kommandos (siehe Punkt 4). Er- folgt die Ausgabe auf stdout, werden die Kommandos in geschweiften Klammern ausgegeben, bei einer Pipe oder auf ein File entfallen die geschweiften Klammern. Fr die sptere Verwen- dung mit source -h. Beispiele: Joerg> history { cat *.c } { who am i } { date } Joerg> _ if (expr) if command args XXXX if command args then .... fi if command args else .... fi if command args then .... else .... fi Bedingungsabfrage. Dem if-Kommando muss ein Kommando oder ein einfacher Ausdruck wie in test in () folgen. Ist der Rckgabewert dieses Kommandos gleich Null, wird ein TRUE erkannt, andernfalls ein FALSE. Wurde ein TRUE erkannt, werden die Kommandos zwischen dem nchsten then und dem dazugehrigen else bzw. fi ausgefhrt. Wurde ein FALSE erkannt, werden die Kommandos zwischen else und fi ausgefhrt, falls else vorhanden ist. Achtung: then , else und fi mssen auf einer eigenen Zeile ste- hen. Beispiele: Joerg> if cc -c programm > then > cc -o programm programm.o > echo fertig. > else > echo FEHLER im programm > fi programm.c: linking programm: fertig. Joerg> _ kill [-l] [-sig] pid1 ... pidn Mit kill lassen sich Signale an Prozesse verschicken. Wird keine Signalnummer angegeben, dann wird das Signal SIGTERM (15) geschickt. Es ist jedoch mglich, andere Signale zu spezi- fizieren, indem entweder die Signalnummer mit vorangestelltem '-' oder der symbolische Name des Signals aus signal.h ohne den Prefix SIG benutzt wird. Mit der Option -l ist es mglich, eine Liste der erlaubten Sig- nale zu bekommen. Der bsh verschickt unter 4.2BSD, wenn das angegebene Signal SIGHUP oder SIGTERM ist, zustzlich des Signal SIGCONT, um den betreffenden Prozess aufzuwecken, falls er suspendiert ist. Beispiele: Joerg> kill -l HUP INT QUIT ILL TRAP IOT EMT FPE KILL BUS SEGV SYS PIPE ALRM TERM URG STOP TSTP CONT CHLD TTIN TTOU TINT XCPU XFSZ VTALRM PROF WINCH Joerg> kill -HUP 1 Joerg> kill -9 123 Joerg> kill 817 900 Joerg> _ killpg [-l] [-sig] pgrp1 ... pgrpn Killpg hat die gleich Funktion wie kill, allerdings wird das Signal sig den Prozessgruppen pgrp1 bis pgrpn geschickt. limit XXX login [name] Login ist identisch mit exec /bin/login [name]. login ist nur erlaubt, falls es sich um den Loginshell handelt. Beispiele: Joerg2> login Not login shell. Joerg2> <EOF> Joerg> login hansi Password: logout Beenden des ersten Kommandointerpreters. Beispiele: Joerg2> logout Not login shell. use exit to exit. Joerg2> <EOF> Joerg> logout name: _ loop Endlos-Schleife. Alle folgenden Kommandos (bis end) werden wiederholt ausgefhrt. Ein Verlassen der Schleife ist mit einem break , mit ^C oder mit ^D mglich. Beispiele: Joerg> loop > echo -nnl "sag mal was: " > read cmd > echo soso, $cmd > end sag mal was: hallo soso, hallo sag mal was: huhu soso, huhu sag mal was: ^C 1234: killed Joerg> _ map [fromstr] [tostr] Mit map ist es mglich, beliebige Buchstaben oder Strings des Terminalinputs, bevor sie den Editor des bsh erreichen, umzumap- pen. Damit kann unter anderem eine Anpassung der Cursortasten an die Kommandos des bsh vorgenommen werden. Wenn kein Argument angeben wird, dann wird das aktuelle Mapping ausgegeben. Es wird die unter Punkt 3 erklrte Ersatzdarstellung fr Controlbuchstaben verwendet. Beispiele: Joerg> map ^[[220z^A ^[[222z^E ^[[226z^D ^[[A ^P ^[[B ^N ^[[C ^F ^[[D ^H ^[n ^[^N^U ^[p ^[^P^U Joerg> map abc def Joerg> _ newgrp ndern der Benutzergruppe. Nur bei System V. pgrp XXX popd [-offset] Popd ohne Argumente fhrt ein cd zu der Directory rechts von der augenblicklichen Arbeitsdirectory durch. Es kann aber bei Angabe eines Offsets zu einer anderen Directory aus dem Stack gehen. Bei jedem cd wird die Liste der lokalen Abkrzungen (./.locals) gegen die aktuelle getauscht. pushd [name] pushd [-offset] Wie cd, jedoch bleibt die Arbeitsdirectory auf dem Stack. Anstelle eines Namens kann auch ein Offset im Stack angegeben werden. Bei jedem cd wird die Liste der lokalen Abkrzungen (./.locals) gegen die aktuelle getauscht. pwd Ausgabe der aktuellen Workingdirectory. Arbeitet wie /bin/pwd erkennt aber wiederholte Benutzung in der gleichen Directory und ist dadurch schneller. Auerdem wird die Variable $CWD aktual- isiert. read name Mit der read - Funktion des bsh lassen sich interaktiv Environ- ment-Variablen fllen. Damit lassen sich z.B. command-files schreiben, die, je nach Antwort des Benutzers, unterschiedliche Aktionen ausfhren. Wenn read ein ^D liest, ist in einer Schleife der Effekt der gleiche, als wenn ein break ausgefhrt wurde. Beispiele: Joerg> read cmdline > huhu dies ist eine testeingabe Joerg> echo $cmdline huhu dies ist eine testeingabe Joerg> _ remap Das File ~/.bshmap und der /etc/termcap Eintrag werden neu gele- sen. Das ist z.B. ntig, wenn ~/.bshmap oder /etc/termcap durch Editieren erweitert oder sonstwie gendert wurde, oder die Envi- ronmentvariable TERM gendert wurde. Beispiele: Joerg> ved ~/.bshmap ..... ..... Joerg> remap Joerg> _ repeat [count=# | c=#|-#] [delay=# | d=#] command Das Kommando command wird wiederholt ausgefhrt. Eine Vari- ablensubstitution wird nur einmal durchgefhrt. Wird count nicht angegeben, so ist count = MAXLONG. Wird delay angegeben, ist die Zeit zwischen dem Starten von zwei aufeinander folgenden Komman- dos # Sekunden. Beispiele: Joerg> repeat -5 echo hallo hallo hallo hallo hallo hallo Joerg> _ resume pid resume pid & Setzt die Ausfhrung eines suspendierten Prozesses fort. Der bsh wartet dann auf seine Beendigung. Wenn der bsh nicht warten soll, kann der Prozess mit resume <pid> & gestartet werden. Die Prozess-ID, die dabei ausgegeben wird, ist zu ignorieren. Beispiele: Joerg> ved ..... .... 324: suspended. Joerg> resume 324 ..... ..... Joerg> (sleep 100000;echo fertig) ^Y Joerg> 328: suspended. Joerg> resume 328 & 329 Joerg> _ return [retval] Mit dem return - Kommando knnen Funktionen, die mit function - Kommando definiert wurden, beendet werden. Es ist mglich, ein numerisches Argument zu bergeben. Dieses Argument kann dann ber die Variable $? abgefragt werden. Wird kein Argument angegeben, ist der Return-Wert Null. savehistory Mit dem savehistory - Kommando kann der aktuelle Inhalt der His- tory im File ~/.history gesichert werden. Eine Anwendung ist gegeben, wenn ein bsh gestartet werden soll, der die bisherige History enthlt. Beispiele: Joerg> history set test a Joerg> savehistory Joerg> bsh Joerg 2 > history set test a savehistory Joerg 2 > set [name=val] Setzen einer Environment-Variablen. set x=huhu setzt die Envi- ronment-Variable 'x' auf den Wert 'huhu'. set ohne Parameter gibt den Inhalt des gesamten aktuellen Environment's aus. Beispiele: Joerg> set x=7 Joerg> echo $x 7 Joerg> set x=9 Joerg> echo $x 9 Joerg> _ setenv [name val] Hat zur Zeit die gleiche Funktion wie set. Da jedoch die Anzahl der Variablen, die der bsh verwaltet sehr stark angestiegen ist, und es z.B. fr die Funktionen wnschenswert wre, dass man auch Array-Variablen hat, um z.B. Argumente an Funktionen bergeben zu knnen, muss in absehbarer Zukunft die Expansion von Variablen und damit die Funktion der Kommandos set und unset gendert wer- den. Dabei wird die ursprngliche Funktion von den Kommandos setenv und unsetenv bernommen. Jedoch werden nur bestimmte Vari- ablen auch global bleiben. Lokale Variablen mssen dann mit dem Kommando set bzw. unset behandelt werden. Beispiele: Joerg> setenv x 7 Joerg> echo $x 7 Joerg> setenv x 9 Joerg> echo $x 9 Joerg> _ setmask setmask ownermask groupmask worldmask setmask [+-]{rwxd} [+-]{rwxd} [+-]{rwxd] Mit dem setmask Kommando lsst sich die File-Erzeugungsmaske des bsh verndern oder ansehen. Diese Maske wird immer benutzt, wenn ein Prozess ein File erzeugt. Die aktuelle Maske wird durch lo- gisches Verunden der Maske und den verlangten Modes erzeugt. Die File-Erzeugungsmaske vererbt sich auf die Kinder und ist wichtig fr neu erzeugte Files. + In Verbindung mit r, w, x oder d addiert diesen Mode. - In Verbindung mit r, w, x oder d entfernt diesen Mode. r,w,x,d Ohne + oder - erzeugt nur diesen Mode. = Die Modes bleiben erhalten. . Die Modes werden auf '....' gesetzt. Optionen mssen in der richtigen Reihenfolge angegeben werden. Es muss fr Owner, Group und World ein Modestring angegeben werden. Wenn kein Zugriff erwnscht ist, kann ein '.' angegeben werden, wenn sich ein Mode nicht ndern soll, kann fr diesen Mode ein '=' angegeben werden. Setmask verndert nicht die Modes von ex- istierenden Files. Wird keine Maske angegeben, so wird die aktuelle Maske aus- gegeben. Beispiele: Joerg> setmask rwx r.x r.x Joerg> setmask rwx x -x+w Joerg> setmask rwx ..x rw. shift [n] Mit dem shift Kommando wird, falls shift ohne Argumente aufgerufen wurde, das Argument $1 aus der Argumentliste des ak- tuellen bsh eliminiert. Wird shift mit einem Argument aufgerufen, so werden entsprechen viele Argumente ab dem Argu- ment $1 entfernt. Beispiele: Joerg> echo $r1 a b c d e f g h i j Joerg> shift Joerg> echo $r1 b c d e f g h i j Joerg> shift 3 Joerg> echo $r1 e f g h i j Joerg> shift 10 cannot shift. Joerg> echo $r1 Joerg> _ signal [cmdlist] sig#1...sig#n cmdlist wird ausgefhrt, wenn der bsh auf ein Kind wartet und ein Signal aus der angegebenen Liste erhlt. Das ist z.B. wichtig, um in Commandfiles bei einem Interrupt Files zu lschen, die tem- porr erzeugt wurden. Das Kommando, das in cmdlist angegeben wurde, muss sich in av[1] befinden, d.h. wenn es Zeichen bzw. Wort-Trennzeichen enthlt, muss es in ''' stehen. Wenn cmdlist ausgefhrt wird, gibt es eine Environment-Variable $signo, die die Signalnummer enthlt. cmdlist kann sich ber mehrere Zeilen erstrecken und if then else Strukturen enthalten. Siehe auch function und call. Eine definierte Funktion lsst sich durch: signal '' signalnummer aus der Liste lschen. signal ohne Parameter gibt die Liste der bekannten Signalhandler aus. source name source -h name source -h Mit diesem Kommando kann der bsh veranlasst werden, ein Kommand- ofile zu lesen und auszufhren. Damit lassen sich z.B. Environ- ment-Variablen setzen. Wird die Option -h angegeben, wird das File nur gelesen und in die History getan, aber nicht ausgefhrt. Wird bei Angabe der -h Option der Filename weggelassen, erfolgt die Eingabe ber stdin. Beispiele: Joerg> source -h ~/.history Joerg> _ stop XXX suid suid name Nicht unter UNIX. Vernderung der aktuellen Benutzernummer. su ohne Parameter startet einen bsh mit der effektiven Benutzernummer Null (Admin- istrator). su mit Parameter setzt die reale Benutzernummer auf die des durch den Parameter angegebenen Benutzers. Die Environ- ment-Variable PROMPT wird entsprechend gendert. Das Password des Administrators wird in allen mglichen Fllen als korrekt erkannt. Beispiele: Joerg> su Password: admin> _ Die effektive Benutzernummer ist Null. Joerg> su admin Password: ++admin> exit Joerg> su peter Password: ++peter> _ Die reale Benutzernummer ist Null oder die des Benutzers 'pe- ter'. suspend [pid1 ... pidn] Wenn suspend ohne Parameter aufgerufen wird, dann wird der bsh selbst suspendiert. Mit Parametern werden die Prozesse mit der Prozessids pid1 ... pidn suspendiert. Damit ist es mglich, ein su Kommando zeitweilig zu verlassen und spter ohne Password wieder zu starten. Das geht leider nicht unter SYSTEM V. switch val of Bedingte Mehrfachverzweigung. Der erste Parameter val wird der Reihe nach in einer folgenden Patternliste gesucht (siehe case). Alle Kommandos nach dem ersten erfolgreichen Patternmatch fr den Parameter val werden bis zum Schlsselwort break ausgefhrt. Es gelten die blichen oben erklrten Patternmatch-Regeln. Fr den de- fault - Fall steht ein '*'. Beispiele: Joerg> set x=hallo Joerg> switch $x of > case a* > case b* > echo Erster Buchstabe ist ein A oder ein B > break > case h* > echo Erster Buchstabe ist ein H > break > case * > echo Erster Buchstabe ist nicht A B oder H > end Erster Buchstabe ist ein H Joerg> _ sync Gleicht den Inhalt der Kernel - File - Buffer fr das Filesystem und den realen Inhalt der Platte an. test expr test wertet den Ausdruck expr aus, und weist der Variablen $? einen Wert ungleich Null zu, wenn der Ausdruck expr Falsch ist, sonst Null. Wenn ein Syntaxfehler vorliegt, dann hat die Vari- able $? den Wert -1. Folgende Ausdrcke sind fr expr mglich. Filetests: -r file Wahr, wenn das File existiert, und lesbar ist. -w file Wahr, wenn das File existiert, und beschreibbar ist. -x file Wahr, wenn das File existiert, und ausfhrbar ist. -e file Wahr, wenn das File existiert. -s file Wahr, wenn das File existiert, und eine Gre ungleich Null hat. -S file Die Gre des Files ist der Exitcode. Wenn das File nicht existiert: -1. -d file Wahr, wenn das File existiert, und eine Directory ist. -c file Wahr, wenn das File existiert, und ein character - special ist. -b file Wahr, wenn das File existiert, und ein block - special ist. -f file Wahr, wenn das File existiert, und ein regulres File ist. -h,-L file Wahr, wenn das File existiert, und ein symbolischer Link ist. -p file Wahr, wenn das File existiert, und eine named Pipe (fifo) ist. -C file Wahr, wenn das File existiert, und ein Contiguous File ist. -u file Wahr, wenn das File existiert, und das set-user-id Bit gesetzt ist. -g file Wahr, wenn das File existiert, und das set-group-id Bit gesetzt ist. -k file Wahr, wenn das File existiert, und das sticky Bit gesetzt ist. -t fd Wahr, wenn der Filedescriptor fd im bsh mit einem Ter- minal verbunden ist. -T fd Wahr, wenn der Filedescriptor fd im test Kommando mit einem Terminal verbunden ist. Stringtests: -l string Die Lnge des Strings ist der Exitcode. -n string Wahr, wenn der String eine Lnge ungleich Null hat. -z string Wahr, wenn der String eine Lnge gleich Null hat. s1 = s2 Wahr, wenn s1 und s2 identisch sind. s1 == s2 Wahr, wenn s1 und s2 identisch sind. s1 != s2 Wahr, wenn s1 und s2 nicht identisch sind. Arithmetik: Erlaubte Operatoren auf Ganzzahlen sind: '+' , '-' , '*' , '/' , '%' , '&' , '|' , '&&' , '||' , '-eq' , '-ne' , '>' oder '-gt' , '<' oder '-lt' , '>=' oder '-ge' , '<=' oder '-le' , '>>' , '<<'. Diese Operatoren knnen mit folgenden kombiniert werden: ! Negation. -a Binres und. -o Binres oder. (-a hat Vorrang gegenber -o). -and Logisches und. -or Logisches oder. (-and hat Vorrang gegenber -or). ( expr ) Klammerung zum Gruppieren. Alle Operatoren und Argumente mssen in separaten Argumenten ste- hen. Bei der Verwendung von Operatoren, die die Zeichen '>' , '<' , '%' , '*' , '&' , oder '|' enthalten, sind die Anfhrungszeichen bzw. ein '\' unbedingt anzugeben, um eine Interpretation durch den Parser des bsh zu verhindern. then Siehe if. time Dieses Kommando ist zur Zeit noch nicht fertig implementiert, daher heit es in der aktuellen Version time_ . Geplant ist, das damit eine Anzeige der Werte der Resource-Usage Struktur eines Prozesses angezeigt werden kann. umask [mask] Ohne Argument wird die File-Erzeugungsmaske des bsh angezeigt, mit Argument kann die File-Erzeugungsmaske gesetzt werden. Im Gegensatz zu setmask ist mask hier oktal, wie bei /bin/sh oder /bin/csh . Das Kommando umask ist nur aus Kompatibilittsgrnden implementiert. unalias Geplante Funktion als Ersatz fr ein '#' -Kommando. unmap fromstr Mit dem unmap Kommando lassen sich Maps, die mit dem map Kom- mando gesetzt wurden, wieder aufheben. Da es mglich ist, ver- schiedene Fromstrings in den gleichen Tostring zu mappen, muss, um Eindeutigkeit zu bekommen, der Fromstring als Argument angeben werden. Das ist nur durch Quoten oder durch die Verwen- dung der Ersatzdarstellung mglich, es lsst sich also kein Beispiel zeigen. unset Lscht eine Environment-Variable. Beispiele: Joerg> set test=uu Joerg> set PATH=:/bin:/usr/bin HOME=/ TERM=vterm IGNOREEOF=off PROMPT=Joerg> PROMPT2=> HISTORY=30 test=uu Joerg> unset test Joerg> set PATH=:/bin:/usr/bin HOME=/ TERM=vterm IGNOREEOF=off PROMPT=Joerg> PROMPT2=> HISTORY=30 Joerg> _ unsetenv Siehe setenv. wait wait pid1..pidn Warten auf alle Kinder, die im Hintergrund ausgefhrt werden, oder auf den/die, die sich in der Liste befinden. Das Warten kann mit ^C unterbrochen werden. Beispiele: Joerg> sleep 100000& 518 Joerg> wait 518 Bei dem Versuch, das richtige Kommando zu finden, wird immer zuerst nach eingebauten Funktionen gesucht (siehe Kapitel Eingebaute Kommandos ); dann wird nach Funktionen gesucht, die mit dem function - Kommando definiert wurden. Alle Kommandos, die nicht auf eingebaute Funktionen referenzieren, werden mit execve gestartet und bekommen die Environ- ment-Liste mit, die mit dem set - Kommando abgefragt werden kann. '#' Kommandos Fr alle Kommandos, die mit einem '#' beginnen, muss folgendes beachtet werden.: Sie werden nur erkannt, wenn sie das erste Kommando innerhalb einer Kommandozeile sind. In diesen Kommandos findet keine Expansion statt. Es ist keinerlei I/O Umleitung mglich. Fr alle Kommandos ist eine On- line-Helpfunktion eingebaut, die mit #c -help abgerufen werden kann, wobei c der Name des Kommandos ist. Es gibt eine Gruppe von '#' - Kommandos, die sich auf die Abkrzungsmglichkeiten des bsh beziehen. Bei ihnen ist es mglich, soge- nannte Modifier anzugeben, die das Kommando przisieren oder als Option dienen. Der bsh kennt z.Zt. zwei Tabellen mit Abkrzungen. Solche, die berall gelten (~/.globals) , und solche, die nur in einer bestimmten Directory gelten (.locals). Bei dem Versuch, ein Wort zu expandieren, wird immer zuerst die lokale Tabelle durchsucht. Ist dort keine Abkrzung zu finden, wird versucht, eine globale Abkrzung zu finden. Abkrzungsexpansionen haben Vorrang vor den $ - Expansionen. Es gibt Abkrzungen, die nur am Anfang eines Kommandos stehen drfen (auch nach einem ';' oder einem '&' sowie direkt nach einer '(' , die eine Komman- dogruppe einleitet) und solche, die berall stehen drfen. In absehbarer Zeit werden diese Kommandos mit Ausnahme des #! Kommandos in einen dem csh hnlichen alias Mechanismus gendert. #a[g|l] Name Wert Fgt eine neue Abkrzung zur Tabelle hinzu. Name wird berall auf der Kommandozeile expandiert. Ist kein Modifier angegeben, er- folgt ein Eintrag in die Defaulttabelle. #b[g|l] Name Wert Fgt eine neue Begin-Abkrzung zur Tabelle hinzu. Name wird nur am Anfang eines Kommandos expandiert. Ist kein Modifier angegeben, erfolgt ein Eintrag in die Defaulttabelle. #d[g|l] Name Lscht die Abkrzung Name aus der Tabelle. Ist kein Modifier angegeben, wird aus der Defaulttabelle gelscht. #h #? Ausgabe von Online - help Information ber alle '#' - Kommandos. #l[g|h] [h] [name] Ausgabe aller Abkrzungen aus der Tabelle. Ist kein Modifier angegeben, wird die Defaulttabelle ausgegeben. Ist name angegeben, wird nur der Eintrag fr name ausgegeben. Es ist er- laubt, das in name Wildcards des Pattern-Matchers stehen, um einen Teil der Tabelle auszugeben. Ist der Modifier 'h' angegeben, dann erfolgt zustzlich zur Ausgabe ein Eintrag in die History. Damit lassen sich z.B. Eintrge aus den Tabellen mit Hilfe des Editors des bsh verndern und neu eintragen. #p[g|l] [a|b] Name Wert Mit dem '#p' - Kommando wird eine Abkrzung einer eventuell bestehenden berlagert, ohne sie in das dazugehrige File einzu- tragen. Damit lassen sich nderungen fr die Lebensdauer eines bsh erwirken. Die Information wird in einem Stack verwaltet. Wird ein gepushter Wert gelscht, dann erscheint eine eventuell berlagerte Abkrzung wieder. #s[g|l] Setzen der Default-Tabelle fr '#' - Kommandos; also der Tabelle, auf die sich die Kommandos '#a','#b','#d','#l','#p' beziehen, wenn kein Modifier angegeben ist. Das '#s' - Kommando ohne Modi- fier bzw. mit dem Default-Wert, bewirkt eine Ausgabe der De- fault-Tabelle. #v[on|off] Setzen oder Lesen des Verbose-Modes, der falls eingeschaltet, jedes Kommando vor der Filenamenexpansion ausgibt. #! shell [ args ] Ein alternativer Shell wird zur Ausfhrung des aktuellen Kommand- ofiles benutzt. Nur innerhalb von Command-Files mglich. Shell wird mit args und '$r0' gestartet. # Wird innerhalb von Command-Files ein '#' direkt von einem Blank, einem Tab oder einem Newline gefolgt, so gilt diese Zeile als Kommentar. History Mit Hilfe der History knnen Kommandos gespeichert, abgerufen und gen- dert werden. Die History ist als begrenzter Ringpuffer implementiert. Kommandozeilen aus der History knnen mit den Cursor-Steuertasten (Cup und Cdown) abgerufen werden. Ein Zeilenende (CR oder LF) fhrt das Kom- mando aus. Jedes ausgefhrte Kommando wird wieder an das Ende der History angefgt. Gleiche Kommandos werden weitgehend vermieden. Das letzte Kommando aus der History lsst sich auch mit '!!' wiederholen. Mit '!<pattern>' lsst sich ein Kommando aus der History wiederholen, dass mit <pattern> be- ginnt. Beispiele: Joerg> history { cd etc } { ved ttys } { p ttys } { who } { echo huhu >/etc/tty5 } { history } Joerg> who tty5 peter Fri Feb 1 1985 13:57:14 tty0 Joerg Fri Feb 1 1985 08:01:52 Joerg> history { cd etc } { ved ttys } { p ttys } { echo huhu >/etc/tty5 } { who } { history } Joerg> !w who joerg ttyp3 Mar 5 16:55 (HARD) klaus ttyp4 Mar 5 17:01 (TeSe) Joerg> _ Variablen mit besonderer Bedeutung fr den bsh Folgende Variablen knnen sowohl erzeugt, als auch gelesen werden. Sie haben jedoch eine implizite Wirkung auf die Arbeitsweise des bsh. HISTORY Bestimmt die maximale Anzahl der in der History gespeicherten Zeilen. Beispiele: Joerg> echo $HISTORY 20 Joerg> history { cd etc } { ved ttys } { p ttys } { who } { echo huhu >/etc/tty5 } { echo $HISTORY } { history } Joerg> set HISTORY=4 Joerg> history { echo huhu >/etc/tty5 } { echo $HISTORY } { set HISTORY=4 } { history } Joerg> _ SAVEHISTORY Wenn diese Variable den Wert on hat, wird bei der Beendigung eines bsh der aktuelle Inhalt der History im File ~/.history gesichert. Wenn ein interaktiver bsh gestartet wird und das File ~/.history existiert, wird es vor der Ausgabe des ersten Prompts gelesen. PROMPT Bestimmt den Benutzerprompt. Beispiele: Joerg> set "PROMPT=peter> " peter> _ PROMPT2 Bestimmt den zweiten Benutzerprompt. Dieser wird ausgegeben, wenn der bsh zu einem Kommando noch weitere Eingaben bentigt. Beispiele: Joerg> if echo ja > then > echo ja > fi ja ja Joerg> set "PROMPT2=more> " Joerg> if echo ja more> then more> echo ja more> fi ja ja Joerg> _ PATH In dieser Variablen ist eine Liste von Directories enthalten, die bei dem Versuch, ein Kommando zu starten, durchsucht werden. Die Liste wird von links nach rechts durchsucht. Der erste Ein- trag sollte leer sein, um auf die aktuelle Workingdirectory zu verweisen. Die einzelnen Eintrge werden durch das Zeichen ':' getrennt. Beispiele: Joerg> echo $PATH :/bin:/usr/bin:/usr/joerg/bin Joerg> _ CDPATH Diese Variable hat den gleichen Aufbau wie PATH. Sie ist fr das Suchen nach Directories bei dem cd - Kommando zustndig. Der er- ste Eintrag muss !! leer sein, sonst funktioniert das cd - Kom- mando nicht. Beispiele: Joerg> echo $CDPATH :/usr/joerg:/usr/joerg/cmd Joerg> cd bsh ~/cmd/bsh Joerg> _ CWD Diese Variable enthlt die aktuelle Working-Directory. Sie wird aber aus Effizienzgrnden erst nach dem ersten cd - Kommando gesetzt. Beispiele: Joerg> #b wd echo $CWD Joerg> wd /usr/joerg/cmd/bsh Joerg> _ CD Hat die Variable CD den Wert on, oder ist nicht gesetzt, ist ein Wechsel der Workingdirectory jederzeit mglich. CD=off verbietet dem Benutzer ein cd - Kommando. CD=/usr/schwachsinn verbietet ber die Directory /usr/schwachsinn hinaufzusteigen. Beispiele: Joerg> pwd /user/joerg Joerg> cd .. Joerg> cd Joerg> set CD=off Joerg> cd .. Can't change to '..'. Permission denied. Joerg> pwd /user/joerg Joerg> _ EVLOCK Verbietet dem Benutzer das ndern einer oder mehrerer EV-Vari- ablen. Sollen mehrere EV-Variablen gesperrt werden, werden ihre Namen durch einen Doppelpunkt getrennt. Hat die Variable EVLOCK den Wert on, so sind alle EV-Variablen gesperrt. Beispiele: Joerg> echo $HISTORY 20 Joerg> set HISTORY=5 Joerg> echo $HISTORY 5 Joerg> set EVLOCK=HISTORY Joerg> set HISTORY=15 Can't set environment 'HISTORY=15'. Variable is locked Joerg> echo $HISTORY 5 Joerg> set EVLOCK=EVLOCK:PATH:CD:SU:SLASH:PROMPT Joerg> set PROMPT=la> Can't set environment 'PROMPT=la>'. Variable is locked Joerg> set EVLOCK=off Can't set environment 'EVLOCK=off'. Variable is locked Joerg> _ SLASH SLASH=off bewirkt die Nichtbeachtung des Zeichens '/'. SLASH=on hat keine Wirkung. Diese Variable wird auch von den Utilities ved, copy, move und delete gelesen und entsprechend inter- pretiert. Beispiele: Joerg> set SLASH=off Joerg> /bin/echo hallo Can't execute ''. Permission denied. Joerg> set SLASH=on Joerg> /bin/echo hallo hallo Joerg> _ SU Mit SU=off kann die Benutzung des su - Kommandos gesperrt wer- den. IGNOREEOF Jeder Kommandointerpreter hat nach seinem Start diese Variable auf off gesetzt (Auch das su Kommando). Will man das verhindern, kann man in sein ~/.init - File set IGNOREEOF=on schreiben. Rekursiv aufgerufene Kommandointerpreter knnen dann mit ^D ver- lassen werden, falls sich der Cursor am Anfang einer leeren Zeile befindet, der erste jedoch nicht. Will man auch rekursiv erzeugte Kommandointerpreter schtzen, gehrt in das ~/.init2 - File die gleiche Zeile. Rekursiv aufgerufene Kommandinterpreter knnen jedoch mit dem pushd bzw. dem popd - Kommando weitgehend vermieden werde. Ist IGNOREEOF nicht auf on, wird beim Eintippen von ^D solange vorwrts gelscht, bis evtl. der Cursor sich am An- fang einer leeren Zeile befindet; dann wird der bsh verlassen. (Befindet der Cursor sich nicht am Anfang einer Zeile, so ertnt die Glocke, wenn sich keine Zeichen mehr rechts vom Cursor befinden.) FILES ~/.init wird beim Starten des Loginshells ausgefhrt. ~/.init2 wird beim Starten jedes weiteren Shells ausgefhrt. ~/.final wird beim Logout ausgefhrt. ~/.history enthlt die gerettete History nach dem Ausloggen. ~/.bshmap enthlt die Tastaturmaps. ~/.globals enthlt Macros, die in jeder Directory gelten. ~/.locals enthlt Macros, die nur in der aktuellen Directory gelten. /dev/null Stdin fr Hintergundjobs. /etc/initbsh Gemeinsames Init-Sriptfile fr alle Loginshells. /etc/initrbsh Gemeinsames Init-Sriptfile fr alle restricted Lo- ginshells. /etc/passwd Fr Homedirectory-Expansion (~name). /etc/termcap Fr die Standard Cursormaps. /tmp/bsh* Temporres File fr <<. BUGS Allgemeines Einige eingebaute Funktionen des bsh lassen sich nicht mit ^C ab- brechen. Alle Eingaben, die nach einem '>' Prompt eingegeben wurden, erscheinen nicht in der History. Es ist nicht mglich Kontroll-Struk- turen aus if, for, loop und switch durch ';' oder '&' zu trennen. Das Quoting von speziellen Buchstaben ist verwirrend, weil an vielen verschiedenen Stellen expandiert wird und jeweils das Zeichen '\' ent- fernt wird. Besonders verwirrend ist das bei Meister werden. Symbolische Links berlisten den bsh. Wenn ein cd ber einen symbolischen Link fhrt, hat die Variable $CWD nicht mehr den korrekten Wert. Das Kommando cat <<EOF& verwirrt den bsh. Er forkt, bevor der Input gelesen ist, was zur Folge hat, da man zwei Prompts hat, und Vater und Sohn gleichzeitig lesen wollen. Das killpg Kommando lsst sich nur bedingt verwenden, da es unter UNIX kein Kommando gibt, mit dem man die Prozessgruppe eines Prozesses bekommt. Hinweise Strings werden hnlich wie in Programmiersprachen und in grober Annherung an den sh behandelt: d.h.: • Mit dem doppelten Anfhrungszeichen wird nur ein String zusam- mengefasst und die Expansion von Wildcards ($*?{}[]) verhindert. Environment-Variablen werden hier noch expandiert. • Mit dem einfachen Anfhrungszeichen wird jegliche Expansion ver- hindert, d.h. alle Macros, die mit dem do - Kommando arbeiten, mssen !! in einfachen Anfhrungszeichen stehen, damit sie nicht schon vor der Ausfhrung des eigentlichen Kommandos expandiert werden. Man sollte, falls man sich nicht sicher ber den Grund einer mglichen Fehlfunktion eines do Macros ist, das Kommando: change '"' "'" ~/.globals ~/.locals" absetzen, da in Strings, die mit dem " gebildet werden, schon eine Expansion erfolgt und deshalb das do - Kommando nicht kor- rekt luft. Eine Verkettung von Strings wie im sh ist z.Zt. nicht mglich. nderungen, die dem technischen Fortschritt dienen, vorbehalten. Weitere Bugs bitte an schilytools@mlists.in-berlin.de senden oder ein Ticket auf https://codeberg.org/schilytools/schilytools/issues ffnen. Das Archiv der Mailing-Liste ist zu finden unter: https://mlists.in-berlin.de/mailman/listinfo/schilytools-mlists.in-berlin.de AUTOREN Der bsh wurde von Jrg Schilling geschrieben und wird nun von den Au- toren des schilytools Projekt unterhalten. SOURCE DOWNLOAD Der Quellcode des bsh ist im schilytools Projekt enthalten und kann auf dessen Projektseite auf Codeberg heruntergeladen werden: https://codeberg.org/schilytools/schilytools. Aktuelle Releases sind hier zu finden: https://codeberg.org/schilytools/schilytools/releases. Joerg Schilling 2022/09/12 BSH(1L)
NAME | SYNOPSIS | OPTIONEN | BESCHREIBUNG | FILES | BUGS | AUTOREN | SOURCE DOWNLOAD
Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=pfbsh&sektion=1&manpath=FreeBSD+Ports+14.3.quarterly>