% Linux Installation and Getting Started    -*- TeX -*-
% environment.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{Prilagoditev vašega okolja}
%\markboth{Učbenik Linuxa}{Prilagoditev vašega okolja}

\index{okolje!prilagoditev|(}
Ukazna lupina ponuja veliko mehanizmov za prilagoditev vašega
delovnega okolja.  Kot smo omenili zgoraj, je ukazna lupina več kot le
tolmač posamičnih ukazov -- je tudi tolmač za zmogljiv programski
jezik.  Čeprav je pisanje skriptov ukazne lupine široko področje, bi
vas radi seznanili z nekaterimi načini za poenostavitev vašega dela na
sistemu Linux brez uporabe teh naprednih odlik ukazne lupine.

Kot je bilo že omenjeno, različne ukazne lupine uporabljajo različno
skladnjo, ko izvajajo skripte ukazne lupine.  Na primer, Tcsh
uporablja C-ju podobno skladnjo, medtem, ko Bournove lupine
uporabljajo drugo vrsto skladnje.  V tem razdelku ne bomo opazili
velikih razlik med tema dvema, a bomo privzeli, da se skripti ukazne
lupine izvajajo z uporabo skladnje Bournove lupine.

\subsection{Skripti ukazne lupine}\label{sec-shell-script}
\index{lupinski skripti}
\index{skript|see{lupinski skripti}}
\index{ukaz!v lupinskem skriptu}
Denimo, da pogosto uporabljate vrsto ukazov in bi radi prihranili čas
tako, da jih uvrstite skupaj v en sam >>ukaz<<.  Na primer, trije
ukazi
\begin{tscreen}
/home/larry\$ \emph{cat poglavje1 poglavje2 poglavje3 $>$ knjiga}\\
/home/larry\$ \emph{wc -l knjiga}\\
/home/larry\$ \emph{lp knjiga}
\end{tscreen}
združijo datoteke \texttt{poglavje1}, \texttt{poglavje2}, in
\texttt{poglavje3} in postavijo rezultat v datoteko \texttt{knjiga}.
Drugi ukaz prikaže prešteto število vrstic v datoteki \texttt{knjiga},
tretji ukaz \texttt{lp knjiga} pa natisne datoteko \texttt{knjiga}.

Namesto da pišete vse te ukaze, jih lahko poberete skupaj v
\textbf{lupinski skript}.  Lupinski skript, uporabljan za tek vseh teh
ukazov, bi se lahko glasil takole:
\begin{tscreen}
\begin{verbatim}
#!/bin/sh
# Lupinski skript za ustvarjanje in natis knjige
cat poglavje1 poglavje2 poglavje3 > knjiga
wc -l knjiga
lp knjiga
\end{verbatim}
\end{tscreen}
Lupinski skripti so le preproste tekstovne datoteke; ustvarite jih
lahko s katerimkoli urejevalnikom, kot je \texttt{emacs} ali
\texttt{vi}, ki je opisan od strani~\pageref{sec-vi} naprej.

Poglejmo ta lupinski skript.  Prva vrstica, >>\texttt{\#!/bin/sh}<<,
identificira datoteko kot lupinski skript in naroči ukazni lupini,
kako naj izvede skript.  Naroči ukazni lupini, naj prepusti skript v
izvajanje \texttt{/bin/sh}, kjer je \texttt{/bin/sh} sam program za
ukazno lupino.  Zakaj je to pomembno?  Na večini sistemih Linux je
\texttt{/bin/sh} ukazna lupina Bournovega tipa, kot je \texttt{bash}.
Prisila lupinskega skripta, da teče z uporabo \texttt{/bin/sh},
zagotavlja, da se bo pognal pod ukazno lupino Bournove skladnje
(namesto pod lupino C).  To bo povzročilo, da bo vaš skript tekel z
uporabo Bournove skladnje, tudi če uporabljate \texttt{tcsh} (ali
drugo podobno ukazno lupino) kot vašo prijavno lupino.

\index{lupinski skripti!komentar}
Druga vrstica je \textbf{komentar}.  Komentar se začne z znakom
>>\texttt{\#}<< in se nadaljuje do konca vrstice.  Ukazna lupina
ignorira komentarje -- pogosto se jih uporablja, da predstavijo
lupinski skript programerju in ga naredijo lažje umljivega.

Ostanek vrstic v skriptu so preprosto ukazi, kot bi jih vpisali
neposredno v ukazno lupino.  Ukazna lupina tako prebere vsako vrstico
skripta in požene to vrstico, kot da bi jo vpisali v pozornik ukazne
lupine.

\index{lupinski skripti!dovoljenja za}
\index{dovoljenja!za lupinske skripte}
Za lupinske skripte so pomembna dovoljenja.  Če ustvarite skript
ukazne lupine, poskrbite, da imate dovoljenja za izvajanje skripta, če
bi ga radi poganjali.  Ko ustvarjate tekstovne datoteke, privzeta
dovoljenja navadno ne vključujejo dovoljenja za izvajanje, in tega
morate navesti eksplicitno.  Glejte razpravo o dovoljenjih za dostop
do datotek na strani~\pageref{sec-file-perms} za podrobnosti.  Na
kratko, če bi bil zgornji skript shranjen v datoteki, imenovani
\texttt{narediknjigo}, bi lahko uporabili ukaz
\begin{tscreen}
/home/larry\$ \emph{chmod u+x narediknjigo}
\end{tscreen}
da bi si dali dovoljenje za izvajanje lupinskega skripta
\texttt{narediknjigo}.

Za poganjanje vseh ukazov v skriptu lahko tedaj uporabite ukaz
\begin{tscreen}
/home/larry\$ \emph{./narediknjigo}
\end{tscreen}

\subsection{Spremenljivke ukazne lupine in okolje}
\index{lupine!spremenljivke!definicija}
\index{spremenljivke!lupinske}
\index{spremenljivke!v lupinskih skriptih}
\index{lupinski skripti!spremenljivke v njih}
Ukazna lupina vam dovoljuje definiranje \textbf{spremenljivk} kot
večina programskih jezikov.  Spremenljivka je le kos podatkov, ki mu
je prirejeno ime.

\blackdiamond
Ukazna lupina \texttt{tcsh}, kot tudi druge ukazne lupine tipa C,
uporabljajo drugačen mehanizem za nastavitev spremenljivk od tukaj
opisanega.  Ta razprava predpostavi uporabo Bournove ukazne lupine,
kot je \texttt{bash}.  Glejte stran priročnika o \texttt{tcsh} za
podrobnosti.

Ko spremenljivki določite vrednost (z uporabo operatorja
>>\texttt{=}<<), lahko dostopate do spremenljivke s predpono
>>\texttt{\$}<< njenemu imenu, kot je pokazano spodaj.
\begin{tscreen}
/home/larry\$ \emph{foo="{}zdravo tam"}
\end{tscreen}
Spremenljivki \texttt{foo} je dana vrednost >>\texttt{zdravo tam}<<.
Na to vrednost se lahko potem sklicujete z imenom spremenljivke, ki mu
spredaj dodate znak >>\texttt{\$}<<.  Na primer, ukaz
\begin{tscreen}
/home/larry\$ \emph{echo \$foo}\\
zdravo tam\\
/home/larry\$ 
\end{tscreen}
doseže enak rezultat, kot
\begin{tscreen}
/home/larry\$ \emph{echo "{}zdravo tam"}\\
zdravo tam\\
/home/larry\$ 
\end{tscreen}

Te spremenljivke so notranje ukazni lupini, kar pomeni, da do njih
lahko dostopa le lupina.  To je lahko uporabno v lupinskih skriptih;
če si morate, na primer, zabeležiti ime datoteke, ga lahko shranite v
spremenljivko kot zgoraj.  Uporaba ukaza \texttt{set} prikaže seznam
vseh definiranih lupinskih spremenljivk.

\index{lupinske spremenljivke!izvoz v okolje}
\index{export@\texttt{export}}
Ukazna lupina pa vam dovoljuje \textbf{izvoz} spremenljivk v
\textbf{okolje}.  Okolje (angl.\ environment) je nabor spremenljivk,
ki so dostopne vsem ukazom, ki jih izvajate.  Ko enkrat definirate
spremenljivko znotraj ukazne lupine, njen izvoz naredi, da postane
tudi ta spremenljivka del okolja.  Za izvoz spremenljivke v okolje
uporabite ukaz \texttt{export}.

\index{setenv@\texttt{setenv}}
\blackdiamond
Spet, tukaj razlikujemo med \texttt{bash} in \texttt{tcsh}.  Če
uporabljate \texttt{tcsh}, se za nastavitev okoljskih spremenljivk
uporablja druga skladnja (uporablja se ukaz \texttt{setenv}).  Glejte
stran priročnika o ukazni lupini \texttt{tcsh} za več informacij.

\index{spremenljivke!okolje}
Okolje je za sistem Unix zelo pomembno.  Dovoljuje vam nastavitev
nekaterih ukazov le z nastavitvijo spremenljivk, ki jih ti ukazi
poznajo.

Tukaj je kratek primer.  Okoljska spremenljivka \texttt{PAGER} se
uporablja v ukazu \texttt{man} in določa ukaz, ki naj se uporablja za
prikaz strani referenčnega priročnika, po eno stran naenkrat.  Če
nastavite spremenljivko \texttt{PAGER} na ime ukaza, uporablja namesto
(privzetega) ukaza \texttt{more} novi ukaz za prikaz strani
priročnika.

Nastavite \texttt{PAGER} na >>\texttt{cat}<<.  To povzroča, da se
izhod priročnika \texttt{man} prikaže naenkrat na zaslonu, brez
premora med stranmi.
\begin{tscreen}
/home/larry\$ \emph{PAGER=cat}
\end{tscreen}
Zdaj izvozimo \texttt{PAGER} v okolje.
\begin{tscreen}
/home/larry\$ \emph{export PAGER}
\end{tscreen}
Poskusite ukaz \texttt{man ls}.  Stran priročnika bi morala zleteti
mimo vašega zaslona, ne da bi čakala na vas.

Če zdaj nastavimo \texttt{PAGER} na >>\texttt{more}<<, se bo za prikaz
strani priročnika uporabljal ukaz \texttt{more}.
\begin{tscreen}
/home/larry\$ \emph{PAGER=more}
\end{tscreen}
Upoštevajte, da ni več treba uporabiti ukaza \texttt{export}, ko smo
spremenili vrednost spremenljivke \texttt{PAGER}.  Spremenljivko
moramo izvoziti le enkrat; od takrat naprej se bodo vse njene
spremembe samodejno prenesle v okolje.

Pogosto je nize nujno navesti med narekovaji, ali naj se prepreči
ukazni lupini, da bi upoštevala njihove različne znake kot posebne.
Na primer, niz boste morali zapisati med narekovajema, če želite
lupini preprečiti tolmačenje posebnega pomena znakov, kot so
>>\texttt{*}<<, >>\texttt{?}<< ali presledek.  Obstaja veliko drugih
znakov, ki jih je treba zaščititi pred tolmačenjem.  Podrobna razlaga
in opis citiranja je opisana v knjigi \emph{Bourne Shell Tutorial}
založbe SSC.

Strani priročnika za določen ukaz vam povedo, če ukaz uporablja
okoljske spremenljivke.  Na primer, stran priročnika o ukazu
\texttt{man} razlaga, da se za določitev izpisovalnika uporablja
spremenljivka \texttt{PAGER}.

Nekateri ukazi delijo okoljske spremenljivke.  Na primer, mnogi ukazi
uporabljajo okoljsko spremenljivko \texttt{EDITOR} za določitev
privzetega urejevalnika za uporabo, ko je ta potrebna.

Okolje se uporablja tudi za zapis sledi pomembnih informacij o vaših
prijavnih sejah.  Primer je okoljska spremenljivka \texttt{HOME}, ki
vsebuje ime vašega domačega imenika.
\begin{tscreen}
/home/larry/papers\$ \emph{echo \$HOME}\\
/home/larry
\end{tscreen}

Druga zanimiva okoljska spremenljivka je \texttt{PS1}, ki definira
glavni pozornik ukazne lupine.  Na primer,
\begin{tscreen}
/home/larry\$ \emph{PS1="Vaš ukaz, prosim: "}\\
Vaš ukaz, prosim: 
\end{tscreen}
Za nastavitev pozornika na prvotno vrednost (ki vsebuje trenutni
delovni imenik, ki mu sledi znak >>\texttt{\$}<<), uporabite
\begin{tscreen}
Vaš ukaz, prosim: \emph{PS1="$\backslash$w$\backslash$\$ "}\\
/home/larry\$
\end{tscreen}
Stran priročnika o \texttt{bash} opisuje skladnjo, potrebno za
nastavitev pozornika.

\subparagraph*{Okoljska spremenljivka \texttt{PATH}}
\index{okolje!spremenljivke!PATH@\texttt{PATH}}
Ko uporabite ukaz \texttt{ls}, kako ukazna lupina najde samo izvajalno
datoteko programa \texttt{ls}?  Pravzaprav \texttt{ls} leži v imeniku
\texttt{/bin} na večini sistemov.  Ukazna lupina uporablja okoljsko
spremenljivko \texttt{PATH} za določitev izvajalnih datotek za ukaze,
ki jih vpisujete.

Na primer, vaša spremenljivka \texttt{PATH} je lahko nastavljena na
\begin{tscreen}
/bin:/usr/bin:/usr/local/bin:.
\end{tscreen}
To je seznam imenikov, ki naj jih ukazna lupina poišče.  Imeniki so
ločeni z >>\texttt{:}<<.  Ko uporabljate ukaz \texttt{ls}, ukazna
lupina najprej pogleda za \texttt{/bin/ls}, potem
\texttt{/usr/bin/ls}, in tako naprej.

Upoštevajte, da \texttt{PATH} nima ničesar opraviti z iskanjem
običajnih datotek.  Na primer, če uporabite ukaz
\begin{tscreen}
/home/larry\$ \emph{cp foo bar}
\end{tscreen}
ukazna lupine ne uporablja \texttt{PATH} za iskanje datotek
\texttt{foo} in \texttt{bar} -- za ti imeni datotek se predpostavlja,
da sta popolni.  Ukazna lupina uporablja \texttt{PATH} samo, da najde
izvedljivo datoteko \texttt{cp}.

To vam prihrani čas, in pomeni, da si vam ni treba zapomniti, kje se
shranjujejo vsi izvajalni ukazi.  Na veliko sistemih so izvedljive
datoteke razmetane po veliko mestih, kot so imeniki \texttt{/usr/bin},
\texttt{/bin} ali \texttt{/usr/local/bin}.  Namesto da podate polno
ime poti ukaza (kot je \texttt{/usr/bin/cp}), lahko nastavite
spremenljivko \texttt{PATH} na seznam imenikov, za katere želite, da
jih ukazna lupina samodejno preišče.

Upoštevajte, da \texttt{PATH} vsebuje >>\texttt{.}<<, kar je trenutni
delovni imenik.  To vam omogoča ustvarjanje lupinskega skripta ali
programa in njegovo poganjanje iz trenutnega imenika, ne da bi ga bilo
treba določiti neposredno (kot \texttt{./narediknjigo}).  Če imenik ni
v vaši poti \texttt{PATH}, potem ga ukazna lupina ne bo preiskovala za
ukaze, ki se lahko izvedejo; to vključuje tudi trenutni imenik.

\subsection{Inicializacijski skripti ukazne lupine}\label{sec-init-scripts}
\index{lupinski skripti!inicializacija}
\index{inicializacijski skripti!za ukazne lupine}
Poleg skriptov ukazne lupine, ki jih naredite sami, obstajajo še
številni skripti, ki jih za določene namene uporablja sama ukazna
lupina.  Najpomembnejši od teh so \textbf{inicializacijski skripti},
ki so skripti, ki jih ukazna lupina izvede, ko se prijavite.

Inicializacijski skripti sami so skripti ukazne lupine, vendar
inicializirajo vaše okolje s samodejno izvedbo ukazov ob vaši prijavi.
Če vedno uporabljate ukaz \texttt{mail} za preverbo vaše pošte, ko se
prijavite v sistem, lahko ta ukaz položite v inicializacijski skript,
da se bo izvedel samodejno.

\index{login shell!defined}
Obe ukazni lupini, \texttt{bash} in \texttt{tcsh}, ločita med
\textbf{prijavno ukazno lupino} (angl.\ login shell) in drugimi
priklici ukazne lupine.  Prijavna lupina je lupina, ki se izvede, ko
se prijavite v sistem.  Navadno je to edina ukazna lupina, ki jo
uporabljate.  Vendar če se >>spravite v lupino<< drugega programa, kot
je \texttt{vi}, zaženete drugi primerek ukazne lupine, ki ni vaša
prijavna ukazna lupina.  Poleg tega, če zaženete lupinski skript,
samodejno začnete novo pojavitev lupine, ki izvaja skript.

\index{lupine!inicializacijske datoteke}
\index{inicializacijske datoteke!za lupine}
\index{/etc/profile@\texttt{/etc/profile}}
\index{.bash\_profile@\texttt{.bash\_profile}}
\index{.bashrc@\texttt{.bashrc}}
\index{.profile@\texttt{.profile}}
Inicializacijske datoteke, ki jih uporablja \texttt{bash}, so:
\texttt{/etc/profile} (nastavi jo sistemski upravitelj in se
izvede pri vseh uporabnikih lupine \texttt{bash} v času prijave),
\texttt{\$HOME/.bash\_profile} (izvede jo prijavna seja \texttt{bash}-a),
in \texttt{\$HOME/.bashrc} (izvedejo jo neprijavne pojavitve
\texttt{bash}-a).  Če datoteka \texttt{.bash\_profile} ni prisotna,
se namesto nje uporablja \texttt{.profile}.

\index{/etc/csh.login@\texttt{/etc/csh.login}}
\index{.tcshrc@\texttt{.tcshrc}}
\texttt{tcsh} uporablja naslednje inicializacijske skripte:
\texttt{/etc/csh.login} (ob prijavi se izvede vsem uporabnikom
lupine \texttt{tcsh}), \texttt{\$HOME/.tcshrc} (izvede se ob prijavi
in ob novih pojavitvah \texttt{tcsh}-ja), in \texttt{\$HOME/.login}
(izvede se v času prijave, takoj za \texttt{.tcshrc}).  Če
\texttt{.tcshrc} ne obstaja, se uporablja \texttt{.cshrc}.

Popoln vodnik po programiranju ukaznih lupin bi presegal obseg te
knjige.  Glejte strani priročnika o ukazni lupini \texttt{bash} ali
\texttt{tcsh} za nadaljnje učenje o prilagoditvi vašega okolja Linux.

\index{okolje!prilagoditev|)}
