% Linux Installation and Getting Started    -*- TeX -*-
% plumbing.tex
% Copyright (c) 1992, 1993 by Matt Welsh, Larry Greenfield and Karl Fogel
%
% This file is freely redistributable, but you must preserve this copyright 
% notice on all copies, and it must be distributed only as part of "Linux 
% Installation and Getting Started". This file's use is covered by
% the copyright for the entire document, in the file "copyright.tex".
%
% Copyright (c) 1998 by Specialized Systems Consultants Inc. 
% <ligs@ssc.com>

\section{Vodovodne inštalacije Linuxa}\label{sec-plumbing}
%\markboth{Učbenik Linuxa}{Vodovodne inštalacije Linuxa}

\subsection{Standardni vhod in standardni izhod}
\index{standardni vhod|(}
\index{standardni izhod|(}
\index{stdin@\texttt{stdin}|see{standardni vhod}}
\index{stdout@\texttt{stdout}|see{standardni izhod}}
Veliko ukazov Linuxa bere vhod in podatke iz tega, kar se imenuje
\textbf{standardni vhod} in pošilja svoj izhod na \textbf{standardni izhod}
(pogosto sta ta dva pojma okrajšana kot \texttt{stdin} in
\texttt{stdout}).  Vaša ukazna lupina uredi zadeve tako, da je
standardni vhod vaša tipkovnica, standardni izhod pa zaslon.

Tukaj je primer uporabe ukaza \texttt{cat}.  Navadno bere \texttt{cat}
podatke iz vseh datotek, določenih v ukazni vrstici, in pošlje te
podatke neposredno na \texttt{stdout}.  Torej uporaba ukaza
\begin{tscreen}
/home/larry/papers\$ \emph{cat history-final masters-thesis}
\end{tscreen}
izpiše vsebino datoteke \texttt{history-final}, ki ji sledi vsebina
datoteke \texttt{masters-thesis}.

A če ne določite imena datoteke, \texttt{cat} bere podatke iz
\texttt{stdin} in jih pošilja na \texttt{stdout}.  Tukaj je primer:
\begin{tscreen}
/home/larry/papers\$ \emph{cat} \\
\emph{Pozdravljeni.} \\
Pozdravljeni. \\
\emph{Na svidenje.} \\
Na svidenje. \\
\key{Ctrl-D} \\
/home/larry/papers\$ 
\end{tscreen}
\index{konec-teksta!signal}
\index{EOT (end of text) signal}
Vsaka vrstica, ki ste jo vpisali, takoj odmeva nazaj v \texttt{cat}-u.
Ko berete s standardnega vhoda, določite, da je vaš vnos >>končan<<
tako, da pošljete signal za konec teksta, imenovan signal EOT (iz
angl.\ end-of-text signal), v splošnem ga dobite s pritiskom \key{Ctrl-D}.

% By the way, guys, there's no such thing as an EOF character in UNIX. The
% terminal signal to signal EOT (end of text) is usually ^D. Files on
% disk don't have a terminating EOF as MS-DOS files do. The data just
% ends, and the read() call signals the end of data. :) --mdw

Tukaj je še en primer.  Ukaz \texttt{sort} prebere vrstice teksta
(spet iz standardnega vhoda, razen če določite eno ali več datotek)
in pošlje urejen izhod na standardni izhod.  Poskusite naslednje.
\begin{tscreen}
/home/larry/papers\$ \emph{sort} \\
\emph{korenje}\\
\emph{banane}\\
\emph{jabolka}\\
\key{Ctrl-D} \\
banane\\
jabolka\\
korenje\\
/home/larry/papers\$ 
\end{tscreen}
Zdaj lahko svoj nakupovalni spisek uredimo po abecedi \dots{} mar ni
Linux uporaben?

\subsection{Preusmeritev vhoda in izhoda}\label{redirection}
\index{preusmeritev!standardni vhod}
\index{preusmeritev!standardni izhod}
\index{izhod!preusmeritev}
\index{standardni izhod!preusmeritev}
\index{>@\texttt{>}}
Zdaj denimo, da želite poslati izhod ukaza \texttt{sort} v datoteko,
da boste shranili vaš nakupovalni spisek na disk.  Ukazna lupina vam
omogoča \textbf{preusmeritev} standardnega izhoda v datoteko z uporabo
znaka >>\texttt{>}<<.  Takole to deluje:
\begin{tscreen}
/home/larry/papers\$ \emph{sort $>$ nakupovalni-spisek} \\
\emph{korenje}\\
\emph{banane}\\
\emph{jabolka}\\
\key{Ctrl-D} \\
/home/larry/papers\$ 
\end{tscreen}
Kot lahko vidite, se rezultat ukaza \texttt{sort} ni prikazal, a je
shranjen v datoteki, imenovani \texttt{nakupovalni-spisek}.  Poglejmo
vsebino te datoteke:
\begin{tscreen}
/home/larry/papers\$ \emph{cat nakupovalni-spisek}\\
banane\\
jabolka\\
korenje\\
/home/larry/papers\$ 
\end{tscreen}
Zdaj lahko uredite vaš nakupovalni spisek in ga tudi shranite!  A
denimo, da shranjujete neurejen, izvorni nakupovalni spisek v datoteko
\texttt{stvari}.  En način urejanja te informacije in shranjevanja v
datoteko bi bil, da daste ukazu \texttt{sort} ime datoteke za branje
namesto standardnega vhoda, in preusmerite standardni izhod, kot smo
to naredili zgoraj.  Torej takole:
\begin{tscreen}
/home/larry/papers\$ \emph{sort stvari $>$ nakupovalni-spisek} \\
/home/larry/papers\$ \emph{cat nakupovalni-spisek} \\
banane\\
jabolka\\
korenje\\
/home/larry/papers\$ 
\end{tscreen}
\index{vhod!preusmerjanje}
\index{standardni vhod!preusmeritev}
\index{<@\texttt{<}}
Vendar obstaja tudi druga pot za dosego tega.  Ne le, da lahko
preusmerite standardni izhod, preusmerite lahko tudi standardni
\emph{vhod}, z uporabo znaka >>\texttt{<}<<.
\begin{tscreen}
/home/larry/papers\$ \emph{sort $<$ stvari} \\
banane\\
jabolka\\
korenje\\
/home/larry/papers\$ 
\end{tscreen}
Tehnično je >>\texttt{sort < stvari}<< ekvivalenten >>\texttt{sort
stvari}<<, a vam omogoča demonstracijo naslednje stvari: \texttt{sort
< stvari} se obnaša, kot da bi bili podatki v datoteki \texttt{stvari}
vtipkani na standardnem vhodu.  Ukazna lupina ureja preusmerjanje.
Ukazu \texttt{sort} ni dano ime datoteke (\texttt{stvari}), s katere
naj bere; kar se tiče \texttt{sort}-a, še vedno bere s standardnega
vhoda, kot če bi vnesli podatke z vašo tipkovnico.

\index{filter!definicija}
To uvaja koncept \textbf{filtra}. Filter je program, ki bere podatke s
standardnega vhoda, jih na nek način obdela in pošlje obdelane podatke
na standardni izhod.  Z uporabo preusmerjevanja (angl.\ redirection)
se na standardni vhod in izhod lahko sklicujete iz datotek.  Kot smo
omenili, \texttt{stdin} in \texttt{stdout} privzeto ustrezata
tipkovnici in zaslonu, po vrsti. Pripomoček \texttt{sort} je preprost
filter.  Uredi vhodne podatke in pošlje rezultat na standardni izhod.
Pripomoček \texttt{cat} je še preprostejši.  Ničesar ne naredi z
vhodnimi podatki, le izpiše, kar pač že dobi.

\subsection{Uporaba cevi}

\index{cevi!uporaba|(}
Pokazali smo že, kako uporabljati \texttt{sort} kot filter.  Vendar ti
primeri predpostavljajo, da imate podatke nekje shranjene v datoteki
ali ste pripravljeni sami vpisati vse podatke standardnega vhoda.
Kaj, če podatki, ki jih želite urediti, pridejo kot izhod nekega
drugega ukaza, kot je \texttt{ls}?

Izbira \texttt{-r} ukaza \texttt{sort} uredi podatke v obratnem
abecednem vrstnem redu.  Če želite našteti imena datotek v vašem
trenutnem imeniku v obratnem vrstnem redu, je en način za to
naslednji:
\begin{tscreen}
/home/larry/papers\$ \emph{ls} \\
english-list \\
history-final \\
masters-thesis \\
notes
\end{tscreen}
Zdaj preusmerimo izhod ukaza \texttt{ls} v datoteko, imenovano
\texttt{file-list}:
\begin{tscreen}
/home/larry/papers\$ \emph{ls $>$ file-list} \\
/home/larry/papers\$ \emph{sort -r file-list} \\
notes \\
masters-thesis \\
history-final \\
english-list \\
/home/larry/papers\$ 
\end{tscreen}
Tukaj shranjujemo izhod ukaza \texttt{ls} v datoteko, in potem na tej
datoteki poženemo \texttt{sort -r}.  A to je nepripravno in uporablja
začasno datoteko za shranjevanje podatkov iz \texttt{ls}.

\index{cevovod!definicija}
\index{cevi!ustvarjanje}
Rešitev je uporaba \textbf{cevovoda} (angl.\ pipeline).  To je
lastnost ukazne lupine, ki poveže niz ukazov s >>cevjo<< (angl.\
pipe).  Standardni izhod prvega ukaza se pošlje na \texttt{stdin}
drugega ukaza.  V tem primeru želimo poslati \texttt{stdout} ukaza
\texttt{ls} na \texttt{stdin} ukaza \texttt{sort}.  Uporabimo znak
>>\texttt{|}<< za ustvarjanje cevi, kot sledi:
\begin{tscreen}
/home/larry/papers\$ \emph{ls $\mid$ sort -r} \\
notes \\
masters-thesis \\
history-final \\
english-list \\
/home/larry/papers\$ 
\end{tscreen}
Ta ukaz je krajši in lažji za vnos.

Tukaj je še en uporaben primer, ukaz
\begin{tscreen}
/home/larry/papers\$ \emph{ls /usr/bin} 
\end{tscreen}
izpiše dolg seznam imen datotek, večina od njih preleti zaslon
prehitro, da bi jih lahko prebrali.  Zato uporabimo \texttt{more} za
prikaz seznama datotek v \texttt{/usr/bin}.
\begin{tscreen}
/home/larry/papers\$ \emph{ls /usr/bin $\mid$ more} 
\end{tscreen}
Zdaj se lahko pomikate po seznamu teh datotek po svoji volji.

A zabava se tu še ne konča!  S cevmi lahko povežete skupaj tudi več
kot dva ukaza.  Ukaz \texttt{head} je filter, ki prikaže prve vrstice
vhodnega toka (v tem primeru, vhod iz cevi).  Če želite prikazati ime
datoteke v trenutnem imeniku, zadnje po abecednem redu, uporabljajte
ukaze, kot so naslednji:
\begin{tscreen}
/home/larry/papers\$ \emph{ls $\mid$ sort -r $\mid$ head -1} \\
notes \\
/home/larry/papers\$ 
\end{tscreen}
kjer \texttt{head -1} izpiše prvo vrstico vhoda, ki jo sprejme (v tem
primeru tok podatkov iz \texttt{ls}, urejenih po obratnem abecednem
redu).
\index{cevi!uporaba|)}

\subsection{Ne-uničevalna preusmeritev izhoda}
\index{datoteke!pripenjanje na}
\index{preusmeritev!ne-uničevalna}
Uporaba >>\texttt{>}<< za preusmeritev izhoda v datoteko je
uničevalna; z drugimi besedami, ukaz
\begin{tscreen}
/home/larry/papers\$ \emph{ls $>$ file-list}
\end{tscreen}
prepiše vsebino datoteke \texttt{file-list}.  Če namesto tega
preusmerjate s simbolom >>\texttt{>{}>}<<, bo izhod pripet na (dodan
na konec) poimenovano datoteko, namesto da bi jo prepisal.  Na primer,
\begin{tscreen}
/home/larry/papers\$ \emph{ls >{}> file-list}
\end{tscreen}
pripne izhod ukaza \texttt{ls} na datoteko \texttt{file-list}.

Zavedajte se, da so preusmerjanje in cevi lastnosti ukazne lupine --
ki podpira uporabo >>\texttt{>}<<, >>\texttt{>{}>}<< in
>>\texttt{|}<<.  To nima nič opraviti s samimi ukazi.

\index{standardni vhod|)}
\index{standardni izhod|)}
% Need to cover use of << and possibly use of stderr. Problem with 
% covering stderr is that it's different in different shells. Maybe later.
