Viele grosse Aenderungen
This commit is contained in:
		| @@ -442,7 +442,7 @@ schon}\texttt{\dq} | |||||||
|  |  | ||||||
| Der Grund daf<61>r ist, da<64> unter Umst<73>nden in der Ausgabe von \texttt{ps} auch | Der Grund daf<61>r ist, da<64> unter Umst<73>nden in der Ausgabe von \texttt{ps} auch | ||||||
| das \texttt{grep}-Kommando samt Parameter (\textit{prozessname}) aufgelistet | das \texttt{grep}-Kommando samt Parameter (\textit{prozessname}) aufgelistet | ||||||
| wird. So findet das \texttt{grep}-Kommando sich quasi selbst. | wird. So findet das \texttt{grep}-Kom\-man\-do sich quasi selbst. | ||||||
|  |  | ||||||
| Abhilfe schafft entweder \texttt{pgrep} (\ref{pgrep}) oder das folgende | Abhilfe schafft entweder \texttt{pgrep} (\ref{pgrep}) oder das folgende | ||||||
| Konstrukt: | Konstrukt: | ||||||
|   | |||||||
| @@ -74,9 +74,9 @@ echo Es sind $count Benutzer mit einer ID kleiner 100 eingetragen | |||||||
| Was ist passiert? | Was ist passiert? | ||||||
|  |  | ||||||
| Dieses Skript besteht im Wesentlichen aus einer Pipe. Wir haben ein | Dieses Skript besteht im Wesentlichen aus einer Pipe. Wir haben ein | ||||||
| \texttt{cat}-Kommando, das den Inhalt der \texttt{/etc/passwd} durch eben diese | \texttt{cat}-Kom\-man\-do, das den Inhalt der \texttt{/etc/passwd} durch eben | ||||||
| Pipe an eine Schleife <20>bergibt. Das \texttt{read}-Kommando in der Schleife | diese Pipe an eine Schleife <20>bergibt. Das \texttt{read}-Kommando in der | ||||||
| liest die einzelnen Zeilen aus, dann folgt ein Bi<42>chen Auswertung. | Schleife liest die einzelnen Zeilen aus, dann folgt ein Bi<42>chen Auswertung. | ||||||
|  |  | ||||||
| Es ist zu beobachten, da<64> bei der Ausgabe in Zeile 7 die Variable | Es ist zu beobachten, da<64> bei der Ausgabe in Zeile 7 die Variable | ||||||
| \texttt{\$count} korrekte Werte enth<74>lt. Um so unverst<73>ndlicher ist es, da<64> sie | \texttt{\$count} korrekte Werte enth<74>lt. Um so unverst<73>ndlicher ist es, da<64> sie | ||||||
|   | |||||||
							
								
								
									
										88
									
								
								shell.tex
									
									
									
									
									
								
							
							
						
						
									
										88
									
								
								shell.tex
									
									
									
									
									
								
							| @@ -7,36 +7,20 @@ | |||||||
| % Vorspann | % Vorspann | ||||||
| %============================================================================== | %============================================================================== | ||||||
|  |  | ||||||
| \newif\ifpdf                           % Feststellen, ob wir PDF oder DVI |  | ||||||
|                                        % erzeugen |  | ||||||
| \ifx\pdfoutput\undefined |  | ||||||
|   \pdffalse                            % Wir haben kein PDFLaTeX |  | ||||||
| \else |  | ||||||
|   \pdftrue                             % Wir haben PDFLaTeX |  | ||||||
| \fi |  | ||||||
|  |  | ||||||
| \ifpdf                                 % PDF-Einstellungen  |  | ||||||
|   \pdfoutput=1 |  | ||||||
|   \pdfcompresslevel=9 |  | ||||||
|   \pdfinfo{ |  | ||||||
|     /Author (Ronald Schaten) |  | ||||||
|     /CreationDate (D:20000301170300)   % (D:YYYYMMDDhhmmss) |  | ||||||
| %    /ModDate (D:19980212201000)        % ModDate is similar |  | ||||||
|     /Title (Shell-Programmierung) |  | ||||||
|     /Subject (Shell-Programmierung) |  | ||||||
|     /Keywords (Shell) |  | ||||||
|   } |  | ||||||
|   \pdfcatalog{            % Catalog dictionary of PDF output.  |  | ||||||
|     /PageMode /UseOutlines |  | ||||||
|     /URI (http://www.fi.muni.cz/) |  | ||||||
|   } |  | ||||||
| \else                                  % Nicht-PDF-Einstellungen |  | ||||||
| \fi |  | ||||||
|  |  | ||||||
|                                        % Dokumentstil f<>r Buch |                                        % Dokumentstil f<>r Buch | ||||||
| \documentclass[a4paper,12pt,draft,twoside]{book} | \documentclass[ | ||||||
|  |   a4paper,                             % Seitenformat A4 | ||||||
|  |   12pt,                                % 12-Punkt-Schrift | ||||||
|  |   BCOR.5cm,                            % 0,5cm Rand f<>r die Bindung | ||||||
|  |   headsepline,                         % Trennlinie unter die Kopfzeile | ||||||
|  |   pointlessnumbers,                    % Keine Punkte hinter den | ||||||
|  |                                        % Gliederungsnummern | ||||||
|  | %  draft,                               % Entwurfsmodus | ||||||
|  |   final,                               % Release-Modus | ||||||
|  |   twoside                              % Doppelseitig, f<>r Buch | ||||||
|  | ]{scrbook} | ||||||
|  |  | ||||||
| \usepackage{german}                    % deutsches Paket f<>r Umlaute | \usepackage{german}                    % deutsches Paket f<>r Umlaute | ||||||
| %\usepackage{t1enc}                     % DC-Font mit 8 Bit verwenden |  | ||||||
| \usepackage[latin1]{inputenc}          % Codepage latin1 | \usepackage[latin1]{inputenc}          % Codepage latin1 | ||||||
|  |  | ||||||
| %\usepackage{graphicx}                  % Grafikpaket f<>r Bilder laden | %\usepackage{graphicx}                  % Grafikpaket f<>r Bilder laden | ||||||
| @@ -47,11 +31,6 @@ | |||||||
| \usepackage{supertabular}              % f<>r Tabellen <20>ber die Seitenbreite | \usepackage{supertabular}              % f<>r Tabellen <20>ber die Seitenbreite | ||||||
| \usepackage{ltxtable}                  % f<>r Tabellen <20>ber die Seitenbreite | \usepackage{ltxtable}                  % f<>r Tabellen <20>ber die Seitenbreite | ||||||
|  |  | ||||||
| \ifpdf                                 % PDF-Einstellungen |  | ||||||
|   \usepackage{thumbpdf} |  | ||||||
| \else                                  % Nicht-PDF-Einstellungen |  | ||||||
| \fi |  | ||||||
|  |  | ||||||
| \usepackage{makeidx}                   % Index wird sp<73>ter eingef<65>gt | \usepackage{makeidx}                   % Index wird sp<73>ter eingef<65>gt | ||||||
| \makeindex                             % durch \printindex | \makeindex                             % durch \printindex | ||||||
|  |  | ||||||
| @@ -59,24 +38,28 @@ | |||||||
|  |  | ||||||
| \usepackage{fancybox}                  % K<>stchen f<>r Tastendarstellung | \usepackage{fancybox}                  % K<>stchen f<>r Tastendarstellung | ||||||
|  |  | ||||||
| \usepackage{fancyhdr}                  % Kopf- und Fu<46>zeilen |  | ||||||
| \pagestyle{fancy} |  | ||||||
| \renewcommand{\chaptermark}[1]{\markboth{#1}{}} |  | ||||||
| \renewcommand{\sectionmark}[1]{\markright{\thesection\ #1}} |  | ||||||
| \fancyhf{} |  | ||||||
| \fancyhead[RE]{\bfseries\leftmark} |  | ||||||
| \fancyhead[LO]{\bfseries\rightmark} |  | ||||||
| \fancyhead[RO,LE]{\bfseries\thepage} |  | ||||||
| \renewcommand{\headrulewidth}{0.5pt} |  | ||||||
| \addtolength{\headheight}{2.5pt} |  | ||||||
| \fancypagestyle{plain}{ |  | ||||||
|   \fancyhead{} |  | ||||||
|   \renewcommand{\headrulewidth}{0pt} |  | ||||||
|   \fancyfoot[C]{\bfseries\thepage} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| \usepackage{moreverb}                  % F<>r Listings | \usepackage{moreverb}                  % F<>r Listings | ||||||
|  |  | ||||||
|  |                                        % F<>r PDF | ||||||
|  | \usepackage[ | ||||||
|  |   pdftitle    = {Shell-Programmierung}, | ||||||
|  |   pdfsubject  = {Programmierung~der~Unix-Shell}, | ||||||
|  |   pdfkeywords = {shell~programmierung}, | ||||||
|  |   pdfauthor   = {Ronald~Schaten}, | ||||||
|  |   bookmarks, | ||||||
|  |   bookmarksopen, | ||||||
|  |   bookmarksopenlevel = 1, | ||||||
|  |   bookmarksnumbered, | ||||||
|  |   linktocpage, | ||||||
|  |   colorlinks, | ||||||
|  |   linkcolor = black | ||||||
|  | ]{hyperref} | ||||||
|  |  | ||||||
|  | %\pdfinfo{/CreationDate (D:20000301170300-01'00')}   % (D:YYYYMMDDhhmmss) | ||||||
|  |  | ||||||
|  | %%    /ModDate (D:19980212201000)        % ModDate is similar | ||||||
|  |  | ||||||
|  |  | ||||||
| \newcommand{\STRUT}{\rule{0in}{3ex}}   % Ein vertikaler Abstand f<>r Tabellen | \newcommand{\STRUT}{\rule{0in}{3ex}}   % Ein vertikaler Abstand f<>r Tabellen | ||||||
|  |  | ||||||
| \clubpenalty=10000                     % gegen Schusterjungen | \clubpenalty=10000                     % gegen Schusterjungen | ||||||
| @@ -142,7 +125,7 @@ R | |||||||
| \normalsize | \normalsize | ||||||
| \newpage | \newpage | ||||||
| \pagenumbering{roman} | \pagenumbering{roman} | ||||||
| \renewcommand{\headrulewidth}{0.5pt} | %\renewcommand{\headrulewidth}{0.5pt} | ||||||
| \setcounter{tocdepth}{3} | \setcounter{tocdepth}{3} | ||||||
| \tableofcontents | \tableofcontents | ||||||
| \newpage | \newpage | ||||||
| @@ -167,11 +150,6 @@ R | |||||||
|  |  | ||||||
| \end{document} | \end{document} | ||||||
|  |  | ||||||
| \ifpdf                                 % PDF-Einstellungen  |  | ||||||
|   \bye |  | ||||||
| \else                                  % Nicht-PDF-Einstellungen |  | ||||||
| \fi |  | ||||||
|  |  | ||||||
| %============================================================================== | %============================================================================== | ||||||
| % Ende von schema.tex | % Ende von schema.tex | ||||||
| %============================================================================== | %============================================================================== | ||||||
|   | |||||||
							
								
								
									
										19
									
								
								tab_kommandos_eval_beispiel.tex
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								tab_kommandos_eval_beispiel.tex
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | |||||||
|  | % $Id$ | ||||||
|  | \begin{longtable}{|l|X|} | ||||||
|  | % KILLED & LINE!!!! \kill | ||||||
|  |  \hline | ||||||
|  |  \endfirsthead | ||||||
|  |  \endhead | ||||||
|  |  \endfoot | ||||||
|  |  \hline | ||||||
|  |  \endlastfoot | ||||||
|  |  | ||||||
|  | \texttt{foo=42} & Der Variablen namens `foo' wird der Wert `42' zugewiesen. \tabularnewline\STRUT | ||||||
|  | \texttt{a=foo} & Der Variablen namens `a' wird der Wert `foo' zugewiesen. \tabularnewline\STRUT | ||||||
|  | \texttt{b='\$'\$a} & Der Variablen `b' wird ein \$ und der Inhalt der Variablen namens `a' zugewiesen. \tabularnewline\STRUT | ||||||
|  | \texttt{echo \$b} & Der Inhalt der Variablen `b' wird ausgegeben. \tabularnewline\STRUT | ||||||
|  | \textsl{\$foo} & \tabularnewline\STRUT | ||||||
|  | \texttt{eval b='\$'\$a} & Zun<75>chst wird die Zeile nach dem \texttt{eval} expandiert, Variablen werden durch Inhalte ersetzt. Es entsteht also ein neuer Ausdruck: `b=\$foo'. Der wird dann von \texttt{eval} ausgef<65>hrt. \tabularnewline\STRUT | ||||||
|  | \texttt{echo \$b} & Der neue Inhalt der Variablen `b' wird ausgegeben. \tabularnewline\STRUT | ||||||
|  | \textsl{42} &  | ||||||
|  | \end{longtable} | ||||||
							
								
								
									
										15
									
								
								tab_kommandos_printf_parameter.tex
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								tab_kommandos_printf_parameter.tex
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,15 @@ | |||||||
|  | % $Id$ | ||||||
|  | \begin{longtable}{|l|X|} | ||||||
|  | % KILLED & LINE!!!! \kill | ||||||
|  |  \hline | ||||||
|  |  \endfirsthead | ||||||
|  |  \endhead | ||||||
|  |  \endfoot | ||||||
|  |  \hline | ||||||
|  |  \endlastfoot | ||||||
|  |  | ||||||
|  | \texttt{\%b} & Behandelt die Ausgabe von Backslash-Sequenzen. Die Sequenzen sind im Abschnitt <20>ber \texttt{echo} (\ref{echo}) beschrieben. \tabularnewline\STRUT | ||||||
|  | \texttt{\%s} & Gibt den n<>chsten Datenstring aus \tabularnewline\STRUT | ||||||
|  | \texttt{\%}\textsl{n}\texttt{\$s} & Gibt den \textsl{n}-ten Datenstring aus \tabularnewline\STRUT | ||||||
|  | \texttt{\%[-]}\textsl{m}\texttt{[.}\textsl{n}\texttt{]s} & Gibt den n<>chsten String aus, dazu wird ein Platz von \textsl{m} Zeichen reserviert. Optional k<>nnen nur die ersten \textsl{n} Zeichen ausgegeben oder mit \texttt{-} eine Rechtsb<73>ndige Formatierung festgelegt werden. | ||||||
|  | \end{longtable} | ||||||
| @@ -16,5 +16,6 @@ | |||||||
| \texttt{* ? [ ] \~{} + - @ !} & Meta-Zeichen\index{Meta-Zeichen} f<>r Dateinamen \tabularnewline\STRUT | \texttt{* ? [ ] \~{} + - @ !} & Meta-Zeichen\index{Meta-Zeichen} f<>r Dateinamen \tabularnewline\STRUT | ||||||
| \texttt{` ` }(Backticks oder Single Backquotes\footnote{Man erh<72>lt sie durch \Ovalbox{SHIFT} und die Taste neben dem Backspace.}) & Befehls-Substitution\index{Befehls>-Substitution} \tabularnewline\STRUT | \texttt{` ` }(Backticks oder Single Backquotes\footnote{Man erh<72>lt sie durch \Ovalbox{SHIFT} und die Taste neben dem Backspace.}) & Befehls-Substitution\index{Befehls>-Substitution} \tabularnewline\STRUT | ||||||
| \texttt{\$} & Variablen-Substitution\index{Variablen>-Substitution} \tabularnewline\STRUT | \texttt{\$} & Variablen-Substitution\index{Variablen>-Substitution} \tabularnewline\STRUT | ||||||
| \texttt{\Ovalbox{NEWLINE} \Ovalbox{SPACE} \Ovalbox{TAB}} & Wort-Trennzeichen\footnote{Die Wort-Trennzeichen sind in der Variable \texttt{\$IFS}\label{IFS}\index{\$IFS=\texttt{\$IFS}} abgelegt. Man kann diese Variable auch <20>berschreiben, um elegant Strings zu zerlegen.} | \texttt{\Ovalbox{NEWLINE} \Ovalbox{SPACE} \Ovalbox{TAB}} & | ||||||
|  | Wort-Trennzeichen\footnote{Die Wort-Trennzeichen sind in der vordefinierten Variable \texttt{\$IFS} abgelegt. Siehe Abschnitt \ref{vordefinierte_variablen}.} | ||||||
| \end{longtable} | \end{longtable} | ||||||
|   | |||||||
| @@ -16,6 +16,7 @@ | |||||||
| \texttt{\$\$} & Proze<7A>nummer der aktiven Shell \tabularnewline\STRUT | \texttt{\$\$} & Proze<7A>nummer der aktiven Shell \tabularnewline\STRUT | ||||||
| \texttt{\$!} & Proze<7A>nummer des letzten Hintergrundprozesses \tabularnewline\STRUT | \texttt{\$!} & Proze<7A>nummer des letzten Hintergrundprozesses \tabularnewline\STRUT | ||||||
| \texttt{\$ERRNO} & Fehlernummer des letzten fehlgeschlagenen Systemaufrufs \tabularnewline\STRUT | \texttt{\$ERRNO} & Fehlernummer des letzten fehlgeschlagenen Systemaufrufs \tabularnewline\STRUT | ||||||
|  | \texttt{\$IFS} & Feldseparator, wird beispielsweise beim Lesen mittels \texttt{read} benutzt \tabularnewline\STRUT | ||||||
| \texttt{\$PWD} & Aktuelles Verzeichnis (wird durch \texttt{cd} gesetzt\footnote{Durch das Kommando \texttt{cd} wird das aktuelle Verzeichnis gewechselt.}) \tabularnewline\STRUT | \texttt{\$PWD} & Aktuelles Verzeichnis (wird durch \texttt{cd} gesetzt\footnote{Durch das Kommando \texttt{cd} wird das aktuelle Verzeichnis gewechselt.}) \tabularnewline\STRUT | ||||||
| \texttt{\$OLDPWD} & Vorheriges Verzeichnis (wird durch \texttt{cd} gesetzt) | \texttt{\$OLDPWD} & Vorheriges Verzeichnis (wird durch \texttt{cd} gesetzt) | ||||||
| \end{longtable} | \end{longtable} | ||||||
|   | |||||||
| @@ -90,13 +90,14 @@ indizierte Arrays\index{Array}. | |||||||
| TENEX-C-Shell\index{TENEX-C-Shell|textbf}\index{Shell>TENEX-C-|see{TENEX-C-Shell}} | TENEX-C-Shell\index{TENEX-C-Shell|textbf}\index{Shell>TENEX-C-|see{TENEX-C-Shell}} | ||||||
| (\texttt{tcsh}\index{tcsh=\texttt{tcsh}|see{TENEX-C-Shell}}) verh<72>lt sich zur | (\texttt{tcsh}\index{tcsh=\texttt{tcsh}|see{TENEX-C-Shell}}) verh<72>lt sich zur | ||||||
| C-Shell wie die Bourne-Again-Shell zur Standard-Shell. Sie ist voll kompatibel, | C-Shell wie die Bourne-Again-Shell zur Standard-Shell. Sie ist voll kompatibel, | ||||||
| bietet aber Komfort-Funktionen wie Kommandozeilen-Editierung, programmierbare | bietet aber Kom\-fort-Funk\-tio\-nen wie Kommandozeilen-Editierung, | ||||||
| Auto-Completion\index{Auto-Completion}, Rechtschreibhilfen und eine History. | programmierbare Auto-Completion\index{Auto-Completion}, | ||||||
|  | Recht\-schreib\-hil\-fen und eine History. | ||||||
|  |  | ||||||
| \item Die Z-Shell\index{Z-Shell|textbf}\index{Shell>Z-|see{Z-Shell}} | \item Die Z-Shell\index{Z-Shell|textbf}\index{Shell>Z-|see{Z-Shell}} | ||||||
| (\texttt{zsh}\index{zsh=\texttt{zsh}|see{Z-Shell}}) <20>hnelt der Korn-Shell, | (\texttt{zsh}\index{zsh=\texttt{zsh}|see{Z-Shell}}) <20>hnelt der Korn-Shell, | ||||||
| enth<EFBFBD>lt aber viele Erweiterungen. Die Z-Shell unterst<73>tzt | enth<EFBFBD>lt aber viele Erweiterungen. Die Z-Shell unterst<73>tzt | ||||||
| Kommandozeilen-Editing, programmierbares | Kom\-mandozeilen-Editing, programmierbares | ||||||
| Auto-Completion\index{Auto-Completion}, Shell-Funktionen und eine History. | Auto-Completion\index{Auto-Completion}, Shell-Funktionen und eine History. | ||||||
| Zudem ist eine Rechtschreibpr<70>fung eingebaut.  \end{itemize} | Zudem ist eine Rechtschreibpr<70>fung eingebaut.  \end{itemize} | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,10 +1,10 @@ | |||||||
| % $Id$ | % $Id$ | ||||||
| \chapter{N<EFBFBD>tzliche Shell-Kommandos}\label{nuetzliche_shell-kommandos} | \chapter{N<EFBFBD>tzliche Shell-Kommandos}\label{nuetzliche_shell-kommandos} | ||||||
| Durch die gezeigten Steuerungsm<73>glichkeiten stehen dem Shell-Pro\-grammie\-rer | Durch die gezeigten Steuerungsm<73>glichkeiten stehen dem Shell-Pro\-grammie\-rer | ||||||
| M<EFBFBD>glichkeiten offen, fast alle g<>ngigen Algorithmen zu implementieren. Es ist | M<EFBFBD>g\-lich\-kei\-ten offen, fast alle g<>ngigen Algorithmen zu implementieren. Es | ||||||
| tats<EFBFBD>chlich in der Shell m<>glich, Sortier- oder Suchfunktionen zu schreiben. | ist tats<EFBFBD>chlich in der Shell m<>glich, Sortier- oder Suchfunktionen zu | ||||||
| Leider kommt aber an dieser Stelle einer der bedeutendsten Nachteile der Shell | schreiben.  Leider kommt aber an dieser Stelle einer der bedeutendsten | ||||||
| zum tragen: Die Geschwindigkeit. | Nachteile der Shell zum tragen: Die Geschwindigkeit. | ||||||
|  |  | ||||||
| In einem Shell-Skript wird f<>r jedes externe Kommando\footnote{Externe | In einem Shell-Skript wird f<>r jedes externe Kommando\footnote{Externe | ||||||
| Kommandos sind solche, die nicht direkt in der Shell enthalten sind, f<>r die | Kommandos sind solche, die nicht direkt in der Shell enthalten sind, f<>r die | ||||||
| @@ -16,9 +16,9 @@ schreibt man besser in Perl, oder noch besser in einer `compilierten' Sprache | |||||||
| wie C oder C++. | wie C oder C++. | ||||||
|  |  | ||||||
| Es stehen jedoch an der Shell viele sehr n<>tzliche externe Kommandos zur | Es stehen jedoch an der Shell viele sehr n<>tzliche externe Kommandos zur | ||||||
| Verf<EFBFBD>gung, die einem die Entwicklung entsprechender eigener Routinen ersparen. | Ver\-f<EFBFBD>\-gung, die einem die Entwicklung entsprechender eigener Routinen | ||||||
| Diese externen Kommandos sind zudem in anderen Sprachen geschrieben worden, so | ersparen.  Diese externen Kommandos sind zudem in anderen Sprachen geschrieben | ||||||
| da<EFBFBD> sie schneller ablaufen als jedes Shell-Skript. Man kommt als | worden, so da<EFBFBD> sie schneller ablaufen als jedes Shell-Skript. Man kommt als | ||||||
| Shell-Programmierer nicht sinnvoll um den Einsatz dieser Programme herum. | Shell-Programmierer nicht sinnvoll um den Einsatz dieser Programme herum. | ||||||
|  |  | ||||||
| In diesem Abschnitt sollen einige dieser Programme mit typischen | In diesem Abschnitt sollen einige dieser Programme mit typischen | ||||||
| @@ -66,7 +66,7 @@ Dateien auf der Festplatte. | |||||||
| \item \texttt{echo} (\ref{echo}): Daten ausgeben | \item \texttt{echo} (\ref{echo}): Daten ausgeben | ||||||
| \item \texttt{grep} (\ref{grep}): In Dateien suchen | \item \texttt{grep} (\ref{grep}): In Dateien suchen | ||||||
| \item \texttt{head} (\ref{head}): Dateianfang ausgeben | \item \texttt{head} (\ref{head}): Dateianfang ausgeben | ||||||
| \item \texttt{printf} (\ref{printf}): formatierte Datenausgabe | \item \texttt{printf} (\ref{printf}): Formatierte Datenausgabe | ||||||
| \item \texttt{read} (\ref{read}): Zeilen einlesen | \item \texttt{read} (\ref{read}): Zeilen einlesen | ||||||
| \item \texttt{sort} (\ref{sort}): Zeilenweises Sortieren | \item \texttt{sort} (\ref{sort}): Zeilenweises Sortieren | ||||||
| \item \texttt{tail} (\ref{tail}): Dateiende ausgeben | \item \texttt{tail} (\ref{tail}): Dateiende ausgeben | ||||||
| @@ -261,8 +261,8 @@ Hier wird der Modus gesteuert, indem direkt angegeben wird f | |||||||
| Rechte gelten sollen. Mit `+' werden die Rechte erweitert, `-' nimmt Rechte | Rechte gelten sollen. Mit `+' werden die Rechte erweitert, `-' nimmt Rechte | ||||||
| und mit `=' werden die Rechte hart gesetzt. | und mit `=' werden die Rechte hart gesetzt. | ||||||
|  |  | ||||||
| \texttt{chmod u+x datei} macht die Datei f<>r den Besitzer ausf<73>hrbar. Mit | \texttt{chmod u+x datei} macht die Datei f<>r den Besitzer ausf<73>hrbar. Mit dem | ||||||
| \texttt{chmod u=rw,go=r datei} werden die Rechte auf `rw-r--r--' gesetzt, der | Parameter \texttt{u=rw,go=r} werden die Rechte auf `rw-r--r--' gesetzt, der | ||||||
| Besitzer kann lesen und schreiben, alle anderen nur lesen. | Besitzer kann lesen und schreiben, alle anderen nur lesen. | ||||||
|  |  | ||||||
| Neben dieser Art der Notation gibt es noch eine~--~wesentlich | Neben dieser Art der Notation gibt es noch eine~--~wesentlich | ||||||
| @@ -302,7 +302,7 @@ Will man lediglich die Gruppen-ID  | |||||||
|  |  | ||||||
|  |  | ||||||
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||||||
| \subsection{chpasswd}\label{script}\index{chpasswd=\texttt{chpasswd}|(textbf} | \subsection{chpasswd}\index{chpasswd=\texttt{chpasswd}|(textbf} | ||||||
|  |  | ||||||
| Mit diesem Kommando bietet sich dem Administrator des Systems die | Mit diesem Kommando bietet sich dem Administrator des Systems die | ||||||
| M<EFBFBD>g\-lich\-keit, scriptgesteuert die Pa<50>w<EFBFBD>rter f<>r neue Benutzer zu vergeben. | M<EFBFBD>g\-lich\-keit, scriptgesteuert die Pa<50>w<EFBFBD>rter f<>r neue Benutzer zu vergeben. | ||||||
| @@ -388,7 +388,24 @@ der Praxis oft als sehr hilfreich: | |||||||
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||||||
| \subsection{eval}\label{eval}\index{eval=\texttt{eval}|(textbf} | \subsection{eval}\label{eval}\index{eval=\texttt{eval}|(textbf} | ||||||
|  |  | ||||||
| TODO!!! eval | Die Wirkungsweise von \texttt{eval} l<><6C>t sich wohl am ehesten durch ein kleines | ||||||
|  | Beispiel erkl<6B>ren: | ||||||
|  |  | ||||||
|  | \LTXtable{\textwidth}{tab_kommandos_eval_beispiel.tex} | ||||||
|  |  | ||||||
|  | Bevor eine Zeile in der Shell tats<74>chlich ausgef<65>hrt wird, wird sie von der | ||||||
|  | Shell expandiert, bzw. evaluiert. Der letzte Begriff deutet schon an was damit | ||||||
|  | gemeint ist: Enthaltene Variablennamen werden durch ihre Werte ersetzt. | ||||||
|  |  | ||||||
|  | Das Kommando \texttt{eval} f<>hrt die Zeile die durch die Expansion entstanden | ||||||
|  | ist noch einmal aus. So ist es m<>glich, Variablennamen aus den Inhalten anderer | ||||||
|  | Variablen zu bilden. | ||||||
|  |  | ||||||
|  | Eine wichtige Anwendung f<>r dieses Kommando ist der Fall, wenn eigentlich ein | ||||||
|  | Array\index{Array} gebraucht w<>rde. Der Inhalt eines Array-Elements kann | ||||||
|  | beispielsweise mittels \texttt{eval echo \textbackslash\$arr\$index} ausgegeben | ||||||
|  | werden, dabei ist \texttt{arr} der Name des Arrays und \texttt{index} der Name | ||||||
|  | der Variablen, die den Index des auszugebenden Elementes enth<74>lt. | ||||||
|  |  | ||||||
| \index{eval=\texttt{eval}|)} | \index{eval=\texttt{eval}|)} | ||||||
|  |  | ||||||
| @@ -412,7 +429,7 @@ sie sind also durch Anf | |||||||
| \texttt{i=`expr \$i \textbackslash{}* 3`}. | \texttt{i=`expr \$i \textbackslash{}* 3`}. | ||||||
|  |  | ||||||
| Eine andere M<>glichkeit f<>r einfache Rechnungen besteht in der sogenannten | Eine andere M<>glichkeit f<>r einfache Rechnungen besteht in der sogenannten | ||||||
| Arithmetik-Expansion (Siehe \ref{arithmetikexpansion}). | Arith\-me\-tik-Ex\-pan\-sion (Siehe \ref{arithmetikexpansion}). | ||||||
|  |  | ||||||
| \index{expr=\texttt{expr}|)} | \index{expr=\texttt{expr}|)} | ||||||
|  |  | ||||||
| @@ -583,7 +600,39 @@ steht. | |||||||
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||||||
| \subsection{printf}\label{printf}\index{printf=\texttt{printf}|(textbf} | \subsection{printf}\label{printf}\index{printf=\texttt{printf}|(textbf} | ||||||
|  |  | ||||||
| TODO!!! printf | Analog zum gleichnamigen Befehl in Programmiersprachen wie Perl oder C dient | ||||||
|  | \texttt{printf} der formatierten Ausgabe von Daten. Als Parameter wird ein | ||||||
|  | sogenannter Format-String und eine Liste von auszugebenden Daten mitgegeben. | ||||||
|  | Dabei enth<74>lt der Format-String eine Reihe von Platzhaltern, die nach | ||||||
|  | bestimmten Regeln durch die Daten ersetzt werden. | ||||||
|  |  | ||||||
|  | Der Format-String folgt im Wesentlichen den gleichen Regeln wie in der | ||||||
|  | C-Version. N<>heres dazu erf<72>hrt man mit \texttt{man 3 printf}. | ||||||
|  |  | ||||||
|  | Hier die wichtigsten Parameter f<>r den Format-String: | ||||||
|  |  | ||||||
|  | \LTXtable{\textwidth}{tab_kommandos_printf_parameter.tex} | ||||||
|  |  | ||||||
|  | Besonders n<>tzlich ist dieses Kommando bei der tabellarischen Ausgabe von | ||||||
|  | Daten. Im folgenden Beispiel werden alle Benutzernamen, deren | ||||||
|  | Home-Verzeichnisse und Default-Shells aus der Datei \texttt{/etc/passwd} | ||||||
|  | extrahiert und <20>bersichtlich ausgegeben: | ||||||
|  |  | ||||||
|  | \footnotesize | ||||||
|  | \begin{listing}[2]{1} | ||||||
|  | #!/bin/sh | ||||||
|  | IFS=: | ||||||
|  | while read user pass uid gid name home shell; do | ||||||
|  |   printf "%-15s %-25s %s\n" $user $home $shell | ||||||
|  | done < /etc/passwd | ||||||
|  | \end{listing} | ||||||
|  | \normalsize | ||||||
|  |  | ||||||
|  | Zur Erinnerung: Die vordefinierte Variable | ||||||
|  | \texttt{\$IFS}\index{\$IFS=\texttt{\$IFS}} ist der Feld-Separator, die | ||||||
|  | Eingabezeilen werden also als Doppelpunkt-separierte Liste gesehen. N<>heres | ||||||
|  | dazu steht im Abschnitt <20>ber vordefinierte Variablen | ||||||
|  | (\ref{vordefinierte_variablen}). | ||||||
|  |  | ||||||
| \index{printf=\texttt{printf}|)} | \index{printf=\texttt{printf}|)} | ||||||
|  |  | ||||||
| @@ -609,8 +658,9 @@ Variablennamen wird der verbleibende Rest der Eingabezeile zugewiesen. Wenn | |||||||
| also nur ein Variablenname angegeben wird, erh<72>lt dieser die komplette | also nur ein Variablenname angegeben wird, erh<72>lt dieser die komplette | ||||||
| Eingabezeile. Wenn weniger Worte gelesen werden als Variablen angegeben sind, | Eingabezeile. Wenn weniger Worte gelesen werden als Variablen angegeben sind, | ||||||
| enthalten die verbleibenden Variablen leere Werte. Als Wort-Trennzeichen dienen | enthalten die verbleibenden Variablen leere Werte. Als Wort-Trennzeichen dienen | ||||||
| alle Zeichen, die in der vordefinierten Variable \texttt{\$IFS} enthalten sind | alle Zeichen, die in der vordefinierten Variable | ||||||
| (siehe Seite \pageref{IFS}). | \texttt{\$IFS}\index{\$IFS=\texttt{\$IFS}} enthalten sind (siehe Abschnitt | ||||||
|  | \ref{vordefinierte_variablen}). | ||||||
|  |  | ||||||
| Wenn keine Variablennamen angegeben werden, wird die Eingabe in der Variable | Wenn keine Variablennamen angegeben werden, wird die Eingabe in der Variable | ||||||
| \texttt{REPLY} abgelegt. | \texttt{REPLY} abgelegt. | ||||||
| @@ -657,8 +707,8 @@ Timeout oder ein EOF auf. | |||||||
|  |  | ||||||
| Mit diesem Kommando k<>nnen Dateien und Verzeichnisse gel<65>scht werden. Dabei | Mit diesem Kommando k<>nnen Dateien und Verzeichnisse gel<65>scht werden. Dabei | ||||||
| kann man vorsichtig vorgehen, indem man mit \texttt{-i} daf<61>r sorgt, da<64> jeder | kann man vorsichtig vorgehen, indem man mit \texttt{-i} daf<61>r sorgt, da<64> jeder | ||||||
| L<EFBFBD>schvorgang best<EFBFBD>tigt werden mu<6D>. Oder rabiat, indem man mit \texttt{-f} das | L<EFBFBD>schvorgang be\-st<EFBFBD>\-tigt werden mu<6D>. Oder rabiat, indem man mit \texttt{-f} | ||||||
| L<EFBFBD>schen erzwingt. | das L<EFBFBD>schen erzwingt. | ||||||
|  |  | ||||||
| Verzeichnisse k<>nnen mit dem Parameter \texttt{-R} entfernt werden, im | Verzeichnisse k<>nnen mit dem Parameter \texttt{-R} entfernt werden, im | ||||||
| Gegensatz zu \texttt{rmdir} werden dann auch s<>mtliche enthaltenen Dateien und | Gegensatz zu \texttt{rmdir} werden dann auch s<>mtliche enthaltenen Dateien und | ||||||
| @@ -851,7 +901,8 @@ Der Parameter \texttt{-L} gibt die L | |||||||
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||||||
| \subsection{who}\label{who}\index{who=\texttt{who}|(textbf} | \subsection{who}\label{who}\index{who=\texttt{who}|(textbf} | ||||||
|  |  | ||||||
| TODO!!! who | Das Kommando \texttt{who} gibt eine Liste aller angemeldeten Benutzer, zusammen | ||||||
|  | mit deren aktueller Konsole und der Anmeldezeit aus. | ||||||
|  |  | ||||||
| \index{who=\texttt{who}|)} | \index{who=\texttt{who}|)} | ||||||
|  |  | ||||||
| @@ -859,6 +910,34 @@ TODO!!! who | |||||||
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||||||
| \subsection{xargs}\label{xargs}\index{xargs=\texttt{xargs}|(textbf} | \subsection{xargs}\label{xargs}\index{xargs=\texttt{xargs}|(textbf} | ||||||
|  |  | ||||||
| TODO!!! xargs | Bisweilen kommt man in die Verlegenheit, versehentlich zu lange Einzeiler | ||||||
|  | geschrieben zu haben. Neben den F<>llen, in denen der Tipp-Eifer <20>berhand | ||||||
|  | genommen hat handelt es sich in aller Regel um Zeilen in der Art `\texttt{grep | ||||||
|  | 'text' \$(find / -name \textbackslash*.txt)}'. Dieses Kommando sucht alle | ||||||
|  | Dateien mit der Endung txt, die im System vorhanden sind. Diese werden `in die | ||||||
|  | Kommandozeile eingebaut'. Wenn sehr viele Dateien gefunden werden, wird die | ||||||
|  | Zeile zu lang f<>r die Shell\footnote{Die maximale L<>nge der Kommandozeile | ||||||
|  | unterscheidet sich von System zu System}. | ||||||
|  |  | ||||||
|  | Ein weiterer und in der Praxis mindestens ebenso sinnvoller Einsatzzweck ist | ||||||
|  | das Vermeiden von Schleifen. Das obige Problem lie<69>e sich auch mit einer Zeile | ||||||
|  | in der Form `\texttt{find / -name \textbackslash*.txt -exec grep 'text' \{\} | ||||||
|  | \textbackslash;}'. Allerdings h<>tte das den Nachteil, da<64> f<>r jede gefundene | ||||||
|  | Datei ein neuer \texttt{grep} gestartet werden mu<6D>. Das kostet Resourcen. | ||||||
|  |  | ||||||
|  | Beide Probleme werden durch eine Zeile in der Form `\texttt{find / -name | ||||||
|  | \textbackslash*.txt | xargs grep 'text'}' umgangen. Dabei liest \texttt{xargs} | ||||||
|  | aus der Standardeingabe die Parameter, die dann an den \texttt{grep}-Aufruf | ||||||
|  | angeh<EFBFBD>ngt werden. Sollten zu viele Dateien gefunden werden, wird \texttt{grep} | ||||||
|  | mehrfach aufgerufen, allerdings im Gegensatz zum obigen Beispiel nicht einmal | ||||||
|  | pro Fundstelle. | ||||||
|  |  | ||||||
|  | Neben einigen anderen Parametern informiert die Manpage <20>ber die Option | ||||||
|  | \texttt{-r}. Damit kann vermieden werden, da<64> \texttt{xargs} das Kommando | ||||||
|  | startet wenn keine Eingabe vorhanden ist. Bezogen auf das angegebene Beispiel | ||||||
|  | w<EFBFBD>rde \texttt{grep} ohne Dateinamen gestartet, wenn \texttt{find} nichts | ||||||
|  | findet. Es w<>rde auf Input von der Standardeingabe warten, der aber | ||||||
|  | wahrscheinlich nicht kommt. Das Skript w<>rde h<>ngen, wenn der Parameter | ||||||
|  | \texttt{-r} nicht angewandt w<>rde. | ||||||
|  |  | ||||||
| \index{xargs=\texttt{xargs}|)} | \index{xargs=\texttt{xargs}|)} | ||||||
|   | |||||||
| @@ -52,7 +52,12 @@ ausf | |||||||
|  |  | ||||||
| Dann kann das Skript gestartet werden. Da sich aus Sicherheitsgr<67>nden auf den meisten Systemen das aktuelle Verzeichnis nicht im Pfad des Benutzers befindet, mu<6D> man der Shell noch mitteilen, wo sie zu suchen hat: Mit \texttt{./name} wird versucht, im aktuellen Verzeichnis (\texttt{./}) ein Programm namens \texttt{name} auszuf<75>hren. | Dann kann das Skript gestartet werden. Da sich aus Sicherheitsgr<67>nden auf den meisten Systemen das aktuelle Verzeichnis nicht im Pfad des Benutzers befindet, mu<6D> man der Shell noch mitteilen, wo sie zu suchen hat: Mit \texttt{./name} wird versucht, im aktuellen Verzeichnis (\texttt{./}) ein Programm namens \texttt{name} auszuf<75>hren. | ||||||
|  |  | ||||||
| Auf den meisten Systemen befindet sich im Pfad der Eintrag \texttt{\~{}/bin} bzw. \texttt{/home/benutzername/bin}, das bedeutet da<64> man Skripte die immer wieder benutzt werden sollen dort ablegen kann, so da<64> sie auch ohne eine Pfadangabe gefunden werden. Wie der Pfad genau aussieht kann man an der Shell durch Eingabe von \texttt{echo \$PATH}\index{\$PATH=\texttt{\$PATH}} herausfinden. | Auf den meisten Systemen befindet sich im Pfad ein Verweis auf das Verzeichnis | ||||||
|  | \texttt{bin} unterhalb des Home-Verzeichnisses eines Benutzers. Das bedeutet | ||||||
|  | da<EFBFBD> man Skripte die immer wieder benutzt werden sollen dort ablegen kann, so | ||||||
|  | da<EFBFBD> sie auch ohne eine Pfadangabe gefunden werden. Wie der Pfad genau aussieht | ||||||
|  | kann man an der Shell durch Eingabe von \texttt{echo | ||||||
|  | \$PATH}\index{\$PATH=\texttt{\$PATH}} herausfinden. | ||||||
|  |  | ||||||
|  |  | ||||||
| \subsection{R<EFBFBD>ckgabewerte}\label{exitcode}\index{R<EFBFBD>ckgabewert|(textbf}\index{Exit-Code|see{R<EFBFBD>ckgabewert}}\index{Exit-Status|see{R<EFBFBD>ckgabewert}} | \subsection{R<EFBFBD>ckgabewerte}\label{exitcode}\index{R<EFBFBD>ckgabewert|(textbf}\index{Exit-Code|see{R<EFBFBD>ckgabewert}}\index{Exit-Status|see{R<EFBFBD>ckgabewert}} | ||||||
| @@ -140,16 +145,49 @@ behandelt (expandiert). | |||||||
|  |  | ||||||
|  |  | ||||||
| \section{Vordefinierte Variablen}\label{vordefinierte_variablen}\index{Variablen}\index{vordefinierte Variablen} | \section{Vordefinierte Variablen}\label{vordefinierte_variablen}\index{Variablen}\index{vordefinierte Variablen} | ||||||
| \index{\$n=\texttt{\$}$n$|(textbf}\index{\$*=\texttt{\$*}|(textbf}\index{\$@=\texttt{\$@}|(textbf}\index{\$\#=\texttt{\$\#}|(textbf}\index{\$?=\texttt{\$?}|(textbf}\index{\$\$=\texttt{\$\$}|(textbf}\index{\$!!=\texttt{\$!!}|(textbf}\index{\$ERRNO=\texttt{\$ERRNO}|(textbf}\index{\$PWD=\texttt{\$PWD}|(textbf}\index{\$OLDPWD=\texttt{\$OLDPWD}|(textbf} | \index{\$n=\texttt{\$}$n$|(textbf} | ||||||
| \index{ERRNO=\texttt{ERRNO}|see{\$ERRNO}}\index{PWD=\texttt{PWD}|see{\$PWD}}\index{OLDPWD=\texttt{OLDPWD}|see{\$OLDPWD}} | \index{\$*=\texttt{\$*}|(textbf} | ||||||
|  | \index{\$@=\texttt{\$@}|(textbf} | ||||||
|  | \index{\$\#=\texttt{\$\#}|(textbf} | ||||||
|  | \index{\$?=\texttt{\$?}|(textbf} | ||||||
|  | \index{\$\$=\texttt{\$\$}|(textbf} | ||||||
|  | \index{\$!!=\texttt{\$!!}|(textbf} | ||||||
|  | \index{\$ERRNO=\texttt{\$ERRNO}|(textbf} | ||||||
|  | \index{\$IFS=\texttt{\$IFS}|(textbf} | ||||||
|  | \index{\$PWD=\texttt{\$PWD}|(textbf} | ||||||
|  | \index{\$OLDPWD=\texttt{\$OLDPWD}|(textbf} | ||||||
|  | \index{ERRNO=\texttt{ERRNO}|see{\$ERRNO}} | ||||||
|  | \index{IFS=\texttt{IFS}|see{\$IFS}} | ||||||
|  | \index{PWD=\texttt{PWD}|see{\$PWD}} | ||||||
|  | \index{OLDPWD=\texttt{OLDPWD}|see{\$OLDPWD}} | ||||||
|  |  | ||||||
| Es gibt eine Reihe von vordefinierten Variablen, deren Benutzung ein wesentlicher Bestandteil des Shell-Programmierens ist. | Es gibt eine Reihe von vordefinierten Variablen, deren Benutzung ein | ||||||
|  | wesentlicher Bestandteil des Shell-Programmierens ist. | ||||||
|  |  | ||||||
| Die wichtigsten eingebauten Shell-Variablen sind:\nopagebreak | Die wichtigsten eingebauten Shell-Variablen sind:\nopagebreak | ||||||
| \LTXtable{\textwidth}{tab_vordefinierte_variablen.tex} | \LTXtable{\textwidth}{tab_vordefinierte_variablen.tex} | ||||||
|  |  | ||||||
| \texttt{\$ERRNO}, \texttt{\$PWD} und \texttt{\$OLDPWD} werden nicht von jeder Shell gesetzt. | Die Variable \texttt{\$IFS} enth<74>lt per Default die Blank-Zeichen, also | ||||||
| \index{\$n=\texttt{\$}$n$|)}\index{\$*=\texttt{\$*}|)}\index{\$@=\texttt{\$@}|)}\index{\$\#=\texttt{\$\#}|)}\index{\$?=\texttt{\$?}|)}\index{\$\$=\texttt{\$\$}|)}\index{\$!!=\texttt{\$!!}|)}\index{\$ERRNO=\texttt{\$ERRNO}|)}\index{\$PWD=\texttt{\$PWD}|)}\index{\$OLDPWD=\texttt{\$OLDPWD}|)} | Newline, Space und Tab. Man kann sie aber auch mit anderen Zeichen | ||||||
|  | <EFBFBD>berschreiben. Diese werden immer dann als Trennzeichen benutzt, wenn ein | ||||||
|  | String in mehrere Teile zerlegt werden soll, also beispielsweise in | ||||||
|  | \texttt{for}-Schleifen oder beim zeilenweisen Einlesen mit \texttt{read}. Ein | ||||||
|  | gutes Beispiel gibt es in dem Beispielskript zu \texttt{printf} (Abschnitt | ||||||
|  | \ref{printf}). | ||||||
|  |  | ||||||
|  | \texttt{\$ERRNO}, \texttt{\$PWD} und \texttt{\$OLDPWD} werden nicht von jeder | ||||||
|  | Shell gesetzt. | ||||||
|  | \index{\$n=\texttt{\$}$n$|)} | ||||||
|  | \index{\$*=\texttt{\$*}|)} | ||||||
|  | \index{\$@=\texttt{\$@}|)} | ||||||
|  | \index{\$\#=\texttt{\$\#}|)} | ||||||
|  | \index{\$?=\texttt{\$?}|)} | ||||||
|  | \index{\$\$=\texttt{\$\$}|)} | ||||||
|  | \index{\$!!=\texttt{\$!!}|)} | ||||||
|  | \index{\$ERRNO=\texttt{\$ERRNO}|)} | ||||||
|  | \index{\$IFS=\texttt{\$IFS}|)} | ||||||
|  | \index{\$PWD=\texttt{\$PWD}|)} | ||||||
|  | \index{\$OLDPWD=\texttt{\$OLDPWD}|)} | ||||||
|  |  | ||||||
|  |  | ||||||
| \section{Variablen-Substitution}\index{Variablen>-Substitution|(textbf}\index{Substitution|see{Variablen-Subst.}}\index{Variablen|(textbf} | \section{Variablen-Substitution}\index{Variablen>-Substitution|(textbf}\index{Substitution|see{Variablen-Subst.}}\index{Variablen|(textbf} | ||||||
| @@ -307,12 +345,12 @@ einem Konstrukt in der Form \texttt{i=\$((\$i + 1))} k | |||||||
| Berechnungen angestellt werden. | Berechnungen angestellt werden. | ||||||
|  |  | ||||||
| Dabei wird der Ausdruck in den Klammern bewertet als ob er in doppelten | Dabei wird der Ausdruck in den Klammern bewertet als ob er in doppelten | ||||||
| Anf<EFBFBD>hrungszeichen stehen w<>rde. Das bedeutet zum Einen, da<64> man auch mit | An\-f<EFBFBD>h\-rungs\-zei\-chen stehen w<>rde. Das bedeutet zum Einen, da<64> man auch | ||||||
| Variablen rechnen kann, zum anderen macht es das Quoten des Sternchens | mit Variablen rechnen kann, zum anderen macht es das Quoten des Sternchens | ||||||
| <EFBFBD>berfl<EFBFBD>ssig. | <EFBFBD>berfl<EFBFBD>ssig. | ||||||
|  |  | ||||||
| F<EFBFBD>r komplexere Berechnungen steht das Tool \texttt{bc} (Siehe Abschnitt | F<EFBFBD>r komplexere Berechnungen steht das Tool \texttt{bc} (Siehe Abschnitt | ||||||
| \ref{bc}) zur Verf<EFBFBD>gung. | \ref{bc}) zur Ver\-f<EFBFBD>\-gung. | ||||||
|  |  | ||||||
| \index{Arithmetik-Expansion|)} | \index{Arithmetik-Expansion|)} | ||||||
|  |  | ||||||
| @@ -615,7 +653,7 @@ auf einen anderen Rechner portiert und die Datei vergi | |||||||
| legt man eine solche Datei sinnvoll ab? | legt man eine solche Datei sinnvoll ab? | ||||||
|  |  | ||||||
| Um diesem <20>rger zu entgehen, sollte man in einer solchen Situation ein | Um diesem <20>rger zu entgehen, sollte man in einer solchen Situation ein | ||||||
| Here-Dokument benutzen. | Here-Do\-ku\-ment benutzen. | ||||||
|  |  | ||||||
| \emph{Umlenkung mit Hilfe von Dateideskriptoren:}\nopagebreak | \emph{Umlenkung mit Hilfe von Dateideskriptoren:}\nopagebreak | ||||||
| \LTXtable{\textwidth}{tab_datenstroeme_deskriptoren.tex} | \LTXtable{\textwidth}{tab_datenstroeme_deskriptoren.tex} | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user