<!-- To je izvorna koda slovenskega prevoda Unix FAQ
     v formatu SGML. -- >
<!-- Avtor: Ted Timar <tmatimar@isgtec.com>> -- >
<!-- Prevajalec: Roman Maurer <roman.maurer@hermes.si> -- >

<!doctype linuxdoc system> 

<article>

<title>Pogosto zastavljena vprašanja o Unixu
<author>Ted Timar &lt;<tt>tmatimar@isgtec.com</tt>&gt;
<date>v2.9, 11. junij 1996
<!-- Datum prevoda: 26. september 1998 -- >

<abstract>
Pred vami je slovenski prevod spisa Unix FAQ, pogosto zastavljenih
vprašanj z odgovori v novičarskih skupinah <htmlurl
name="comp.unix.questions" url="news:comp.unix.questions"> in <htmlurl
name="comp.unix.shell" url="news:comp.unix.shell">.  Prosim, ne
ponavljajte teh vprašanj, ker so bila zastavljena že velikokrat, in
prosim, ne pljuvajte po ljudeh, ki morda niso videli tega
obvestila. Hvala!
</abstract>

<toc>

<!-- 0 -->
<sect>Administrativni podatki
<p>
<sect1>O tem spisu
<p>
Pred vami je slovenski prevod spisa Unix FAQ, pogosto zastavljenih
vprašanj z odgovori v novičarskih skupinah <htmlurl
name="comp.unix.questions" url="news:comp.unix.questions"> in <htmlurl
name="comp.unix.shell" url="news:comp.unix.shell">.  Prosim, ne
ponavljajte teh vprašanj, ker so bila zastavljena že velikokrat, in
prosim, ne pljuvajte po ljudeh, ki morda niso videli tega
obvestila. Hvala!

Čeprav so vsa vprašanja legitimna, kaže, da se vsako leto znova
pojavljajo v novičarskih skupinah <htmlurl name="comp.unix.questions"
url="news:comp.unix.questions"> in <htmlurl name="comp.unix.shell"
url="news:comp.unix.shell">, navadno z odgovori, od katerih je le
nekaj pravilnih, in skupaj z jadikovanjem o tem, kako so venomer
postavljena enaka vprašanja.  Ob tem boste morda želeli prebrati
mesečni članek ,,<tt>Answers to Frequently Asked Questions</tt>`` v
novičarski skupini <htmlurl url="news:news.announce.newusers"
name="news.announce.newusers">, ki vam bo povedal, kaj pomeni
,,UNIX``.

Pri pestrosti sistemov Unix na svetu je težko zagotoviti, da bodo ta
vprašanja delovala na vseh sistemih.  Vselej preberite strani vašega
lokalnega referenčnega sistemskega priročnika, preden poskušate
storiti karkoli tukaj priporočenega.  Če imate predloge ali popravke
za katerikoli tukajšnji odgovor, ga, prosim, pošljite na <htmlurl
name="tmatimar@isgtec.com" url="mailto:tmatimar@isgtec.com">.

Slovenski prevod je nastal konec leta 1998, ko so nekateri odgovori že
zastareli.  Prevajalec svetuje, da nasvete uporabljate z zrnom soli.
Avtor originalnih Unix FAQ načrtuje novo izdajo, ki jo bomo poskušali
prevesti, če boste pokazali zanimanje za tole različico.  Prevajalec
prosi za kakršnekoli pripombe k prevodu - pošljite jih na <htmlurl
name="roman.maurer@hermes.si"
url="mailto:roman.maurer@hermes.si">.



<sect1>Pravna zaščita
<p>
Zbirko originalnih nasvetov je pravno zaščitil &copy; 1994 Ted Timar,
razen dela <ref id="UNIXflavours" name=",,Pregled različic Unixa``">,
ki sta ga zaščitila &copy; 1994, Pierre Lewis in Ted Timar.  Vse
pravice so pridržane.  Dovoljenje za razširjanje te zbirke imate, če
jo brezplačno razširjate v elektronski obliki, če ste naredili vse
razumne poskuse, da bi uporabili njeno zadnjo različico, če so
hranjene vse tu navedene zasluge in to sporočilo o pravni zaščiti.  O
drugih vprašanjih distribucije se bo premislilo.  Vsem razumnim
zahtevam se bo ugodilo.

Vsi nasveti so bili priporočeni z dobrimi nameni, vendar za njihovo
točnost ne jamčijo niti pisci prispevkov niti avtor te zbirke niti
prevajalec.  Uporabniki v celoti prevzemajo odgovornost za morebitno
povzročeno škodo.

Slovenski prevod te zbirke z dne 26. septembra 1998 je delo Romana
Maurerja.  Za njegovo razširjanje veljajo enaki pogoji kot za izvirno
zbirko.


<sect1>Dostopnost
<p>
Veliko zbirk pogosto zastavljenih vprašanj (krajše PZV; angl. FAQ -
Frequently Asked Questions), vključno s to, je dostopnih z anonimnim
FTP-jem z arhivarskega mesta <url
url="ftp://rtfm.mit.edu/pub/usenet/news.answers/">, ki je zrcaljen
tudi na slovenskem strežniku <url
url="ftp://ftp.arnes.si/usenet/news.answers/">.  Ime, pod katerim se
arhivira PZV, vidite v vrstici ,,<tt>Archive-Name:</tt>`` na vrhu
članka.  Original teh PZV je shranjen pod imeni
,,<tt>unix-faq/faq/part[1-7]</tt>``.

Formatirane različice originalnega spisa Unix FAQ v formatu Texinfo,
tekstovnem formatu in formatu za <tt/*roff/ so dostopne z anonimnim
FTP-jem v imeniku <url
url="ftp://ftp.wg.omron.co.jp/pub/unix-faq/docs/">.

Slovenska različica v formatih TXT, SGML, Postscript in DVI je
dostopna na mestu za anonimni FTP v podimenikih <url
url="ftp://ftp.lugos.si/pub/lugos/doc/FAQ-sl/"> (iščite datoteke
<tt>Unix-FAQ-sl.*</tt>) ali v svetovnem spletu na naslovu <url
url="http://www.lugos.si/delo/slo/HOWTO-sl/Unix-FAQ-sl.html">.


<sect1>Zahvale
<p>
<verb>
Subject: Who helped you put this list together?
Date: Thu Mar 18 17:16:55 EST 1993
</verb>
<p>
Ta spis je ena prvih zbirk pogosto zastavljenih vprašanj (PZV;
angl. Frequently Asked Questions - FAQ).  Prvič je bil sestavljen
julija 1989.

Ted Timar &lt;<htmlurl name="tmatimar@isgtec.com"
url="mailto:tmatimar@isgtec.com">&gt; je prevzel vzdrževanje tega
seznama.  Skoraj vse delo (in zasluge) za sestavljanje te zbirke gredo
Stevu Haymanu.

Veliko zahval dolgujemo tudi ducatom bralcev Useneta. Ti so prispevali
vprašanja, odgovore, popravke in predloge za ta seznam.  Posebna
zahvala gre Maartenu Litmaathu, Guyu Harrisu in Jonathanu Kamensu, ki
so spisali posebej obsežne prispevke.

Temo <ref id="shells" name=",,Vprašanja, povezana z različnimi
ukaznimi lupinami in njihovimi razlikami``"> je pretežno zapisal
Matthew Wicks &lt;<tt>wicks@dcdmjw.fnal.gov</tt>&gt;.

Temo <ref id="UNIXflavours" name=",,Pregled različic Unixa``"> je
pretežno zapisal Pierre (P.) Lewis &lt;<tt>lew@bnr.ca</tt>&gt;.

Kjer je le mogoče, je na vrhu odgovora naveden avtor posameznega
odgovora na vprašanje in datum zadnjega popravka.  Žal sem s to prakso
začel šele nedavno, zato je veliko podatkov nepopolnih.  Bil sem tudi
brezbrižen do podatkov o avtorjih popravkov odgovorov.  Opravičujem se
vsem, ki ste napisali dragocene prispevke, a niste primerno omenjeni.

Originalni dokument je dostopen v formatu <tt/*roff/ (paketi makro
ukazov <tt/ms/ in <tt/mm/).  Andrew Cromarty ga je pretvoril v format
Texinfo.  Marty Leisner &lt;<tt>leisner@sdsp.mc.xerox.com</tt>&gt; je
očistil različico v formatu Texinfo.

Pisci obsežnejših prispevkov tega spisa so lahko omenjeni drugje
ali pa tudi ne, a so:
<itemize>
  <item>Steve Hayman &lt;<tt>shayman@Objectario.com</tt>&gt;
  <item>Pierre Lewis &lt;<tt>lew@bnr.ca</tt>&gt;
  <item>Jonathan Kamens &lt;<tt>jik@mit.edu</tt>&gt;
  <item>Tom Christiansen &lt;<tt>tchrist@mox.perl.com</tt>&gt;
  <item>Maarten Litmaath &lt;<tt>maart@nat.vu.nl</tt>&gt;
  <item>Guy Harris &lt;<tt>guy@auspex.com</tt>&gt;
</itemize>

Dne 26. septembra 1998 s popravki 16. februarja 1999 je Roman Maurer
&lt;<htmlurl name="roman.maurer@hermes.si"
url="mailto:roman.maurer@hermes.si">&gt; ta spis prevedel v
slovenščino.  Hvala Alešu Koširju &lt;<tt>kosir@hermes.si</tt>&gt; za
številne popravke prevoda!


<!-- 1 -->
<sect>Splošna vprašanja
<p>
<sect1>Kaj pomeni številka v oklepajih pri sklicevanju na ,<tt/rm(1)/` ali ,<tt/ctime(3)/`?
<p>
<verb>
Subject: When someone refers to 'rn(1)' ...  the number in parentheses mean?
Date: Tue, 13 Dec 1994 16:37:26 -0500
</verb>
<p>
Številka je videti kot neke vrste klic funkcije, a to ni.  Te številke
pomenijo poglavje ,,Priročnika za Unix`` (angl. ,,Unix manual``), kjer
najdete primerno dokumentacijo.  Napišete lahko
<tscreen><verb>
man 3 ctime
</verb></tscreen>
in s tem pogledate stran o ,,<tt/ctime/`` v tretjem poglavju priročnika.

Tradicionalna poglavja priročnika so:
<descrip> 
  <tag/1/ Ukazi na uporabniškem nivoju
  <tag/2/ Sistemski klici
  <tag/3/ Funkcije v knjižnicah
  <tag/4/ Naprave in gonilniki naprav
  <tag/5/ Datotečni formati
  <tag/6/ Igre
  <tag/7/ Različne zadeve - paketi makro ukazov itd.
  <tag/8/ Ukazi za vzdrževanje in tek sistema
</descrip> 

Nekatere različice Unixa uporabljajo neštevilska imena razdelkov.
Xenix, na primer, uporablja ,,<tt/C/`` za ukaze in ,,<tt/S/`` za
funkcije.  Nekatere novejše različice Unixa se razlikujejo in razumejo
ukaz v obliki ,,<tt>man -s# naslov</tt>`` namesto ,,<tt>man #
title</tt>``.

Vsako poglavje ima uvod, ki ga lahko preberete z ukazom
<tscreen><verb>
man # intro
</verb></tscreen>
kjer je <tt/#/ številka poglavja.

Številka je včasih potrebna, da lahko ločite med ukazom in funkcijo v
knjižnici ali sistemskim klicem z enakim imenom.  Vaš sistem ima na
primer morda ,,<tt>time(1)</tt>``, stran referenčnega priročnika o
ukazu ,<tt/time/` za merjenje časov izvajanja programov, in tudi
,,<tt>time(3)</tt>``, stran referenčnega priročnika o podprogramu
,<tt/time/`, s katerim prikažete trenutni čas.  Uporabite lahko
različici ,,<tt>man 1 time</tt>`` ali ,,<tt>man 3 time</tt>`` in s tem
določite, katera stran priročnika vas zanima.

Pogosto boste našli druge razdelke za lokalne programe ali celo
podrazdelke zgornjih razdelkov - Ultrix ima med drugim razdelke 3m,
3n, 3x in 3yp.

<sect1>Kaj pomeni {kakšen nerazumljiv ukaz na Unixu}?
<p>
<verb>
Subject: What does {some strange unix command name} stand for?
Date: Thu Mar 18 17:16:55 EST 1993
</verb>
<p>
<descrip>
  <tag/awk/ "Aho Weinberger &amp; Kernighan"
    <p>
    Jezik in program, ki ga interpretira, se imenujeta po začetnicah
    priimkov njegovih avtorjev, ki so Al Aho, Peter
    Weinberger in Brian Kernighan.
    <p>
  <tag/grep/ "Global Regular Expression Print"
    <p>
    Izraz <tt/grep/ izhaja iz ukaza za <tt/ed/, ki je 
    izpisal vse vrstice, ki so ustrezale podanemu iskalnemu vzorcu
<tscreen><verb>
g/re/p
</verb></tscreen>
    <p>
    kjer pomeni ,,<tt/re/`` ,,regularni izraz`` (angl. regular expression).
    <p>
  <tag/fgrep/ "Fixed GREP"
    <p>
    <tt/fgrep/ išče le fiksne vzorce.  Črka ,<tt/f/` ni okrajšava
    za ,,fast`` (slov. ,,hitro``) - pravzaprav je ,,<tt>fgrep foobar *.c</tt>``
    navadno počasnejši kot ,,<tt>egrep foobar *.c</tt>``
    (Da, to je nekam presenetljivo.  Poskusite!)
    <p>
    <tt/Fgrep/ je vseeno uporaben, ko iščete v  datoteki
    večje število iskalnih vzorcev, kot jih prenese <tt/egrep/.
    <p>
  <tag/egrep/ "Extended GREP"
    <p>
    <tt/egrep/ uporablja imenitnejše regularne izraze kot <tt/grep/.
    Mnogi ljudje vselej uporabljajo <tt/egrep/, saj uporablja boljše
    algoritme kot <tt/grep/ ali <tt/fgrep/
    in je navadno najhitrejši od njih.
    <p>
  <tag/cat/ "CATenate"
    <p>
    Obrobna angleška beseda ,,catenate`` pomeni ,,spenjati (z verigo)``
    ali ,,povezovati v zaporedja``, kar je točno to, kar naredi
    ,,<tt/cat/`` z eno datoteko ali z več datotekami.  Ne zamenjujte ga
    s C/A/T, (angl. Computer Aided Typesetter, slov. računalniško
    podprti pisalni stroj).
    <p>
  <tag/gecos/ "General Electric Comprehensive Operating Supervisor"
    <p>
    Ko je podjetje General Electric prodalo svojo enoto za velike
    sisteme podjetju Honeywell, je ta izpustil ,,<tt/E/`` iz
    ,,<tt/GECOS/``.
    <p>
    Datoteka z gesli za Unix ima polje ,,<tt>pw_gecos</tt>``.
    To polje je resnični ostanek zgodnjih časov.  Dennis Ritchie
    je poročal:
    <quote>
      Včasih smo poslali tiskalniški izhod ali paketna opravila
      na stroj GCOS.  Polje <tt/gcos/ v datoteki z gesli je bilo
      mesto, v katerega smo stlačili podatke za kartico <tt>$IDENT</tt>.
      Ni ravno elegantno.
    </quote>
    <p>
  <tag/nroff/ "New ROFF"
    <p>
  <tag/troff/ "Typesetter new ROFF"
    <p>
    To sta naslednika programa ,,<tt/roff/``, ki je bil
    ponovna izvedba programa ,,<tt/runoff/`` s sistema Multics in 
    s katerim ste ,,iztirili`` (angl. ,,run off``) dober
    izvod vašega dokumenta.
    <p>
  <tag/tee/ T
    <p>
    Po izrazoslovju vodovodnih inštalaterjev - cepilec pipe
    v obliki črke T.
    <p>
  <tag/bss/ "Block Started by Symbol"
    <p>
    Dennis Ritchie pravi:
    <quote>
      Pravzaprav ta akronim (tako kot smo ga vzeli; morda ima
      druge verjetne etimologije) pomeni ,,Blok se je začel s
      simbolom`` (angl. ,,Block Started by Symbol``).  To je
      bila psevdo-operacija v FAP (Fortran Assembly &lsqb;-hm?&rsqb;
      Program), zbirnik za stroje IBM 704-709-7090-7094.
      Definiral je svoje oznake in rezerviral prostor za dano
      število besed.  Obstajal je še psevdo-operator BES,
      ,,Block Ended by Symbol`` (slov. ,,Blok se je končal
      s simbolom``), ki je počel podobno, a tako, da je bila
      oznaka definirana z zadnjo prirejeno besedo + 1.  (Na teh
      strojih so bile fortranske tabele shranjene v obratnem
      vrstnem redu in so bile 1-začetek.)
      <p>
      Uporaba je razumno primerna in je podobna kot pri standardnem
      nalagalniku Unixa, kjer prirejeni pomnilnik ni potrebno vstaviti
      dobesedno v objekt, pač pa je dostopen prek kazalca
      (angl. ,,the space assigned didn't have to be punched literally
      into the object deck but was represented by a count somewhere``).
    </quote>
    <p>
  <tag/biff/ "BIFF"
    <p>
    Ta ukaz, ki vklopi asinhrono obvestilo o pošti, je bil
    pravzaprav poimenovan po psu v Berkeleyu.  Eric Cooper z
    univerze Carnegie Mellon takole pripoveduje:
    <quote>
      Potrdim lahko izvor imena <tt/biff/, če vas zanima.
      Biff je bilo ime psu Heidi Stettner, ko je bila Heidi
      (in jaz in Bill Joy) študentka na U. C. Berkeley in
      so razvijali zgodnje verzije BSD.  Biff je bil popularen
      med stanovalci Evans Hall in je bil znan po tem, da je
      vselej lajal na poštarja. Od tod ime tega ukaza.
    </quote>
    <p>
  <tag>rc (kot v ,,<tt/.cshrc/`` ali ,,<tt>/etc/rc</tt>``)</tag>
    "RunCom"
    <p>
    ,,<tt/rc/`` izhaja iz ,,<tt/runcom/`` s sistema MIT CTSS
    približno okrog leta 1965.  Brian Kernighan &amp; Dennis Ritchie
    sta takole pripovedovala Vicki Brown:
    <quote>
      Obstajal je pripomoček, ki je izvedel ukaze,
      shranjene v datoteki; imenoval se je ,,<tt/runcom/``,
      okrajšava za ,,run commands`` (slov. poženi ukaze),
      in takšno datoteko smo začeli klicati ,,neki runcom``.
      <p>
      ,,<tt/rc/`` v Unixu je ostalina te uporabe.
    </quote>
    <p>
    ,,<tt/rc/`` je tudi ime ukazne lupine novega operacijskega
    sistema Plan 9.
    <p>
  <tag/Perl/ "Practical Extraction and Report Language" ali
    <p>
  <tag/Perl/ "Pathologically Eclectic Rubbish Lister"
    <p>
    Jezik Perl je zelo popularno orodje avtorja Larryja Walla.
    Je prosto dostopno in popolnoma prenosljivo.  Uporablja
    se za obdelovanje besedil in delo z datotekami,
    ter premošča prepad med ukazno lupino in programiranjem
    v jeziku C (ali med preprostim ukazom iz ukazne vrstice in puljenjem
    svojih las).  Za nadaljne informacije glejte novičarsko
    skupino Useneta <htmlurl name="comp.lang.perl.misc"
    url="news:comp.lang.perl.misc">.
</descrip>
<p>
Knjiga ,,Life with Unix`` Dona Libesa vsebuje mnogo več takšnih
poslastic.



<sect1>Kako deluje most med novičarsko skupino ,,comp.unix.questions``
in elektronskim seznamom ,,info-unix``?
<p>
<verb>
Subject: How does the gateway between "comp.unix.questions" ... work ?
Date: Thu Mar 18 17:16:55 EST 1993
</verb>
<p>
Elektronska seznama ,,info-unix`` in ,,unix-wizards`` sta posebni
poštni različici skupin <htmlurl name="comp.unix.questions"
url="news:comp.unix.questions"> in <htmlurl name="comp.unix.wizards"
url="news:comp.unix.wizards">.  Med vsebino elektronskih poštnih
seznamov in novičarskih skupin ne bi smelo biti razlik.

Če se želite prijaviti na enega teh seznamov, pošljite pismo na
<htmlurl name="info-unix-request@brl.mil"
url="mailto:info-unix-request@brl.mil"> ali <htmlurl
name="unix-wizards-request@brl.mil"
url="mailto:unix-wizards-request@brl.mil">.  Ne pričakujte takojšnjega
odgovora.

Tukaj so podrobnosti, zahvaljujoč vzdrževalcu seznama, Bobu Reschlyju:

<sect2>Pošiljanje na seznama info-UNIX in UNIX-wizards
<p>
Vse, kar pošljete na seznam, se objavi; pisem ne moderiram 
 - BRL deluje le kot prepisovalnik.  Prispevki naročnikov z Interneta
naj bodo poslani na naslov seznama (info-UNIX ali UNIX- wizards);
naslova z ,-request` sta le za dopisovanje z vzdrževalcem seznama
[mano].  Pisma, poslana prek Useneta, naj bodo naslovljene na primerno
novičarsko skupino (<htmlurl name="comp.unix.questions"
url="news:comp.unix.questions"> ali <htmlurl name="comp.unix.wizards"
url="news:comp.unix.wizards">).

Naročniki z Interneta dobivajo pisma dveh vrst: posamezna sporočila in
povzetke pisem.  Pisma, ki prispejo na BRL prek Interneta in BITNET-a
(čez most BITNET-Internet), se takoj razpošljejo na vse naslove na
poštnem seznamu.  Pisma z Useneta se zberejo v povzetke in ti se
dnevno pošljejo na naslove članov na seznamu.

Promet z BITNET-a je precej podoben prometu prek Interneta.  Glavna
razlika je, da vzdržujem le en naslov za pisma, naslovljena na vse
naročnike BITNET-a.  Ta naslov kaže na večji seznam, ki vsebuje
posamezne naročnike BITNET-a.  Tako mora v vsaki smeri le po eno pismo
med BITNET-om in Internetom.

Naročniki USENET-a vidijo le posamezna pisma.  Vsa pisma, odposlana z
Internetu, se razpošiljajo na naš stroj z USENET-om.  Potem se
uvrstijo v primerno novičarsko skupino.  Žal pri sporočilih, ki gredo
prek mostu, pošiljatelj postane ,,<tt>news@brl-adm</tt>``.  To je
trenutno neizbežni stranski učinek premostitvenega programja.

Kar se tiče publike, USENET ima izjemno veliko bralcev - domnevam, da
več tisoč gostiteljev in na desetine tisočev bralcev.  Glavni seznam,
ki ga vzdržujemo tu na BRL, poganja okoli 150 vnosov, od katerih jih
je približno 10% lokalnih redistribucijskih seznamov.  Nimam
natančnega občutka za velikost redistribucije po BITNET-u, a domnevam,
da je približno enake velikosti in sestave kot glavni seznam.  Promet
vsebuje v povprečju od 150 Kb do 400 Kb sporočil na teden.



<sect1>Katere so uporabne knjige o Unixu ali C-ju?
<p>
<verb>
Subject: What are some useful Unix or C books?
Date: Thu Mar 18 17:16:55 EST 1993
</verb>
<p>
Mitch Wright (<tt>mitch@cirrus.com</tt>) vzdržuje dober seznam knjig o
Unixu in C-ju, z opisi in z nekaterimi kratkimi pregledi.  Trenutno je
na njegovem seznamu 167 knjižnih naslovov.

Kopijo tega seznama dobite z anonimnim FTP-ju na naslovu <url
url="ftp://ftp.rahul.net/pub/mitch/YABL/yabl"> (192.160.13.1).
Popravke in predloge pošiljajte na <htmlurl name="mitch@cirrus.com"
url="mailto:mitch@cirrus.com">.

Samuel Ko (<tt>kko@sfu.ca</tt>) vzdržuje še en seznam knjig za Unix.
Ta seznam vsebuje le priporočene knjige in je torej krajši, knjige pa
so razvrščene po kategorijah, kar je morda primernejše, če iščete
določen tip knjige.

Kopijo tega seznama dobite na naslovu <url
url="ftp://rtfm.mit.edu/pub/usenet/news.answers/books/unix">.
Popravke in predloge pošiljajte na <htmlurl name="kko@sfu.ca"
url="mailto:kko@sfu.ca">.

Če ne morete uporabiti anonimnega FTP-ja, pošljite vrstico
,,<tt/help/`` na <htmlurl url="mailto:ftpmail@decwrl.dec.com"
name="ftpmail@decwrl.dec.com"> za navodila o prenašanju datotek po
elektronski pošti.



<sect1>Kaj se je zgodilo s seznamom izgovarjave, ki je bil del tega spisa?
<p>
<verb>
Subject: What happened to the pronunciation list ... ?
Date: Thu Mar 18 17:16:55 EST 1993
</verb>
<p>
Od nastanka v letu 1989 dalje so originalna angleška PZV vključevala
izčrpen seznam izgovarjave, ki ga je vzdrževal Maarten Litmaath
(hvala, Maarten!).  Prvi seznam je pripravil Carl Paukstis
&lt;<tt>carlp@frigg.isc-br.com</tt>&gt;.

Seznam se je upokojil, saj njegov naslov ,,Vprašanja o Unixu`` ne
ustreza.  Še vedno ga lahko najdete kot del široko razširjene datoteke
,,Jargon`` (vzdržuje jo Eric S. Raymond,
&lt;<tt>eric@snark.thyrsus.com</tt>&gt;), ki je veliko primernejši
forum na temo ,,Kako naj izgovorim /* ?``.

Če želite kopijo seznama, se povežite z 133.210.4.4, in jo poiščite v imeniku
<url url="ftp://ftp.wg.omron.co.jp/pub/unix-faq/docs/Pronunciation-Guide">.



<!-- 2 -->
<sect>Relativno osnovna vprašanja, ki jih navadno sprašujejo začetniki
<p>
<sect1>Kako odstranim datoteko z imenom, ki se začne z ,<tt/-/`?
<p>
<verb>
Subject: How do I remove a file whose name begins with a "-" ?
Date: Thu Mar 18 17:16:55 EST 1993
</verb>
Poiščite tak način imenovanja datoteke, da se ne začne s pomišljajem.
Najpreprostejši odgovor je primer
<tscreen><verb>
rm ./-imedatoteke
</verb></tscreen>
(seveda predvidevamo, da je ,,<tt/-imedatoteke/`` v tem primeru v trenutnem
imeniku).

Ta način izogibanja dvoumnemu ,<tt/-/` na začetku imen deluje tudi pri
drugih ukazih.

Veliko ukazov, posebej tistih, ki so bili napisani z uporabo rutine
,,<tt/getopt(3)/`` za razčlembo argumentov, sprejme tudi argument
,,<tt>--</tt>``, ki pomeni ,,to je zadnja izbira, vse po tem ni več
izbira``. Vaša različica <tt/rm/ potemtakem morebiti razume tudi
<tscreen><verb>
rm -- -imedatoteke
</verb></tscreen>
Nekatere različice <tt/rm/, ki ne uporabljajo <tt/getopt()/, razumejo
podobno tudi en sam ,,<tt/-/``, torej lahko poskusite kar z ,,<tt>rm -
-imedatoteke</tt>``.



<sect1>Kako odstranim datoteko, ki ima v svojem imenu čudne znake?
<p>
<verb>
Subject: How do I remove a file with funny characters in the filename ?
Date: Thu Mar 18 17:16:55 EST 1993
</verb>
Če je ,,čuden znak`` znak ,<tt>/</tt>`, preskočite na zadnji del
odgovora.  Če je čuden znak nekaj drugega, na primer presledek ali
kontrolni znak ali znak s prižganim osmim bitom (to so npr.  slovenske
črke ,,<tt>čšžČŠŽ</tt>``), nadaljujte z branjem.

Prvi klasični odgovor je uporaba ukaza na način
<tscreen><verb>
rm -i vzorec*ki*ustreza*le*datoteki*ki*jo*želite
</verb></tscreen>
Ukaz vpraša za vsako datoteko, ki ustreza vzorcu, če jo želite
odstraniti. Nasvet morda v vaši ukazni lupini ne bo deloval zaradi
znakov s prižganim osmim bitom, saj ga ukazna lupina lahko odreže.

Drugi klasični odgovor je
<tscreen><verb>
rm -ri .
</verb></tscreen>
ki vas za vsako datoteko v trenutnem imeniku vpraša, ali naj jo odstrani.

V angleškem okolju odgovorite z ,<tt/y/` pri problematični datoteki in
z ,<tt/n/` pri vseh ostalih datotekah.  Žal to ne deluje pri veliko
različicah <tt/rm/.  Hkrati se bo ukaz izvedel za vse datoteke na vseh
podimenikih trenutnega imenika, torej boste morda začasno hoteli te
imenike narediti nedostopne z ,,<tt>chmod a-x</tt>``, da vas ne bodo
motili.

Vselej globoko vdihnite in razmislite, kaj počnete, ter dvakrat
preverite, kaj ste zapisali v ukazni vrstici, kadar uporabljate
zastavico ,,<tt/-r/`` ukaza <tt/rm/ ali znaka <tt/*/ ali <tt/?/
(angl. wildcard).

Tretji klasični odgovor je
<tscreen><verb>
find . -type f ... -ok rm '{}' \;
</verb></tscreen>
kjer je ,,<tt/.../`` skupina oznak, ki enolično določa ime datoteke.
Ena od možnosti je, da za problematično datoteko poiščete njeno
številko inode (z uporabo ukaza ,,<tt>ls -i .</tt>``) in potem
uporabite
<tscreen><verb>
find . -inum 12345 -ok rm '{}' \;
</verb></tscreen>
ali
<tscreen><verb>
find . -inum 12345 -ok mv '{}' novo-ime-datoteke \;
</verb></tscreen>
,,<tt/-ok/`` je varnostno preverjanje - program vas bo vprašal za
potrditev ukaza, preden ga bo izvedel.  Spraševanju se lahko izognete
z uporabo ,,<tt/-exec/``, če radi živite nevarno, ali če domnevate, da
ime datoteke vsebuje zaporedje čudnih znakov, ki vam bodo ob izpisu
zmešali zaslon.

Kaj, če ime datoteke vsebuje znak ,<tt>/</tt>`?

Te datoteke so res posebni primeri in jih lahko ustvari le hroščata
koda v jedru (tipično jih naredijo implementacije NFS, ki ne počistijo
neveljavnih znakov iz imen datotek na oddaljenih strojih).  Najprej
poskušajte natanko razumeti, zakaj je ta problem tako izjemen.

Spomnite se, da so imeniki v Unixu preprosto pari imen datotek
in številk inode.  Imenik tipično vsebuje podobno informacijo:
<tscreen><verb>
ime datoteke  inode

datoteka1     12345
datoteka2.c   12349
datoteka3     12347
</verb></tscreen>

Teoretično sta ,<tt>/</tt>` in ,<tt>\0</tt>` le dva znaka, ki se ne
moreta pojaviti v imenu datoteke - znak ,<tt>/</tt>` zato, ker se
uporablja za ločevanje imenikov in datotek, in znak ,<tt>\0</tt>`
zato, ker končuje ime datoteke.

Žal nekatere izvedbe omrežnega datotečnega sistema NFS prešerno
ustvarjajo datoteke z vključenimi nagibnicami kot odgovor na zahteve
oddaljenih strojev.  Na primer, to se lahko zgodi, ko se nekdo na Macu
ali drugem ne-Unixu odloči narediti oddaljeno datoteko NFS na vašem
Unixu, z datumom v imenu datoteke.  Vaš imenik na Unixu ima potem v
sebi tole:
<tscreen><verb>
ime datoteke  inode

91/02/07      12357
</verb></tscreen>
Takšne datoteke ne bo pobrisalo nobeno zgoraj opisano čaranje z
ukazoma <tt/find/ in <tt/rm/, saj morata tako tadva pripomočka kot
tudi vsi drugi programi na Unixu razumeti znak ,<tt>/</tt>` na
običajen način.

Vsak običajen program bo želel narediti <tt>unlink("91/02/07")</tt>,
kar jedro razume kot ,,pobriši datoteko <tt/07/ v podimeniku <tt/02/
imenika <tt/91/``, toda to ni tisto, kar hočemo - imamo <bf/datoteko/
imenovano ,,<tt>91/02/07</tt>`` v trenutnem imeniku.  To je komaj
zaznavna, a ključna razlika.

Kaj lahko naredite v tem primeru?  Najprej se poskusite vrniti na
Maca, ki je ustvaril ta nevšečni vnos, in skušajte prepričati Maca in
vaš lokalni strežnik NFS, da datoteko preimenujeta v nekaj, kar ne
vsebuje nagibnic.

Če to ne deluje ali morda ni izvedljivo, boste potrebovali pomoč
vašega sistemskega upravitelja, ki bo moral poskusiti kaj od
naslednjega.  Uporabite ,,<tt>ls -i</tt>``, da boste izvedeli številko
inode nesrečne datoteke, potem odklopite datotečni sistem (z
<tt/umount/), uporabite ,,<tt/clri/`` za izbris inodea, in popravite
datotečni sistem s ,,<tt/fsck/`` in s stisnjenimi pestmi.  Postopek
uniči podatke o datoteki.  Če jih želite obdržati, lahko poskusite:
<itemize>
  <item>ustvarite nov imenik v istem starševskem imeniku, kot ga
    ima imenik, ki vsebuje datoteko na slabem glasu,
  <item>iz starega imenika v novega premaknite vse, kar lahko
  (se pravi vse, razen datoteke s slabim imenom),
  <item>na imeniku z datoteko s slabim imenom napravite ,,<tt>ls -id</tt>`` ,
    da dobite njegovo številko inumber,
  <item>odklopite datotečni sistem,
  <item>uporabite ,,<tt/clri/`` na imeniku, ki vsebuje sporno datoteko,
  <item>obnovite datotečni sistem s ,,<tt/fsck/``.
</itemize>
Potem boste datoteko poiskali takole:
<itemize>
  <item>namestite datotečni sistem;
  <item>preimenujte imenik, ki ste ga ustvarili, tako da bo imel
    enako ime, kot stari imenik (saj je stari imenik dokončno
    pobrisal ,,<tt/fsck/``);
  <item>premaknite datoteko iz imenika ,,<tt/lost+found/`` v imenik
    s primernejšim imenom.
</itemize>
Alternativa temu pristopu je popravljanje imenika na zahteven način
z brkljanjem po surovem datotečnem sistemu (angl. raw file system).
Uporabite ,,<tt/fsdb/``, če ga imate.



<sect1>Kako dobim rekurziven izpis vsebine imenika?
<p>
<verb>
Subject: How do I get a recursive directory listing?
Date: Thu Mar 18 17:16:55 EST 1993
</verb>
<p>
Nekaj od tega bo naredilo to, kar želite:
<tscreen><verb>
ls -R                   (vse različice ,ls` nimajo ,-R`)
find . -print           (to mora delovati povsod)
du -a .                 (pokaže ime in velikost)
</verb></tscreen>
Če iščete vzorec z jokerji (angl. wildcard), ki bo ustrezal
vsem datotekam ,,<tt/.c/`` v tem imeniku in pod njim, ga ne
boste našli, pač pa lahko uporabite:
<tscreen><verb>
% nek-ukaz `find . -name '*.c' -print`
</verb></tscreen>
,,<tt/find/`` je zmogljiv program.  Poučite se o njem.



<sect1>Kako lahko v svoj pozivnik vključim ime trenutnega imenika?<label id="pwdprompt">
<p>
<verb>
Subject: How do I get the current directory into my prompt?
Date: Thu Mar 18 17:16:55 EST 1993
</verb>
<p>
Odvisno od tega, katero ukazno lupino uporabljate.  V nekaterih
ukaznih lupinah je to preprosto, v drugih pa težko ali celo nemogoče.
<p>
<itemize>
  <item>C Shell (<tt/csh/):
    <p>
    Vstavite tole v svojo datoteko
    <tt/.cshrc/ - preuredite spremenljivko pozivnika po svojem
    okusu.
<tscreen><verb>
alias setprompt 'set prompt="${cwd}% "'
setprompt           # nastavitev uvodnega pozivnika
alias cd 'chdir \!* && setprompt'
</verb></tscreen>
    Če uporabljate <tt/pushd/ in <tt/popd/, boste potrebovali
    tudi:
<tscreen><verb>
alias pushd 'pushd \!* && setprompt'
alias popd  'popd  \!* && setprompt'
</verb></tscreen>
    Nekatere lupine <tt/csh/ nimajo spremenljivke <tt/$cwd/
    - namesto tega lahko uporabite <tt/`pwd`/.

    Če želite dobiti v vaš pozivnik le zadnjo komponento vašega
    trenutnega imenik (,,<tt/mail% /`` namesto
    ,,<tt>/usr/spool/mail% </tt>``), lahko uporabite
<tscreen><verb>
alias setprompt 'set prompt="$cwd:t% "'
</verb></tscreen>
    Pomen operatorjev <tt/&&/ in <tt/||/ v nekaterih starejših lupinah
    <tt/csh/ je zamenjan.  Poskusite:
<tscreen><verb>
false && echo napaka
</verb></tscreen>
    Če izpiše ,,<tt/napaka/``, morate zamenjati <tt/&&/ in <tt/||/
    (in dobiti boljšo različico <tt/csh/.)

  <item>Bourne Shell (<tt/sh/):
    <p>
    Če imate novejšo različico Bournove ukazne lupine (SVR2 ali novejšo),
    lahko uporabite za izdelavo svojega ukaza funkcijo lupine,
    denimo ,,<tt/xcd/``:
<tscreen><verb>
xcd() { cd $* ; PS1="`pwd` $ "; }
</verb></tscreen>
    Če imate starejšo Bournovo ukazno lupino, je to zapleteno,
    a mogoče.  Dodajte v vašo datoteko <tt/.profile/:
<tscreen><verb>
LOGIN_SHELL=$$ export LOGIN_SHELL
CMDFILE=/tmp/cd.$$ export CMDFILE
# 16 je SIGURG, izberite signal, ki se navadno ne uporablja
PROMPTSIG=16 export PROMPTSIG
trap '. $CMDFILE' $PROMPTSIG
</verb></tscreen>
    in potem postavite ta izvedljivi skript (brez zamikanja!),
    recimo mu ,,<tt/xcd/`` nekam v vašo pot (<tt/PATH/).
<tscreen><verb>
: xcd directory - change directory and set prompt
: by signalling the login shell to read a command file
cat >${CMDFILE?"not set"} <<EOF
cd $1
PS1="\`pwd\`$ "
EOF
kill -${PROMPTSIG?"not set"} ${LOGIN_SHELL?"not set"}
</verb></tscreen>
    Zdaj spreminjajte imeniku z ukazom ,,<tt>xcd /nek/imenik</tt>``.

  <item>Korn Shell (<tt/ksh/):
    <p>
    Vstavite to v vašo datoteko <tt/.profile/:
<tscreen><verb>
PS1='$PWD $ '
</verb></tscreen>        
    Če želite le zadnjo komponento imenika, uporabite
<tscreen><verb>
PS1='${PWD##*/} $ '
</verb></tscreen>

  <item>T C shell (<tt/tcsh/)
    <p>
    <tt/Tcsh/ je popularna izboljšana različica <tt/csh/
    z nekaterimi dodatnimi vgrajenimi spremenljivkami (in
    veliko drugih zmožnosti):
<tscreen><verb>
%~          trenutni imenik, uporablja ~ za $HOME
%/          polna pot trenutnega imenika
%c ali %.   končna komponenta trenutnega imenika
</verb></tscreen>
    tako, da lahko preprosto ukažete
<tscreen><verb>
set prompt='%~ '
</verb></tscreen>

  <item>BASH (FSF-jeva ukazna lupina ,,Bourne Again SHell``)
    <p>
    Simbol <tt>\w</tt> v <tt>$PS1</tt> daje polno ime poti trenutnega
    imenika, z uporabo <tt/~/ za <tt/$HOME/;  <tt>\W</tt> daje
    osnovno ime (angl. basename) trenutnega imenika.  Torej lahko
    poleg zgornjih rešitev za <tt/sh/ in <tt/ksh/ uporabite tudi
<tscreen><verb>
PS1='\w $ '
</verb></tscreen>
    ali
<tscreen><verb>
PS1='\W $ '
</verb></tscreen>
</itemize>



<sect1>Kako s skriptom ukazne lupine preberem znake s terminala?
<p>
<verb>
Subject: How do I read characters from the terminal in a shell script?
Date: Thu Mar 18 17:16:55 EST 1993
</verb>
<p>
V <tt/sh/, uporabite <tt/read/.  Navadno se uporabi podobna zanka:
<tscreen><verb>
while read vrstica
do
    echo $vrstica
    ...
done
</verb></tscreen>

V <tt/csh/ uporabite <tt>&dollar;&lt;</tt>, kot tukaj:
<tscreen><verb>
while ( 1 )
    set vrstica = "$<"
    if ( "$vrstica" == "" ) break
    ...
end
</verb></tscreen>
Žal se v <tt/csh/ ne da razločevati med prazno vrstico in
koncem datoteke.

Če uporabljate <tt/sh/ in bi radi prebrali <bf>en sam</bf> znak
s terminala, lahko poskusite nekaj podobnega:
<tscreen><verb>
echo -n "Vstavite znak: "
stty cbreak         # ali  stty raw
beriznak=`dd if=/dev/tty bs=1 count=1 2>/dev/null`
stty -cbreak

echo
echo "Hvala, da ste vtipkali $beriznak ."
</verb></tscreen>



<sect1>Kako preimenujem <tt/*.foo/ v <tt/*.bar/ ali spremenim imena datotek v male črke?
<p>
<verb>
Subject: How do I rename "*.foo" to "*.bar", or change file names to lowercase?
Date: Thu Mar 18 17:16:55 EST 1993
</verb>
<p>
Zakaj ne deluje ,,<tt>mv *.foo *.bar</tt>``?  Premislite, kako ukazna
lupina razvija jokerje (angl. wildcards).  Niza ,,<tt/*.foo/`` in
,<tt/*.bar/`` se razvijeta, preden ukaz <tt/mv/ sploh vidi argumente.
Odvisno od vaše ukazne lupine lahko to spodleti na več načinov.
<tt/CSH/ izpiše ,,<tt>No match.</tt>``, ker ne najde ,,<tt/*.bar/``.
<tt/SH/ izvede ,,<tt>mv a.foo b.foo c.foo *.bar</tt>``, kar bo uspelo
le, če imate en sam imenik, ki ustreza ,,<tt/*.bar/``, kar je zelo
neverjetno in skoraj zagotovo ni tisto, kar ste imeli v mislih.

Odvisno od vaše ukazne lupine lahko to storite z zanko, v kateri
poženete ,,<tt/mv/`` na vsaki posamezni datoteki.  Če ima vaš sistem
,,<tt/basename/``, lahko uporabite:
<itemize>
  <item>C Shell:
    <p>
<tscreen><verb>
foreach f ( *.foo )
    set base=`basename $f .foo`
    mv $f $base.bar
end
</verb></tscreen>

  <item>Bourne Shell:
    <p>
<tscreen><verb>
for f in *.foo; do
    base=`basename $f .foo`
    mv $f $base.bar
done
</verb></tscreen>
</itemize>
Nekatere ukazne lupine poznajo posebne mehanizme za zamenjavo
vrednosti spremenljivk
(angl. variable substitution features), tako lahko namesto
ukaza ,,<tt/basename/`` uporabite vgrajene mehanizme, kot so:
<itemize>
  <item>C Shell:
    <p>
<tscreen><verb>
foreach f ( *.foo )
    mv $f $f:r.bar
end
</verb></tscreen>

  <item>Korn Shell:
    <p>
<tscreen><verb>
for f in *.foo; do
    mv $f ${f%foo}bar
done
</verb></tscreen>
</itemize>
Če nimate ukaza ,,<tt/basename/`` ali bi želeli preimenovati
<tt/foo.*/ v <tt/bar.*/, lahko uporabite kar ,,<tt/sed/`` ali podobno
orodje, da predelate ime datoteke, a v splošnem je ideja zanke enaka.
S pripomočkom ,,<tt/sed/`` lahko spremenite imena datotek v ukaze za
<tt/mv/ in pošljete ukaze za izvajanje lupini ,,<tt/sh/``.  Poskusite:
<tscreen><verb>
ls -d *.foo | sed -e 's/.*/mv & &/' -e 's/foo$/bar/' | sh
</verb></tscreen>
Obstaja program Vladimirja Lanina, imenovan ,,<tt/mmv/``, ki opravi
preimenovanje datotek in je bil aprila 1990 objavljen v <htmlurl
name="comp.sources.unix" url="news:comp.sources.unix"> (Volume 21,
<htmlurl name="issues 87 and 88" url="ftp://ftp.rge.com/pub/usenet/sources/comp.sources.unix/volume21/mmv/">).  Omogoča vam uporabo na način
<tscreen><verb>
mmv '*.foo' '=1.bar'
</verb></tscreen>
V ukaznih lupinah zanke, podobne zgornjim, pomagajo pri zamenjavi imen
datotek iz velikih črk v male ali obratno.  Velike črke v imenih
datotek prevedete v male takole:
<itemize>
  <item>
    C Shell:
    <p>
<tscreen><verb>
foreach f ( * )
    mv $f `echo $f | tr '[A-Z]' '[a-z]'`
end
</verb></tscreen>

  <item>Bourne Shell:
    <p>
<tscreen><verb>
for f in *; do
    mv $f `echo $f | tr '[A-Z]' '[a-z]'`
done
</verb></tscreen>

  <item>Korn Shell:
    <p>
<tscreen><verb>
typeset -l l
for f in *; do
    l="$f"
    mv $f $l
done
</verb></tscreen>
</itemize>
Če želite biti posebno temeljiti in pravilno obravnavati datoteke z
izrojenimi imeni (ki vključujejo presledke ali takorekoč karkoli),
boste morali uporabiti:
<itemize>
  <item>Bourne Shell:
    <p>
<tscreen><verb>
for f in *; do
    g=`expr "xxx$f" : 'xxx\(.*\)' | tr '[A-Z]' '[a-z]'`
    mv "$f" "$g"
done
</verb></tscreen>
    Ukaz ,<tt/expr/` vedno izpiše ime datoteke, tudi, če je to
    enako ,<tt/-n/`, ali, če vsebuje ubežna zaporedja za System V,
    kakršno je  ,<tt>\c</tt>`.
    <p>
    Nekatere različice ukaza ,,<tt/tr/`` potrebujejo ,<tt/&lsqb;/` in
    ,<tt/&rsqb;/`, nekatere ju ne.  V tem konkretnem primeru ju je
    povsem neškodljivo vključiti.  Različice ukaza <tt/tr/, ki
    nočejo ,,<tt>&lsqb;&rsqb;</tt>`` bodo primerno mislile, da bi
    morale preslikati ,<tt/&lsqb;/` v ,<tt/&lsqb;/` in ,<tt/&rsqb;/`
    v ,<tt/&rsqb;/`. 

  <item>Če imate nameščen programski jezik ,,<tt/perl/``, lahko
    ta skript Larryja Walla za preimenovanje datotek uporabite
    zelo koristno.  Uporabljate ga lahko za širok spekter sprememb
    imen datotek.
<tscreen><verb>
#!/usr/bin/perl
#
# primeri uporabe skripta rename (avtor lwall):
#       rename 's/\.orig$//' *.orig
#       rename 'y/A-Z/a-z/ unless /^Make/' *
#       rename '$_ .= ".bad"' *.f
#       rename 'print "$_: "; s/foo/bar/ if <stdin> =~ /^y/i' *

$op = shift;
for (@ARGV) {
    $was = $_;
    eval $op;
    die $@ if $@;
    rename($was,$_) unless $was eq $_;
}
</verb></tscreen>
</itemize>



<sect1>Zakaj dobim ob ukazu ,,<tt>rsh gostitelj ukaz</tt>`` &lsqb;kakšno čudno sporočilo o napaki&rsqb;?<label id="rsherr">
<p>
<verb>
Subject: Why do I get [some strange error message] when I "rsh host command" ?
Date: Thu Mar 18 17:16:55 EST 1993
</verb>
(Govorimo o programu za oddaljeno ukazno lupino ,,<tt/rsh/``, ki se
ponekod imenuje ,,<tt/remsh/`` ali ,,<tt/remote/``.  Obstaja tudi
ukazna lupina z omejitvami, imenovana ,,<tt/rsh/``, kar pa je druga
stvar.)

Če vaš oddaljeni račun uporablja C-jevsko ukazno lupino (<tt/csh/), bo
oddaljeni gostitelj pognal <tt/csh/, da bi izvedel vaš ,<tt/ukaz/`, in
ukazna lupina bo prebrala vašo oddaljeno datoteko <tt/.cshrc/.  Morda
ta <tt/.cshrc/ vsebuje ,,<tt/stty/``, ,,<tt/biff/`` ali kakšen drug
ukaz, ki ni primeren za neinteraktivno ukazno lupino.  Nepričakovan
izhod ali sporočilo o napaki pri teh ukazih lahko zapleteta vašo
lupino <tt/rsh/ na čudne načine.

Tukaj je primer.  Denimo, da imate v vaši datoteki <tt/.cshrc/ tole:
<tscreen><verb>
stty erase ^H
biff y
</verb></tscreen>
Dobili boste čudna sporočila, kot je tole:
<tscreen><verb>
% rsh nek-stroj date
stty: : Can't assign requested address
Where are you?
Tue Oct  1 09:24:45 EST 1991
</verb></tscreen>
Podobne napake lahko dobite, če izvajate določena opravila pripomočkov
,,<tt/at/`` ali ,,<tt/cron/``, ki prav tako bereta vašo datoteko
<tt/.cshrc/.

Na srečo je popravek preprost.  Zelo verjetno je v vaši datoteki
,,<tt/.cshrc/`` <bf>na kupe</bf> operacij, ki jih preprosto ni vredno
izvajati drugje kot v interaktivnih ukaznih lupinah (npr. ,,<tt>set
history=N</tt>``).  Tedaj jih postavite v pogojni blok v vaši
,,<tt/.cshrc/`` z
<tscreen><verb>
if ( $?prompt ) then
        operacije...
endif
</verb></tscreen>
Ker v neinteraktivnih ukaznih lupinah spremenljivka ,,<tt/prompt/`` ni
nastavljena, bodo sporne operacije izvedene le v interaktivnih ukaznih
lupinah.

Morda boste želeli premakniti nekatere ukaze v vaš prijavni skript
<tt/.login/.  Če se morajo ti ukazi izvesti le ob vaši prijavi na
sistem (iskanje nove pošte, neprebranih novičarskih sporočil in tako
naprej), jih je bolje imeti v datoteki <tt/.login/.



<sect1>Kako naj {nastavim  spremenljivko okolja, spremenim imenik} znotraj programa ali skripta ukazne lupine in dosežem, da bo to upoštevala moja trenutna ukazna lupina?
<p>
<verb>
Subject: How do I ... and have that change affect my current shell?
Date: Thu Mar 18 17:16:55 EST 1993
</verb>
<p>
V splošnem tega ne morete storiti, vsaj ne brez posebnih priprav.  Ko
nek proces ustvari svoj podproces, ta podeduje kopijo spremenljivk
svojega očeta (vključno s trenutnim imenikom).  Otrok lahko spremeni
podedovane vrednosti, kolikor hoče, vendar te spremembe ne bodo
prizadele starševskega okolja, saj otrok spreminja le svojo kopijo
originalnih podatkov.

Možne so nekatere posebne priprave.  Vaš otroški proces lahko izpiše
spremenjene spremenljivke, če je oče vnaprej pripravljen prebrati ta
izhod in ga razumeti tako, da ustrezno nastavi svoje lastne
spremenljivke.

Ukazne lupine lahko izvajajo skripte tudi v okolju osnovnega procesa,
namesto v okolju podprocesa, in tedaj bodo spremembe prizadele tudi
osnovno ukazno lupino.

Na primer, če je vašemu skriptu za <tt/csh/ ime ,,<tt/mojskript/`` in
ta vsebuje:
<tscreen><verb>
cd /zelo/dolga/pot setenv PATH /nekaj:/nekaj-drugega
</verb></tscreen>
ali če imate podoben skript za Bournovo ali Kornovo ukazno lupino
<tscreen><verb>
cd /zelo/dolga/pot PATH=/nekaj:/nekaj-drugega export PATH
</verb></tscreen>
in poskušate pognati ,,<tt/mojskript/`` v vaši ukazni lupini, se bo
vaša ukazna lupina razvejila in pognala lupinski skript kot svoj
podproces, v katerem bo izvedla ukaz ,,<tt/cd/``.  Ta bo spremenil
<bf/svoj/ trenutni imenik, in z ukazom ,,<tt/setenv/`` spremenil
<bf/svoje/ okolje, vendar nobeden od ukazov ne bo vplival na trenutni
imenik ukazne lupine, v katerem tipkate (vaše prijavne ukazne lupine,
denimo).

Če želite prepričati vašo prijavno ukazno lupino, da požene skript v
trenutnem procesu (brez razvejevanja), morate uporabiti ukaz
,,<tt/./`` (za Bournovo ali Kornovo lupino) ali ukaz ,,<tt/source/``
(za lupino C).  Se pravi, v Bournovih ali Kornovih ukaznih
lupinah napišete
<tscreen><verb>
. mojaskripta
</verb></tscreen>
v lupini C pa
<tscreen><verb>
source myscript
</verb></tscreen>
<p>
Če je vse, kar poskušate storiti, le sprememba imenika ali nastavitev
spremenljivke okolja, bo verjetno najlažje, da uporabite vzdevek
(angl. alias) v lupini C ali funkcijo v Bournovi/Kornovi ukazni
lupini.  Glejte razdelek <ref id="pwdprompt" name=",,Kako lahko dobim
trenutni imenik v moj pozivnik?``"> za nekaj primerov.

Veliko bolj podroben odgovor je pripravil Thomas Michanek
&lt;<tt>xtm@telelogic.se</tt>&gt;.  Dobite ga lahko po
FTP-ju z naslova <url
url="ftp://ftp.wg.omron.co.jp/pub/unix-faq/docs/script-vs-env">.



<sect1>Kako lahko v <tt/csh/ ločeno preusmerim stdout in stderr?
<p>
<verb>
Subject: How do I redirect stdout and stderr separately in csh?
From: msb@sq.com (Mark Brader)
Date: Mon, 26 Oct 1992 20:15:00 -0500
</verb>
<p>
V <tt/csh/ lahko preusmerite stdout z ,,<tt/&gt;/`` ter hkrati stdout in
stderr  z ,,<tt/&gt;&amp;/``, a ni neposrednega načina
le za preusmeritev stderr.  Najboljše, kar lahko naredite, je
<tscreen><verb>
( ukaz &gt;datoteka_za_stdout ) &gt;&amp;datoteka_za_stderr
</verb></tscreen>
ki požene ,,<tt/ukaz/`` v ukazni podlupini; stdout se preusmeri
znotraj podlupine v datoteko ,,<tt/datoteka_za_stdout/``, stdout
in stderr podlupine pa se skupaj preusmerita v datoteko
,,<tt/datoteka_za_stderr/``, toda na tej točki je stdout že
preusmerjen, tako da v datoteki ,,<tt/datoteka_za_stderr/`` konča
pravzaprav le stderr.

Če želite le preprečiti preusmeritev stdout,
tedaj to za vas stori <tt/sh/:
<tscreen><verb>
sh -c 'ukaz 2>datoteka_za_stderr'
</verb></tscreen>



<sect1>Kako znotraj <tt/.cshrc/ ugotovim, ali sem prijavna ukazna lupina?
<p>
<verb>
Subject: How do I tell inside .cshrc if I'm a login shell?
Date: Thu Mar 18 17:16:55 EST 1993
</verb>
<p>
Ko ljudje govorijo tako, pravzaprav s tem mislijo nekaj od naslednjega:
<itemize>
  <item>Kako lahko ugotovim, ali gre za interaktivno ukazno lupino?  ali pa
  <item>Kako lahko ugotovim, ali gre za najvišje nivojsko ukazno lupino?
</itemize>
<p>
Morda lahko ugotovite, ali je vaša ukazna lupina resnično prijavna
lupina (se pravi, bo prebrala ,,<tt/.login/`` potem, ko bo opravila
z ,,<tt/.cshrc/``) tako, da zapravljate čas s ,,<tt/ps/`` in ,,<tt/$$/``.
Prijavne lupine imajo v splošnem imena, ki se začnejo s ,<tt/-/`.
Če vas v resnici zanimata drugi dve vprašanji, je tukaj način organizacije
vaše datoteke <tt/.cshrc/, da to izveste.
<code>
if (! $?CSHLEVEL) then
        #
        # To je "najvišjenivojska" ukazna lupina,
        # morda prijavna lupina, morda lupina, pognana z
        # 'rsh stroj nek-ukaz'
        # Tukaj moramo nastaviti pot PATH in vse drugo,
        # kar želimo imeti v vsaki od naših ukaznih lupin.
        #
        setenv      CSHLEVEL        0
        set home = ~username        # za vsak slučaj
        source ~/.env               # nastavimo okolje
else
        #
        # Ta lupina je otrok ene od drugih ukaznih lupin, zato
        # nam ni treba ponovno nastaviti vseh spremenljivk okolja.
        #
        set tmp = $CSHLEVEL
        @ tmp++
        setenv      CSHLEVEL        $tmp
endif

# Izhod iz .cshrc, če ni interaktivna, npr. pod rsh.
if (! $?prompt) exit

# Tukaj smemo nastaviti pozivnik ali vzdevke, ki bi bili
# uporabni le za interaktivne ukazne lupine.

source ~/.aliases
</code>



<sect1>Kako v lupini naredim ujemalni vzorec, ki se ujema z vsemi datotekami, razen z ,,<tt/./`` in ,,<tt/../``?
<p>
<verb>
Subject: How do I construct a ... matches all files except "." and ".." ?
Date: Thu Mar 18 17:16:55 EST 1993
</verb>
<p>
In vi ste mislili, da bo to preprosto ...
<descrip>
  <tag><tt/*/</tag>
    Ustreza vsem datotekam, ki se ne začenjajo z ,,<tt/./``;

  <tag><tt>.*</tt></tag>
    Ustreza vsem datotekam, ki se začenjajo z ,,<tt/./``, toda
    to vključuje posebna vnosa ,,<tt/./`` in ,,<tt/../``, ki
    ju pogosto ne želite;

  <tag><tt>.[!.]*</tt></tag>
    (Le novejše ukazne lupine; nekatere lupine uporabljajo ,,<tt/^/``
    namesto ,,<tt/!/``; ukazne lupine POSIX-a morajo sprejeti
    ,,<tt/!/``, a lahko sprejmejo tudi ,,<tt/^/``; prenosljive
    aplikacije ne bi smele uporabljati necitiranega ,,<tt/^/``
    takoj za ,,<tt/&lsqb;/``.)
    <p>
    Ustreza vsem datotekam, ki se začnejo z ,,<tt/./`` in jim
    sledi ne-,,<tt/./``; žal bo to spregledalo ,,<tt/..foo/``;

  <tag><tt>.??*</tt></tag>
    Ustreza datotekam, ki se začnejo z ,,<tt/./`` in so dolge
    vsaj tri znake.  To se prikupno izogne ,,<tt/./`` in ,,<tt/../``,
    a tudi spregleda ,,<tt/.a/``.
</descrip>
Če želite varno ujemanje z vsemi datotekami, razen ,,<tt/./`` in
,,<tt/../``, morate uporabiti 3 vzorce (če nimate imen datotek, kot je
,,<tt/.a/``, lahko izpustite prvega):
<tscreen><verb>
.[!.]* .??* *
</verb></tscreen>
Alternativno lahko zaposlite zunanji program ali dva in uporabite
substitucijo znotraj narekovaja (angl. backquote substitution).
To (ali ,<tt>ls -A</tt>` na nekaterih različicah Unixa) je precej
dobro:
<tscreen><verb>
`ls -a | sed -e '/^\.$/d' -e '/^\.\.$/d'`
</verb></tscreen>
a tudi to bo zamočilo pri datotekah z znaki za novo vrsto,
znaki IFS ali jokerjih v njihovih imenih.

V <tt/ksh/ lahko uporabite:
<tscreen><verb>
.!(.|) *
</verb></tscreen>



<sect1>Kako poiščem zadnji argument v skriptu Bournove ukazne lupine?
<p>
<verb>
Subject: How do I find the last argument in a Bourne shell script?
Date: Thu Mar 18 17:16:55 EST 1993
</verb>
<p>
Odgovor sta prispevala:
<itemize>
  <item>Martin Weitzel
    &lt;<tt>@mikros.systemware.de</tt>:<tt>martin@mwtech.uucp</tt>&gt;
  <item>Maarten Litmaath &lt;<tt>maart@nat.vu.nl</tt>&gt;
</itemize>
Če ste prepričani, da argumentov ni več kot devet, potem lahko uporabite:
<tscreen><verb>
eval zadnji=\${$#}
</verb></tscreen>
<p>
V ukaznih lupinah, združljivih s standardom POSIX, to deluje
za <bf/vsako/ število argumentov.  Vselej deluje tudi:
<tscreen><verb>
for zadnji
do
        :
done
</verb></tscreen>
Primer se posploši takole:
<tscreen><verb>
for i
do
        predpredzadnji=$predzadnji
        predzadnji=$zadnji
        zadnji=$i
done
</verb></tscreen>
Zdaj pa denimo, da želite <bf/odstraniti/ zadnji argument iz seznama
ali <bf/obrniti/ seznam argumentov ali za vsak <em/N/ <bf/dostopati/
neposredno do <em/N/-tega argumenta.  Tukaj navajamo osnovni primer,
kako to storiti, in uporabimo le vgrajene konstrukte ukazne lupine, ne
da bi ustvarjali dodatne podprocese:
<tscreen><verb>
t0= u0= ostanek='1 2 3 4 5 6 7 8 9' argv=

for h in '' $ostanek
do
	for t in "$t0" $ostanek
	do
		for u in $u0 $ostanek
		do
			case $# in
			0)
				break 3
			esac
			eval argv$h$t$u=\$1
			argv="$argv \"\$argv$h$t$u\""   # (1)
			shift
		done
		u0=0
	done
	t0=0
done

# zdaj obnovimo argumente
eval set x "$argv"                                      # (2)
shift
</verb></tscreen>
Ta primer deluje za prvih 999 argumentov.  Dovolj?  Dobro poglejte
vrstici, označeni z (1) in (2) in se prepričajte, da se originalni
argumenti res obnovijo, ne glede na to, katere čudne znake vsebujejo!

<em/N/-ti argument lahko zdaj poiščete takole:
<tscreen><verb>
eval argN=\$argv$N
</verb></tscreen>
Če želite obrniti argumente, morate spremeniti vrstico, označeno z (1),
<tscreen><verb>
argv="\"\$argv$h$t$u\" $argv"
</verb></tscreen>
Kako odstranite zadnji argument, vam prepuščamo za nalogo.

Če dovoljujete tudi podprocese, ki morda izvajajo nevgrajene
ukaze, lahko spremenljivke ,<tt>argv<em/N/</tt>` določite
preprosteje:
<tscreen><verb>
N=1

for i
do
	eval argv$N=\$i
	N=`expr $N + 1`
done
</verb></tscreen>
Za obračanje argumentov obstaja še preprostejša metoda, ki niti ne
ustvarja podprocesov.  Ta pristop lahko uporabite tudi, ko želite
pobrisati npr. zadnji argument, a v tem primeru se ne morete več
sklicevati neposredno na <em/N/-ti argument, saj so spremenljivke
,<tt>argv<em/N/</tt>` nastavljene v obratnem vrstnem redu:
<tscreen><verb>
argv=

for i
do
	eval argv$#=\$i
	argv="\"\$argv$#\" $argv"
	shift
done

eval set x "$argv"
shift
</verb></tscreen>



<sect1>Kaj je narobe, če imam ,<tt/./` v svoji poti <tt/$PATH/?
<p>
<verb>
Subject: What's wrong with having '.' in your $PATH ?
Date: Thu Mar 18 17:16:55 EST 1993
</verb>
<p>
Malce ozadja: spremenljivka okolja <tt/PATH/ je seznam imenikov,
ločenih z dvopičji.  Ko vpišete ukaz brez jasno določene poti
(npr. napišete ,,<tt/ls/`` in ne ,,<tt>/bin/ls</tt>``), vaša ukazna
lupina išče izvedljivo datoteko s tem imenom po vseh imenikih,
naštetih v seznamu <tt/PATH/, lepo po vrsti, in izvede prvi program,
ki ga najde.

Eden od imenikov v seznamu <tt/PATH/ je lahko tudi trenutni imenik
,,<tt/./``.  Kot znak za trenutni imenik v seznamu <tt/PATH/ lahko
uporabite tudi prazni imenik.  Ta dva načina označevanja sta
ekvivalentna:
<itemize>
  <item>za uporabnike <tt/csh/:
<tscreen><verb>
setenv PATH :/usr/ucb:/bin:/usr/bin
setenv PATH .:/usr/ucb:/bin:/usr/bin
</verb></tscreen>
  <item>za uporabnike <tt/sh/ ali <tt/ksh/:
<tscreen><verb>
PATH=:/usr/ucb:/bin:/usr/bin export PATH
PATH=.:/usr/ucb:/bin:/usr/bin export PATH
</verb></tscreen>
</itemize>
Posestvovanje ,,<tt/./`` nekje v <tt/PATH/ je udobno - za poganjanje
programov v trenutnem imeniku lahko namesto ,,<tt>./a.out</tt>``
napišete ,,<tt/a.out/``.  A obstaja kavelj.

Premislite, kaj se zgodi v primeru, da je ,,<tt/./`` prvi vnos v
seznamu <tt/PATH/.  Denimo, da je vaš trenutni imenik javno dostopen
za pisanje, na primer ,,<tt>/tmp</tt>``.  Če je tam slučajno program,
imenovan ,,<tt>/tmp/ls</tt>``, ki ga je tam pustil kak drug uporabnik,
ter vi napišete ,,<tt/ls/`` (namesto, da bi, seveda, pognali običajen
program ,,<tt>/bin/ls</tt>``), bo vaša ukazna lupina pognala
,,<tt>./ls</tt>``, program tistega drugega uporabnika.  Odveč je
napisati, da vas lahko poganjanje neznanega programa, kot je ta,
nadvse preseneti.

Bolje je postaviti oznako za trenutni imenik ,,<tt/./`` na konec <tt/PATH/:
<tscreen><verb>
setenv PATH /usr/ucb:/bin:/usr/bin:.
</verb></tscreen>
Če ste zdaj v imeniku <tt>/tmp</tt> in napišete ,,<tt/ls/``, bo ukazna
lupina najprej preiskala <tt>/usr/ucb</tt>, <tt>/bin</tt> in
<tt>/usr/bin</tt> za program, imenovan ,,<tt/ls/``, preden bo
pogledala v ,,<tt/./``, kar daje manj možnosti, da bi nehote pognali
program ,,<tt/ls/`` drugega uporabnika.  Tudi to ni povsem varno - če
ste neroden strojepisec in nekega dne napišete ,,<tt>sl -l</tt>``
namesto ,,<tt>ls -l</tt>``, tvegate, da boste pognali
,,<tt>./sl</tt>``, če ta obstaja.  Kak ,,bister`` programer lahko
računa na pogoste tipkarske napake in pušča programe s takimi imeni
raztrosene po javnih imenikih.  Pazite!

Veliko izkušenih uporabnikov Unixa shaja povsem dobro, ne da bi sploh
imeli ,,<tt/./`` vključen v <tt/PATH/:
<tscreen><verb>
setenv PATH /usr/ucb:/bin:/usr/bin
</verb></tscreen>
Če naredite to, boste morali za zagon programov vselej pisati
,,<tt>./program</tt>`` namesto <tt/program/, a povečanje varnosti je
verjetno vredno tega truda.



<sect1>Kako lahko iz skripta ukazne lupine zapiskam na terminalu?
<p>
<verb>
Subject: How do I ring the terminal bell during a shell script?
From: uwe@mpi-sb.mpg.de (Uwe Waldmann)
Date: Fri, 30 Apr 93 16:33:00 +0200
</verb>
<p>
Odgovor je odvisen od različice vašega Unixa (ali raje od vrste
programa ,,<tt/echo/``, ki je na voljo na vašem stroju).

BSD-jevski ,,<tt/echo/`` uporablja izbiro ,,<tt/-n/`` za preprečitev
izpisa končnega znaka za konec vrstice (angl. final newline) in ne
razume osmiškega zapisa <em>\nnn</em>.  Ukaz se torej glasi
<tscreen><verb>
echo -n '^G'
</verb></tscreen>
kjer <tt>^G</tt> pomeni <bf/dobesedni/ znak BEL (vstavite ga lahko
v Emacsu s kombinacijo ,,Ctrl-Q Ctrl-G`` ali v <tt/vi/ z uporabo
,,Ctrl-V Ctrl-G``).

Na Unixih SysV ukaz ,,<tt/echo/`` razume zapis <em>\nnn</em> in uporablja
<tt>\c</tt> za preprečitev izpisa končnega znaka za konec vrstice,
torej je odgovor:
<tscreen><verb>
echo '\007\c'
</verb></tscreen>



<sect1>Zakaj ne morem uporabiti programa ,,<tt/talk/`` za pogovor s prijateljem na stroju X?
<p>
<verb>
Subject: Why can't I use "talk" to talk with my friend on machine X?
From: tmatimar@isgtec.com (Ted Timar)
Date: Thu Mar 18 17:16:55 EST 1993
</verb>
Unix ima tri razširjene programe ,,<tt/talk/`` in nobeden od njih se
ne zna pogovoriti z ostalima.  ,,Stari`` <tt/talk/ vključuje prva dva
tipa.  Ta različica (pogosto imenovana <tt/otalk/) pri pogovoru med
stroji ni upoštevala vrstnega reda bytov.  Zaradi tega se različica
<tt/otalk/ za Vax ni mogla pogovarjati z različico <tt/otalk/ za Sun.
Te različice <tt/talk/-a uporabljajo vrata 517.

Okoli leta 1987 se je večina proizvajalcev (razen Suna, ki je
potreboval šest let več od svojih tekmecev) dogovorila o standardu za
novi program <tt/talk/ (pogosto imenovan <tt/ntalk/), ki ve za omrežni
vrstni red bytov.  Ta <tt/talk/ deluje med vsemi stroji, ki ga
podpirajo.  Ta različica <tt/talk/-a uporablja vrata 518.

Dandanes obstaja nekaj programov <tt/talk/, ki hkrati govorijo
<tt/ntalk/ in eno od različic <tt/otalk/.  Najbolj znan med njimi se
imenuje ,,<tt/ytalk/``.



<sect1>Zakaj da koledar napačen izpis?
<p>
<verb>
Subject: Why does calendar produce the wrong output?
From: tmatimar@isgtec.com (Ted Timar)
Date: Thu Sep  8 09:45:46 EDT 1994
</verb>
Pogosto ljudje ugotovijo, da izhod Unixovega koledarskega
programa ,,<tt/cal/`` ne ustreza njihovim pričakovanjem.

Koledar za september 1752 je zelo čuden:
<tscreen><verb>
   September 1752
 S  M Tu  W Th  F  S
       1  2 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
</verb></tscreen>
To je mesec, v katerem so ZDA (pravzaprav celoten Britanski Imperij)
zamenjale julijanski koledar z gregorijanskim.

Drug pogost problem, ki ga imajo ljudje s koledarskim programom, je,
da mu podajajo argumente kot je ,,<tt>cal 9 94</tt>``.  To izpiše
koledar za september leta 94, <bf/ne/ pa leta 1994.




<!-- 3 -->
<sect>Vmesna vprašanja
<p>
<sect1>Kako lahko ugotovim čas, ko je bila datoteka ustvarjena?
<p>
<verb>
Date: Thu Mar 18 17:16:55 EST 1993
</verb>
<p>
Ne morete ga - nikjer se ne shrani.  Datoteke imajo podatke o času
zadnje spremembe (pokaže ga ,,<tt>ls -l</tt>``), času zadnjega dostopa
(pokaže ga ,,<tt> ls -lu</tt>``) in času zadnje spremembe inode
(pokaže ga ,,<tt>ls -lc</tt>``).  Zadnji se pogosto imenuje ,,čas
ustvarjenja`` - celo v nekaterih straneh referenčnega priročnika (za
<tt/man/) - a to je narobe; spremeni se tudi z operacijami kot so
<tt/mv/, <tt/ln/, <tt/chmod/, <tt/chown/ in <tt/chgrp/.

Pojasnila so dostopna v poglavju referenčnega priročnika o <tt>stat(2)</tt>.



<sect1>Kako lahko uporabim <tt/rsh/, ne da bi rsh počakal konec oddaljenega ukaza?
<p>
<verb>
Subject: How do I use "rsh" without having the rsh hang around ... ?
Date: Thu Mar 18 17:16:55 EST 1993
</verb>
<p>
(Glejte odgovor na vprašanje <ref id="rsherr" name=",,Zakaj dobim ob
ukazu rsh gostitelj ukaz {kakšno čudno sporočilo o napaki}?``">, o
katerem ,,<tt/rsh/`` govorimo.)

Očitni odgovori odpovejo:
<tscreen><verb>
rsh stroj ukaz &
</verb></tscreen>
ali
<tscreen><verb>
rsh stroj 'ukaz &'
</verb></tscreen>

Na primer, poskusite narediti
<tscreen><verb>
rsh stroj 'sleep 60 &'
</verb></tscreen>
in videli boste, da <tt/rsh/ ne bo takoj vrnil ukazne vrstice.
Počakal bo 60 sekund, dokler se ne bo oddaljeni ukaz ,,<tt/sleep/``
izvedel do konca, čeprav se ukaz na oddaljenem stroju požene v ozadju.
Kako torej pripravite <tt/rsh/ do tega, da konča z delom takoj, ko
začne teči <tt/sleep/?

Rešitev - če uporabljate na oddaljenem stroju <tt/csh/:
<tscreen><verb>
rsh machine -n 'command &gt;&amp;/dev/null &lt;/dev/null &amp;'
</verb></tscreen>
Če na oddaljenem stroju uporabljate <tt/sh/:
<tscreen><verb>
rsh machine -n 'command &gt;/dev/null 2&gt;&amp;1 &lt;/dev/null &amp;'
</verb></tscreen>

Zakaj? ,,<tt>-n</tt>`` poveže standardni vhod ukaza <tt/rsh/ na
<tt>/dev/null</tt>, torej lahko poženete celotni ukaz <tt/rsh/ v
ozadju na <bf/lokalnem/ stroju.  Torej ima ,,<tt>-n</tt>``
ekvivalenten pomen, kot da bi še enkrat določili ,,<tt>&lt;
/dev/null</tt>``.  Še več, preusmeritve vhoda in izhoda na
<bf/oddaljenem/ stroju (znotraj enojnih narekovajev) zagotavljajo, da
<tt/rsh/ misli, da se seja lahko prekine (ker ni več toka podatkov).

Opomba: Datoteko, na katero ali s katere preusmerjate na oddaljenem
računalniku ni nujno <tt>/dev/null</tt>; katerakoli datoteka bo v
redu.

V veliko primerih različni deli tega zapletenega ukaza niso potrebni.



<sect1>Kako lahko skrajšam datoteko?
<p>
<verb>
Subject: How do I truncate a file?
Date: Mon, 27 Mar 1995 18:09:10 -0500
</verb>
<p>
Funkcija BSD-ja <tt>ftruncate()</tt> nastavi dolžino datoteke.  (Toda
vse različice se ne obnašajo enako.)  Kaže, da tudi druge različice
Unixa podpirajo neke vrste krajšanje.

Obstajajo tri znana obnašanja funkcije <tt/ftruncate/ v sistemih,
ki jo podpirajo:
  <itemize>
    <item>BSD 4.2
      <itemize>
        <item>Ultrix, SGI, LynxOS
        <item>krajšanje ne poveča datoteke
        <item>krajšanje ne premika datotečnega kazalca
      </itemize>
    <item>BSD 4.3
      <itemize>
        <item>SunOS, Solaris, OSF/1, HP/UX, Amiga
        <item>krajšanje lahko poveča datoteko
        <item>krajšanje ne premika datotečnega kazalca
      </itemize>
    <item>Cray
      <itemize>
        <item>UniCOS 7, UniCOS 8
        <item>krajšanje ne poveča datoteke
        <item>krajšanje spremeni datotečni kazalec
      </itemize>
  </itemize>

Ostali sistemi pridejo v štirih možnostih:
  <itemize>
    <item><tt/F_CHSIZE/ 
      <itemize>
        <item>le SCO
        <item>nekateri sistemi definirajo izraz <tt>F_CHSIZE</tt>,
          a ga ne podpirajo
        <item>obnaša se kot BSD 4.3
      </itemize>
    <item><tt/F_FREESP/
      <itemize>
        <item>le Interative Unix
        <item>nekateri sistemi (npr. Interative Unix) definirajo
          izraz <tt>F_FREESP</tt>, a ga ne podpirajo
        <item>obnaša se kot BSD 4.3
      </itemize>
    <item><tt>chsize()</tt>
      <itemize>
        <item>QNX in SCO
        <item>nekateri sistemi (npr. Interative Unix) imajo
          funkcijo <tt>chsize()</tt>, a je ne podpirajo
        <item>obnaša se kot BSD 4.3
      </itemize>
    <item>nič
      <itemize>
        <item>ni znanih sistemov
        <item>tukaj bodo sistemi, ki sploh ne podpirajo <tt/truncate/
      </itemize>
  </itemize>

Moderatorjevo sporočilo: Spodnje funkcije sem posnel nekaj let nazaj.
Ne morem več ugotoviti prvotnega pisca.  S. Spencer Sun
&lt;<tt>spencer@ncd.com</tt>&gt; je tudi prispeval verzijo za
<tt/F_FREESP/.

Sledijo funkcije za neavtohtono funkcijo <tt/ftruncate/.

<code>
/* Emulacije ftruncate(), ki delujejo na nekaterih Systemih V.
   Ta datoteka je v javni lasti. */

#include
#include

#ifdef F_CHSIZE

int
ftruncate (fd, length)
     int fd;
     off_t length;
{
  return fcntl (fd, F_CHSIZE, length);
}
#else
#ifdef F_FREESP
/* Naslednjo funkcijo je napisal
   kucharsk@Solbourne.com (William Kucharski) */

#include 
#include 
#include 

int
ftruncate (fd, length)
     int fd;
     off_t length;
{
  struct flock fl;
  struct stat filebuf;
  
  if (fstat (fd, &amp;filebuf) < 0)
    return -1;
  
  if (filebuf.st_size < length)
    {
      /* Extend file length. */
      if (lseek (fd, (length - 1), SEEK_SET) < 0)
	return -1;
      
      /* Write a "0" byte. */
      if (write (fd, "", 1) != 1)
	return -1;
    }
  else
    {
      /* Truncate length. */
      fl.l_whence = 0;
      fl.l_len = 0;
      fl.l_start = length;
      fl.l_type = F_WRLCK;      /* Zapiši ključavnico na prostor datoteke. */

      /* To se zanaša na NEDOKUMENTIRAN argument F_FREESP funkcije
	 fcntl, ki skrajša datoteko tako, da se konča na položaju,
	 ki ga določa fl.l_start.
	 Se manjša čudesa nikoli ne bodo končala? */
      if (fcntl (fd, F_FREESP, &amp;fl) &lt; 0)
	return -1;
    }

  return 0;
}
#else
int
ftruncate (fd, length)
     int fd;
     off_t length;
{
  return chsize (fd, length);
}
#endif
#endif
</code>



<sect1>Zakaj simbol ,,<tt/{}/`` ukaza <tt/find/ ne naredi to, kar želim?
<p>
<verb>
Subject: Why doesn't find's "{}" symbol do what I want?
Date: Thu Mar 18 17:16:55 EST 1993
</verb>
<p>
Ukaz <tt/find/ ima izbiro <tt/-exec/, ki izvede podani ukaz na vseh
izbranih datotekah.  Ukaz <tt/find/ zamenja vse nize ,,<tt/{}/``, ki
jih vidi v ukazni vrstici, z imenom datoteke, ki jo trenutno obdeluje.

Tako lahko lepega dne poskusiti uporabiti <tt/find/, da bi pognali
ukaz na vsaki datoteki, imenik po imenik.  Poskusite lahko tole:
<tscreen><verb>
find /pot -type d -exec ukaz {}/\* \;
</verb></tscreen>
upajoč, da bo <tt/find/ izvajal ukaze takole:
<tscreen><verb>
ukaz imenik1/*
ukaz imenik2/*
...              
</verb></tscreen>
Žal <tt/find/ razvije simbol ,,<tt/{}/`` le, ko nastopa sam.  Vse
drugo, kot na primer ,,<tt>{}/*</tt>`` bo <tt/find/ pustil pri miru,
torej bo namesto želenega dejanja izvedel
<tscreen><verb>
ukaz {}/*     
ukaz {}/*     
...
</verb></tscreen>
enkrat za vsak imenik.  To je lahko hrošč, lahko je odlika,
a shajati moramo s takim vedenjem.

Kako se mu izognemo?  En način je s trivialnim kratkim skriptom v
ukazni lupini, denimo ,,<tt>./naredi</tt>``, ki vsebuje le
<tscreen><verb>
ukaz "$1"/*
</verb></tscreen>
Potem lahko uporabljate
<tscreen><verb>
find /pot -type d -exec ./naredi {} \;
</verb></tscreen>
Ali, če se želite izogniti skriptu ,,<tt>./naredi</tt>``, lahko
uporabite
<tscreen><verb>
find /pot -type d -exec sh -c 'ukaz $0/*' {} \;
</verb></tscreen>
(To deluje, ker se znotraj ,ukaza` ,,<tt>sh -c 'ukaz' A B C ...</tt>``,
<tt/$0/ razvije v <tt/A/, <tt/$1/ v <tt/B/, in tako naprej.)

Ali pa uporabite trik sestavljanja ukaza s pripomočkom <tt/sed/:
<tscreen><verb>
find /pot -type d -print | sed 's:.*:ukaz &amp;/*:' | sh
</verb></tscreen>
Če na vsak način želite zmanjšati število klicev ukaza ,,<tt/ukaz/``,
lahko pogledate, če ima vaš sistem ukaz <tt/xargs/.  Ukaz <tt/xargs/
prebere argumente po vrsticah s standardnega vhoda in jih zbere,
kolikor le lahko, v eno samo ukazno vrstico.  Uporabite lahko torej
<tscreen><verb>
find /pot -print | xargs ukaz
</verb></tscreen>
kar bo pognalo enkrat ali večkrat
<tscreen><verb>
ukaz datoteka1 datoteka2 datoteka3 imenik1/datoteka1 imenik1/datoteka2
</verb></tscreen>
Žal to ni popolnoma robustna ali varna rešitev.  <tt/Xargs/ pričakuje,
da se vhodne vrstice končajo z znakom za novo vrsto (angl. newline),
zato se bo zmedel ob datotekah, poimenovanih s čudnimi znaki, kakršni
so znaki za novo vrsto.



<sect1>Kako lahko zaščitim simbolične povezave?
<p>
<verb>
Subject: How do I set the permissions on a symbolic link?
Date: Thu Mar 18 17:16:55 EST 1993
</verb>
<p>
Zaščite (angl. permissions, dovolilnice tipa <tt>-rw-r--r-</tt>) pri
simboličnih povezavah pravzaprav ne pomenijo ničesar.  Edina
dovoljenja, ki štejejo, so zaščite datotek, na katere kažejo povezave.



<sect1>Kako lahko ,,obnovim`` pobrisano datoteko?
<p>
<verb>
Subject: How do I "undelete" a file?
Date: Thu Mar 18 17:16:55 EST 1993
</verb>
<p>
Nekoč boste po pomoti napisali nekaj kot ,,<tt>rm * .foo</tt>`` in
ugotovili, da ste pravkar pobrisali ,,<tt/*/`` namesto ,,<tt/*.foo/``.
Mislite si, da je to obred minljivosti.

Seveda bi moral vsak spodoben upravitelj sistema redno delati
varnostne kopije.  Preverite pri svojem upravitelju, če je na voljo
nedavna varnostna kopija vaše datoteke.  Če te ni, berite naprej.

Pri vseh okoliščinah ko enkrat pobrišete datoteko z ukazom
,,<tt/rm/``, te ni več.  Ko na datoteki uporabite ukaz ,,<tt/rm/``,
sistem popolnoma pozabi, kateri bloki, razsejani po disku, so bili del
vaše datoteke.  Še huje - bloki pravkar pobrisane datoteke bodo prvi
uporabljeni in prepisani, ko bo sistem potreboval več diskovnega
prostora.  Vendar nikoli ne recite nikoli.  Teoretično je mogoče
vrniti delčke podatkov, <bf/če/ takoj po ukazu <tt/rm/ zaustavite
sistem (angl. shut down).  A tedaj raje imejte pri roki zelo
čarovniški tip osebe, ki ima na voljo dolge ure ali dneve, da vam
obnovi pobrisano.

Ko po pomoti pobrišete datoteko z <tt/rm/, bo prvi nasvet, da naredite
vzdevek v ukazni lupini ali pa proceduro, ki bo spremenila ukaz
,,<tt/rm/`` tako, da boste datoteko namesto pobrisali, raje prestavili
v koš za smeti.  Tako lahko datoteke obnovite, če napravite napako, a
morate občasno prazniti koš za smeti.  Dve opombi: prvič, splošno
mnenje je, da je to <bf/slaba/ ideja.  Na novo lastnost ukaza se boste
vselej zanašali in ko se boste znašli na običajnem sistemu, kjer ukaz
,,<tt/rm/`` zares izvede ,,<tt/rm/``, boste prišli v težave.  Drugič,
verjetno boste ugotovili, da je ob vsej zmešnjavi z diskovnim
prostorom in časom, porabljenim za vzdrževanje koša za smeti, vseeno
lažje malo bolj paziti pri uporabi ukaza ,,<tt/rm/``.  Za začetnike
zadošča, da si v vašem priročniku ogledate izbiro ,,<tt/-i/`` ukaza
,,<tt/rm/``.

Če ste še vedno pogumni, potem je tukaj možen preprost odgovor.
Naredite si ukaz ,,<tt/can/``, ki bo premikal datoteke v
imenik-smetnjak <tt/trashcan/.  V <tt/csh(1)/ lahko postavite
naslednje ukaze v datoteko ,,<tt/.login/`` v vašem domačem imeniku:
<tscreen><verb>
alias can       'mv \!* ~/.trashcan'       # vrzi datoteko/e v koš
alias mtcan     'rm -f ~/.trashcan/*'      # nepovratno izprazni koš
if ( ! -d ~/.trashcan ) mkdir ~/.trashcan  # zagotovi obstoj koša
</verb></tscreen>
Morda boste tudi želeli postaviti:
<tscreen><verb>
rm -f ~/.trashcan/*
</verb></tscreen>
v datoteko ,,<tt/.logout/`` v vašem domačem imeniku, da boste
samodejno izpraznili koš vselej, ko se odjavite.  (Različici za ukazni
lupini <tt/sh/ in <tt/ksh/ sta prepuščeni bralcu kot vaja.)

Pri projektu Athena na MIT-u je nastal obsežen paket za
brisanje/vrnitev/izbris/čiščenje, ki lahko služi kot popolno
nadomestilo za <tt/rm/, vendar dopušča obnovitev datotek.  Ta paket je
bil objavljen v <htmlurl name="comp.sources.misc"
url="news:comp.sources.misc"> (volume 18, <htmlurl name="issue 023-026"
url="ftp://ftp.rge.com/pub/usenet/sources/comp.sources.unix/volume18/undel/">)



<sect1>Kako lahko proces ugotovi, ali teče v ozadju?
<p>
<verb>
Subject: How can a process detect if it's running in the background?
Date: Thu Mar 18 17:16:55 EST 1993
</verb>
Najprej razčistimo: želite vedeti, ali tečete v ozadju ali želite
vedeti, ali tečete interaktivno?  Če se odločate, ali boste izpisovali
pozivnik in podobno, je to verjetno boljši kriterij.  Poglejte, če je
standardni vhod terminal:
<tscreen><verb>
sh:  if [ -t 0 ]; then ... fi
C:  if(isatty(0)) { ... }
</verb></tscreen>
V splošnem ne morete preveriti, ali tečete v ozadju.  Osnovni problem
je, da imajo različne ukazne lupine in različne različice Unixa
različne predstave o tem, kaj pomenita ,,ospredje`` in ,,ozadje`` - in
na najbolj pogostem tipu sistema z dobro razčiščenima pojmoma se lahko
programi poljubno premikajo med ospredjem in ozadjem!

Sistemi Unix brez nadzora opravil tipično postavijo proces v ozadje
tako, da ignorirajo <tt/SIGINT/ in <tt/SIGQUIT/ ter preusmerijo
standardni vhod na ,,<tt>/dev/null</tt>``; to naredi ukazna lupina.

Ukazne lupine, ki podpirajo nadzor opravil (angl. job control), na
sistemih Unix, ki podpirajo nadzor opravil, postavijo proces v ozadje
tako, da mu priredijo identifikacijsko številko ID različno od skupine
procesov, ki pripadajo terminalu.  V ospredje ga premaknejo tako, da
popravijo skupinsko procesno številko terminala (angl. terminal's
process group ID) s procesno številko.  Ukazne lupine, ki <bf/ne/
podpirajo nadzora opravil, na sistemih Unix, ki podpirajo nadzor
opravil, tipično naredijo isto kot ukazne lupine na sistemih, ki ne
podpirajo nadzora opravil.


<sect1>Zakaj preusmerjanje v zanki ne dela, kot bi moralo? (Bournova lupina)
<p>
<verb>
Subject: Why doesn't redirecting a loop work as intended?  (Bourne shell)
Date: Thu Mar 18 17:16:55 EST 1993
</verb>
<p>
Oglejte si naslednji primer:
<tscreen><verb>
foo=bar

while read line
do
        # naredi nekaj z $line
        foo=bletch
done < /etc/passwd

echo "foo je zdaj: $foo"
</verb></tscreen>
Kljub prireditvi ,,<tt>foo=bletch</tt>`` bo to izpisalo ,,<tt>foo je
zdaj: bar</tt>`` v mnogih izvedbah Bournove ukazne lupine.  Zakaj?
Zaradi naslednje, pogosto nedokumentirane lastnosti zgodovinskih
Bournovih ukaznih lupin: preusmerjanje kontrolne strukture (kot je
zanka ali stavek ,,<tt/if/``) naredi ukazno podlupino, v kateri se
struktura izvede; spremenljivke, nastavljene v podlupini (kot priredba
,,<tt>foo=bletch</tt>``), seveda ne vplivajo na trenutno lupino.

Odbor za standardizacijo ukaznih lupin in vmesnika orodij POSIX 1003.2
prepoveduje zgornje neutemeljeno ravnanje, se pravi, na sistemu,
usklajenemu s P1003.2, v Bournovih ukaznih lupinah zgornji primer
izpiše ,,<tt>foo je zdaj: bletch</tt>``.

V zgodovinskih (in s P1003.2 usklajenih) izvedbah uporabite naslednji
trik, da se izognete težavam s preusmerjanjem:
<tscreen><verb>
foo=bar

# datotečni deskriptor 9 naj postane duplikat datotečnega deskriptorja 0 (stdin);
# potem poveži stdin s /etc/passwd; originalni stdin smo si zdaj
# ,zapomnili` v datotečnem deskriptorju 9; glej dup(2) in sh(1)
exec 9&lt;&amp;0 &lt; /etc/passwd

while read line
do
        # naredi nekaj z $line
        foo=bletch
done

# naj bo stdin duplikat datotečnega deskriptorja 9, se pravi,
# spet ga povežemo z originalnim stdin; zatem zapremo deskriptor 9
exec 0&lt;&amp;9 9&lt;&amp;-

echo "foo je zdaj: $foo"
</verb></tscreen>

To bi moralo vselej izpisati ,,<tt>foo je zdaj; bletch</tt>``.
Prav, vzemite naslednji primer:
<tscreen><verb>
foo=bar

echo bletch | read foo

echo "foo je zdaj: $foo"
</verb></tscreen>

To bo izpisalo ,,<tt>foo je zdaj: bar</tt>`` v veliko izvedbah in
,,<tt>foo je zdaj: bletch</tt>`` v nekaterih drugih.  Zakaj?  V
splošnem se vsak del cevovoda izvede v drugi ukazni podlupini; v
nekaterih izvedbah pa je zadnji ukaz v cevovodu izjema: če je to
vgrajeni ukaz, kakršen je ,,<tt/read/``, ga bo izvedla trenutna
lupina, sicer pa bo izveden v podlupini.

POSIX 1003.2 dovoljuje oba načina, zaradi česar se prenosljivi skripti
ne morejo zanašati na nobenega od njiju.



<sect1>Kako poženem <tt/passwd/, <tt/ftp/, <tt/telnet/, <tt/tip/ in druge interaktivne programe v skriptu ukazne lupine v ozadju?<label id="background">
<p>
<verb>
Subject: How do I run ... interactive programs from a shell script ... ?
Date: Thu Mar 18 17:16:55 EST 1993
</verb>
Ti programi pričakujejo terminalski vmesnik.  Ukazne lupine jim ga
posebej ne priskrbijo.  Torej, ti programi ne morejo biti
avtomatizirani v skriptih ukaznih lupin.

Program ,,<tt/expect/`` poskrbi za programabilen terminalski vmesnik
za avtomatsko interakcijo s takimi programi.  Naslednji skript za
<tt/expect/ je primer neinteraktivne različice ukaza <tt/passwd(1)/.
<tscreen><verb>
# uporabniško ime je dano kot 1. argument, geslo kot 2.
set geslo [index $argv 2]
spawn passwd [index $argv 1]
expect "*password:"
send "$geslo\r"
expect "*password:"
send "$geslo\r"
expect eof
</verb></tscreen>
Program <tt/expect/ lahko delno avtomatizira interakcijo, kar je
posebej uporabno za <tt/telnet/, <tt/rlogin/, razhroščevalnike in
druge programe, ki nimajo vgrajenega ukaznega jezika.  Distribucija
priskrbi tudi poskusni skript za nenehen zagon igre <tt/rogue/,
dokler se ne pojavi dobra začetna postavitev.  Potem se nadzor vrne
uporabniku, ki lahko uživa v igri.

Na srečo so bili napisani nekateri programi za obdelavo povezave na
terminalu pseudo-tty, tako da lahko poganjate te vrste programov v
skriptu.

Program <tt/expect/ dobite tako, da pošljete ,,<tt>send
pub/expect/expect.shar.Z</tt>`` na naslov
<htmlurl name="library@cme.nist.gov" url="mailto:library@cme.nist.gov">
ali uporabite anonimni FTP za prenos imenovane datoteke s strežnika
<htmlurl name="ftp.cme.nist.gov"
url="ftp://ftp.cme.nist.gov/pub/expect/expect.shar.Z">.

Še ena možnost rešitve je z uporabo programa pty 4.0, ki deluje kot
program pod sejo psevdo-tty, in ga dobite v arhivu 
<tt>comp.sources.unix</tt>, <htmlurl name="volume 25" url="ftp://ftp.rge.com/pub/usenet/sources/comp.sources.unix/volume25/pty4/">.
Postopek, ki to naredi prek <tt/pty/ z uporabo poimenovanih cevi, je
videti takole:
<tscreen><verb>
#!/bin/sh
/etc/mknod out.$$ p; exec 2>&amp;1
( exec 4&lt;out.$$; rm -f out.$$
<&amp;4 waitfor 'password:'
    echo "$2"
<&amp;4 waitfor 'password:'
    echo "$2"
<&amp;4 cat >/dev/null
) | ( pty passwd "$1" &gt;out.$$ )
</verb></tscreen>
Tukaj je ,,<tt/waitfor/`` preprost C-jevski program, ki bere s
standardnega vhoda znak po znak, dokler ti znaki niso enaki njegovemu
argumentu.

Preprostejša rešitev z uporabo <tt/pty/ (ki ima to napako, da se ne
sinhronizira pravilno s programom <tt/passwd/) je
<tscreen><verb>
#!/bin/sh
( sleep 5; echo "$2"; sleep 5; echo "$2") | pty passwd "$1"
</verb></tscreen>



<sect1>Kako lahko v skriptu ali programu ugotovim ID procesa, ki pripada programu z določenim imenom?<label id="procID">
<p>
<verb>
Subject: How do I find the process ID of a program with a particular name ... ?
Date: Thu Mar 18 17:16:55 EST 1993
</verb>
<p>
V skriptu ukazne lupine:

Doslej še ni pripomočka, ki bi bil posebej načrtovan za preslikovanje
med imeni programov in procesnimi ID-ji.  Še več, takšne preslikave so
pogosto nezanesljive, saj lahko obstaja več procesov z enakim imenom
in ker je možno, da proces med tekom spreminja svoje ime.  Toda
pogosto zadošča, da uporabimo naslednji cevovod, ki izpiše seznam
procesov (v vaši lasti) z določenim imenom:
<tscreen><verb>
ps ux | awk '/ime/ &amp;&amp; !/awk/ {print $2}'
</verb></tscreen>
Pri tem zamenjajte ,,<tt/ime/`` z imenom procesa, ki ga iščete.

Splošni postopek prestreže izhod ukaza <tt/ps/ in z orodji <tt/awk/
ali <tt/grep/ in podobnimi poišče vrstice z določenim nizom znakov ter
izpiše polje PID v teh vrsticah.  Opazili boste, da zgornji ukaz
,,<tt>!/awk/</tt>`` iz izpisa izloči sočasni proces <tt/awk/.

Morda boste morali v odvisnosti od vrste Unixa, ki ga uporabljate,
spremeniti argumente za <tt/ps/.

V kodi programa v C-ju:

Prav tako kot ni nobenega pripomočka, posebej načrtovanega za
preslikavo med imeni programov in procesnimi ID-ji, tudi ni
(prenosljive) C-jevske knjižnice funkcij za to opravilo.

Nekateri proizvajalci sicer priskrbijo funkcije za branje pomnilnika
jedra; na primer, Sun vključuje funkcije ,,<tt/kvm_/`` in Data General
funkcije ,,<tt/dg_/``.  Možno je, da jih sme uporabljati vsak
uporabnik, a morebiti so dostopne le super-uporabniku (ali uporabniku
v skupini ,,<tt/kmem/``), če je na vašem sistemu omejeno branje
pomnilnika jedra.  Nadalje so te funkcije pogosto nedokumentirane ali
vsaj slabo dokumentirane in se lahko spreminjajo od izdaje do izdaje.

Nekateri proizvajalci naredijo datotečni sistem ,,<tt>/proc</tt>``, ki
se kaže kot imenik s kupom datotek v njem.  Datoteke so poimenovane s
števili, ki ustrezajo ID procesov. Te datoteke lahko odpirate in
berete ter tako dobite podatke o procesu.  Kot rečeno pa je dostop do
tega imenika morebiti omejen in vmesnik se lahko spreminja od sistema
do sistema.

Če ne morete uporabiti posebnih proizvajalčevih knjižničnih funkcij in
če nimate sistema <tt>/proc</tt> ter bi radi vse postorili v C-ju,
boste morali sami brskati po pomnilniku jedra.  Za dober primer, kako
se to počne na večih sistemih, poglejte izvorno kodo ,,<tt/ofiles/``,
dostopno v arhivih novičarske skupine <htmlurl
name="comp.sources.unix" url="news:comp.sources.unix">.  (Paket,
imenovan ,,<tt/kstuff/``, ki pomaga pri brskanju po jedru, je bil
poslan na <htmlurl name="alt.sources" url="news:alt.sources"> v maju
1991 in je tudi dostopen po anonimnem FTP-ju kot
<tt>{329{6,7,8,9},330{0,1}}</tt> v imeniku
<tt>usenet/alt.sources/articles/</tt> na <htmlurl
name="wuarchive.wustl.edu"
url="ftp://wuarchive.wustl.edu/usenet/alt.sources/articles/">.



<sect1>Kako preverim izhodni status oddaljenega ukaza, pognanega z <tt/rsh/?
<p>
<verb>
Subject: How do I check the exit status of a remote command executed via "rsh"?
Date: Thu Mar 18 17:16:55 EST 1993
</verb>
<p>
Tole ne deluje:
<tscreen><verb>
rsh nek-stroj nek-zoprn-ukaz || echo "Ukazu je spodletelo"
</verb></tscreen>
Izhodno stanje ,,<tt/rsh/`` je 0 (uspeh), če se sam program <tt/rsh/
konča uspešno, kar verjetno ni to, kar želite.

Če želite preveriti izhodni status oddaljenega programa, lahko
uporabite skript ,,<tt/ersh/`` Maartena Litmaatha, ki je bil poslan
na <htmlurl name="alt.sources" url="news:alt.sources"> v oktobru 1994.
Skript <tt/ersh/ je lupinski skript, ki pokliče <tt/rsh/, uredi, da
oddaljen stroj na koncu izpiše status zadnjega izvedenega ukaza, in
konča v tem izhodnem stanju.



<sect1>Je mogoče programu <tt/awk/ podati tudi spremenljivke ukazne lupine?
<p>
<verb>
Subject: Is it possible to pass shell variable settings into an awk program?
Date: Thu Mar 18 17:16:55 EST 1993
</verb>
<p>
Za to obstajata dva različna načina.  S prvim preprosto 
razvijemo spremenljivke povsod, kjer je to potrebno v programu.
Na primer, seznam vseh terminalov tty, ki jih uporabljate, dobite takole:
<tscreen><verb>
who | awk '/^'"$USER"'/ { print $2 }'
</verb></tscreen>
Enojni narekovaji se uporabljajo za označevanje programa v <tt/awk/-u,
saj se v njem pogosto uporablja znak ,<tt/&dollar;/`, ki je lahko
interpretiran v ukazni lupini, če zaprete program v dvojne narekovaje,
ne pa tudi, če ga zaprete v enojne.  V tem primeru <bf/hočemo/, da
ukazna lupina interpretura ,<tt/&dollar;/` v ,,<tt/&dollar;USER/``,
zato zapremo enojne narekovaje in potem vstavimo ,,<tt/&dollar;USER/``
v dvojne.  Pozorni bodite na to, da ni nikjer nobenih presledkov,
torej bo ukazna lupina vse skupaj videla kot en sam argument.  Opazili
boste tudi, da dvojni narekovaji v tem konkretnem primeru verjetno
niso potrebni, lahko bi torej naredili tudi
<tscreen><verb>
who | awk '/^'$USER'/ { print $2 }'
</verb></tscreen>
a jih moramo vseeno vključiti, saj bi lahko lupinska spremenljivka
<tt/&dollar;USER/ vsebovala posebne znake, kot so presledku.

Drugi način za podajanje spremenljivih nastavitev programu <tt/awk/ je
uporaba pogosto nedokumentirane lastnosti <tt/awk/-a, ki dovoljuje, da
se spremenljivke podajajo v ukazni vrstici kot ,,lažna imena
datotek``.  Na primer:
<tscreen><verb>
who | awk '$1 == uporabnik { print $2 }' uporabnik="$USER" -
</verb></tscreen>
Spremenljivke se uporabijo, ko se zasledijo v ukazni vrstici, torej,
na primer, lahko s to tehniko naročite programu <tt/awk/, kako naj
se obnaša za različne datoteke.  Na primer:
<tscreen><verb>
awk '{ program, ki je odvisen od s }' s=1 datoteka1 s=0 datoteka2
</verb></tscreen>
Opazite, da nekatere verzije programa <tt/awk/ povzročijo, da
se pred izvedbo bloka <tt/BEGIN/ zasledijo spremenljivke pred vsemi
pravimi imeni datotek, toda nekatere ne, zato se na to ne gre
zanašati.

Opazite tudi, da <tt/awk/ ob navedbi spremenljivk namesto pravih
datotek sam od sebe ne bo bral s stdin, zato morate dodati argument
,,<tt/-/`` na konec vašega ukaza, kot je to v predprejšnjem primeru.

Tretja možnost je uporaba novejše verzije programa <tt/awk/ (<tt/nawk/),
ki dopušča neposreden dostop do spremenljivk okolja.  Na primer:
<tscreen><verb>
nawk 'END { print "Vaša pot je " ENVIRON["PATH"] }' /dev/null
</verb></tscreen>



<sect1>Kako se znebim procesov-zombijev, ki vztrajajo?
<p>
<verb>
Subject: How do I get rid of zombie processes that persevere?
From: Jonathan I. Kamens
From: casper@fwi.uva.nl (Casper Dik)
Date: Thu, 09 Sep 93 16:39:58 +0200
</verb>
<p>
Žal je nemogoče posplošiti, kako naj se zaključi podproces, saj se
na različnih vrstah Unixa mehanizmi medsebojno razlikujejo.

Predvsem morate narediti <tt>wait()</tt> za podproces na <bf/vseh/
vrstah Unixa.  Ne poznam Unixa, ki bi avtomatično pospravil za
podprocesom, ki se je končal, če mu tega niste posebej naročili.

Drugič, če na nekaterih, iz SysV izpeljanih, sistemih naredite
,,<tt>signal(SIGCHLD, SIG_IGN)</tt>`` (no, pravzaprav je lahko
<tt/SIGCLD/ namesto <tt/SIGCHLD/, toda večina novejših sistemov SysV
ima ,,<tt>#define SIGCHLD SIGCLD</tt>`` v datotekah z glavami), se
otroški procesi samodejno počistijo, brez nadaljnega truda na vaši
strani.  Najpreprosteje to preverite na svojem stroju, tako da
poskusite, ali deluje, čeprav se ni priporočljivo zanašati na to, če
poskušate pisati prenosljivo kodo.  Žal POSIX tega ne predpisuje.
Nastavitev <tt/SIGCHLD/ na <tt/SIG_IGN/ je v POSIX-u nedefinirana,
torej tega ne morete uporabiti v svojem programu, če naj bo skladen s
standardom POSIX.

Kakšen je potemtakem način, skladen s POSIX?  Kot rečeno, morate
namestiti upravljalnik signalov (angl. signal handler) in počakati z
<tt/wait/.  V POSIX-u so upravljalniki signalov nameščeni s funkcijo
<tt/sigaction/.  Ker vas ne zanimajo ,,zaustavljeni`` podprocesi, pač
pa prekinjeni, dodajte zastavicam <tt/sa_flags/ vrednost
<tt/SA_NOCLDSTOP/.  Čakanje brez blokiranja se izvede z
<tt/waitpid()/.  Prvi argument funkciji <tt/waitpid/ naj bo <tt/-1/
(čakaj na katerikoli PID), tretji naj bo <tt/WNOHANG/.  To je danes
najbolj prenosljiv način in bo verjetno v prihodnosti postal še bolj
prenosljiv.

Če vaš sistem ne podpira standard POSIX, obstaja vrsta rešitev.
Najpreprosteje je uporabiti <tt>signal(SIGCHLD, SIG_IGN)</tt>, če to
deluje.  Če samodejnega čiščenja ne morete doseči s <tt/SIG_IGN/,
morate napisati upravljalnik signalov, da bo to storil.  Zaradi
naslednjih nekonsistentnosti ga sploh ga ni preprosto napisati tako,
da bi deloval na vseh vrstah Unixa:

Na nekaterih vrstah Unixa se upravljalnik signalov <tt/SIGCHLD/
pokliče, če se konča eden <bf/ali več/ podprocesov.  Če vaš
upravljalnik signalov le enkrat pokliče <tt>wait()</tt>, to pomeni, da
ne bo počistil za vsemi podprocesi.  Prepričan sem, da ima na srečo
programer na teh Unixih, na katerih to drži, vselej na voljo klica
<tt/wait3()/ ali <tt/waitpid()/, ki z izbiro <tt/WNOHANG/ preverita,
ali morata počistiti še kaj podprocesov.  Vaš upravljalnik signalov na
sistemih, ki poznajo funkciji <tt>wait3()</tt>/<tt>waitpid()</tt>,
toliko časa kliče eno od teh funkcij z izbiro <tt/WNOHANG/, dokler ni
več nobenih otrok za počiščenje.  Boljša izbira je <tt/waitpid()/, ker
je vključena v POSIX.

Na sistemih, izpeljanih iz SysV, se signali <tt/SIGCHLD/ regenerirajo,
če po izhodu upravljalnika signala <tt/SIGCHLD/ še vedno ostane kakšen
otroški proces za počistiti.  Torej je na večini sistemov SysV ob
klicu upravljalnika signalov varno predpostaviti, da morate počistiti
le en signal, in pričakovati, da se bo upravljalnik poklical ponovno,
če je po izhodu iz njega ostalo še kaj nepočiščenih signalov.

Na starejših sistemih ni nobenega načina, da bi preprečili
upravljalnikom signalov, da se ob klicu samodejno nastavijo na
<tt/SIG_DFL/.  Na takih sistemih morate kot zadnjo stvar upravljalnika
signalov postaviti ,,<tt>signal(SIGCHILD, catcher_func)</tt>`` (kjer
je ,,<tt/catcher_func/`` ime upravljalniške funkcije), da se
resetirajo.

Na srečo novejše izvedbe dovoljujejo upravljalnikom signalov, da se
namestijo, ne da bi bili resetirani na <tt/SIG_DFL/, ko se požene
upravljalniška funkcija.  Temu problemu se na sistemih, ki nimajo
<tt>wait3()</tt>/<tt>waitpid()</tt>, a imajo <tt/SIGCLD/, izognete
tako, da morate resetirati upravljalnik signalov s klicem
<tt/signal()/, ko ste izvedli v upravljalniku vsaj en <tt/wait()/,
vsakič, ko se kliče.  Zaradi zgodovinskih združljivostnih razlogov bo
System V obdržal staro pomenoslovje (resetiral upravljalnik ob klicu)
funkcije <tt/signal()/.  Upravljalniki signalov, ki se prilepijo, se
lahko namestijo s <tt/sigaction()/ ali <tt/sigset()/.

Povzetek vsega tega je, da morate funkcijo <tt/waitpid()/ (POSIX) ali
<tt/wait3()/ na sistemih, ki jo imajo, tudi uporabljati in, da mora
teči vaš upravljalnik signalov v zanki, na sistemih, ki pa teh funkcij
nimajo, morate imeti ob vsaki zahtevi po upravljalniku signalov po en
klic <tt/wait()/.

Še ena stvar - če ne želite iti skozi vse te težave, obstaja
prenosljiv način, da se izognete temu problemu, čeprav je malce manj
učinkovit.  Vaš starševski proces naj se razveji (s <tt/fork/) in
potem čaka na mestu, da se konča otroški proces.  Otroški proces se
potem spet razveji, in vam da otroka in vnuka.  Otrok se takoj prekine
(in torej starš, ki ga čaka, izve za njegov konec in nadaljuje z
delom), vnuk pa počne, kar bi moral prvotno narediti otrok.  Ker je
njegov starš končan, ga nasledi proces <tt/init/, ki bo opravil vse
potrebno čakanje.  Ta metoda je neučinkovita, ker potrebuje dodatno
razvejanje, a je popolnoma prenosljiva.



<sect1>Kako dobim vrstice iz cevovoda tako, kot se pišejo, namesto le v večjih blokih?
<p>
<verb>
Subject: How do I get lines from a pipe ... instead of only in larger blocks?
From: Jonathan I. Kamens
Date: Sun, 16 Feb 92 20:59:28 -0500
</verb>
<p>
Knjižnica stdio trenutno dela vmesno pomnenje (angl. buffering)
različno, odvisno od tega, ali misli, da teče na tty ali ne.  Če
misli, da je na tty, dela vmesno pomnenje po posameznih vrsticah;
sicer uporablja večji vmesni pomnilnik kot je ena vrstica.

Če imate izvorno kodo odjemnika, za katerega bi radi onemogočili
vmesno pomnenje, lahko za to uporabite <tt/setbuf()/ ali
<tt/setvbuf()/.

Če ne, je najboljši način, da prepričate program, da teče na tty tako,
da ga poženete pod pty, se pravi, da uporabite program ,,<tt/pty/``,
omenjen v vprašanju <ref id="background" name=",,Kako poženem passwd,
ftp, telnet, tip in druge interaktivne programe v skriptu ukazne
lupine v ozadju?``">.



<sect1>Kako lahko vstavim datum v ime datoteke?
<p>
<verb>
Subject: How do I get the date into a filename?
From: melodie neal <melodie@comtech.ct.oz.au>
Date: Fri, 7 Oct 1994 09:27:33 -0400
</verb>
<p>
To ni težko, a je na prvi pogled malce kriptično.  Začnimo najprej s
samim ukazom <tt/date/: <tt/date/ lahko vzame niz s formatom izpisa in
ga upošteva.  Niz za formatiranje mora biti objet z narekovaji, da
preprečimo ukazni lupini poskus njegove interpretacije, preden ga dobi
sam ukaz <tt/date/.  Poskusite tole:
<tscreen><verb>
date '+%d%m%y'
</verb></tscreen>
Morali bi dobiti nekaj kot 130994.  Če želite imeti vmes ločila,
preprosto postavite znake, ki bi jih radi uporabljali, v niz za
formatiranje (<bf>brez nagibnic ,<tt>/</tt>`</bf>):
<tscreen><verb>
date '+%d.%m.%y'
</verb></tscreen>
Obstaja veliko simbolov, ki jih lahko uporabite v nizu za formatiranje:
o njih izveste v strani referenčnega priročnika (<tt/man date/).

Zdaj pa še to spravimo v ime datoteke.  Denimo, da bi radi ustvarili
datoteke imenovane <tt>report.130994</tt> (ali katerikoli datum že
je danes):
<tscreen><verb>
FILENAME=report.`date '+%d%m%y'`
</verb></tscreen>
Opazite, da tukaj uporabljamo dva nabora narekovajev: notranji nabor
preprečuje formatirnemu nizu prezgodnjo interpretacijo; zunanji nabor
pove ukazni lupini naj izvede objeti ukaz, in zamenja rezultat v izraz
(zamenjava ukazov, angl. command substitution).



<sect1>Zakaj se nekateri skripti začnejo z ,,<tt>#!...</tt>``?<label id="scriptstart">
<p>
<verb>
Subject: Why do some scripts start with #! ... ?
From: chip@@chinacat.unicom.com (Chip Rosenthal)
Date: Tue, 14 Jul 1992 21:31:54 GMT
</verb>
<p>
Chip Rosenthal je v preteklosti v novičarski skupini <htmlurl
url="news:comp.unix.xenix" name="comp.unix.xenix"> odgovoril na zelo
podobno vprašanje.

Mislim, da ljudi bega, da obstajata dva različna mehanizma, ki se oba
začneta z znakom ,<tt/#/`.  Oba rešujeta isti problem na zelo omejenem
naboru primerov - a nista nič manj različna.

Nekaj ozadja.  Ko se jedro sistema UNIX odloči pognati program (eden
sistemskih klicev družine <tt/exec()/), najprej pogleda prvih 16 bitov
datoteke.  Teh 16 bitov se imenuje <em>magična številka</em>.  Prvič,
magična številka preprečuje jedru, da bi naredilo kaj neumnega, kot na
primer poskušalo izvesti datoteko z bazami podatkov o vaših strankah.
Če jedro ne prepozna magične številke, se pritoži z napako
<tt/ENOEXEC/.  Program požene le, če je magična številka prepoznavna.

Drugič, sčasoma so se uvajali različni formati izvedljivih datotek in
magična številka ni le povedala jedru <tt/ali/ naj izvede datoteko,
pač pa tudi <bf/kako/ naj jo izvede.  Na primer, če prevedete program
na sistemu SCO XENIX/386 in nesete binarno datoteko na sistem
SysV/386, bo jedro prepoznalo magično številko in reklo ,,Aha!  To je
binarna datoteka tipa x.out!`` in se nastavilo tako, da bo uporabljalo
klice, združljive s sistemom XENIX.

Pomnite, da jedro lahko poganja le binarne izvedljive slike pomnilnika.
Kako torej, se vprašujete, tečejo skripti?  Konec koncev, lahko
napišem v pozivniku ukazne lupine ,,<tt/moj.skript/`` in ne dobim
napake <tt/ENOEXEC/.  Odgovor: skripti se ne izvajajo v jedru, pač
pa v ukazni lupini.  Koda v ukazni lupini lahko izgleda podobno:
<code>
/* poskusi pognati program */
execl(program, basename(program), (char *)0);

/* klic exec je spodletel - morda gre za skript ukazne lupine? */
if (errno == ENOEXEC)
     execl ("/bin/sh", "sh", "-c", program, (char *)0);

/* Oh, ne, g. Bill!! */
perror(program);
return -1;
</code>
(Ta primer je močno poenostavljen.  Vpletenih je veliko več
zadev, a to ponazarja bistvo, ki ga poskušam opisati.)

Če je klic <tt/execl()/ uspešen in se program zažene, se koda za
<tt/execl()/ nikoli ne požene.  V zgornjem primeru uspešen
<tt/execl()/ programa ,<tt/program/` pomeni, da se spodnje vrstice
primera ne izvedejo.  Namesto tega sistem izvaja binarno datoteko
,<tt/program/`.

Če, po drugi strani, prvi klic <tt/execl()/ spodleti, ta hipotetična
ukazna lupina pogleda, zakaj ji je spodletelo.  Če klic <tt/execl()/
ni uspel, ker ,<tt/program/` ni bil prepoznan kot binarna izvedljiva
datoteka, ga ukazna lupina poskuša naložiti kot skript ukazne lupine.

Ljudje iz Berkeleya so imeli čedno idejo, kako razširiti način, na
katerega jedro zaganja programe.  Popravili so jedro, da prepozna
magično številko ,<tt>#!</tt>` (magične številke so velike 16 bitov in
dva 8-bitna znaka tvorita 16 bitov, prav?).  Ko je jedro prepoznalo
magično številko ,<tt>#!</tt>`, je prebralo tudi ostanek vrstice in ga
obravnavalo kot ukaz, ki ga naj požene na vsebini datoteke.  S tem
popravkom lahko zdaj počnete podobne stvari:
<tscreen><verb>
#! /bin/sh

#! /bin/csh

#! /bin/awk -F:
</verb></tscreen>
Ta popravek je obstajal le v svetu Berkeleya, in je prešel na jedra
USG kot del sistema System V Release 4.  Pred V.4 jedro ni imelo
možnosti ničesar drugega, kot nalaganje in zaganjanje binarnih
izvedljivih slik pomnilnika, razen v primerih proizvajalčeve dodane
vrednosti.

Vrnimo se še nekaj let v preteklost, v čas, ko je več in več ljudi, ki
so poganjali Unixe na jedrih USG, govorilo ,,<tt>/bin/sh</tt> je zanič
kot interaktivni uporabniški vmesnik!  Hočem <tt/csh/!``.  Nekateri
proizvajalci so dodali <tt/csh/ v njihove distribucije, čeprav
<tt/csh/ ni bil del distribucije USG UNIX.

To pa je predstavljalo problem.  Denimo, da spremenite svojo prijavno
ukazno lupino na <tt>/bin/csh</tt>.  Denimo, nadalje, da ste bebec in
vztrajate na programiranju skriptov <tt/csh/.  Vsekakor bi radi bili
sposobni napisati ,<tt>moj.skript</tt>` in ga s tem pognati, čeprav je
to skript za <tt/csh/.  Namesto, da bi ga pognali skozi
<tt>/bin/sh</tt>, želite, da se skript požene takole:
<tscreen><verb>
execl ("/bin/csh", "csh", "-c", "moj.skript", (char *)0);
</verb></tscreen>
Kaj pa vsi tisti obstoječi skripti -- nekateri od njih so deli
sistemske distribucije?  Če se poženejo skozi <tt/csh/, se bodo stvari
kvarile.  Potrebujete torej način, da poženete nekatere skripte skozi
<tt/csh/, in nekatere druge skozi <tt/sh/.

Vpeljana rešitev je bila, da se popravi <tt/csh/ tako, da pogleda prvi
znak skripta, ki ga želite pognati.  Če je ta ,<tt/#/`, bo <tt/csh/
zagnal skript skozi <tt>/bin/csh</tt>, sicer bo pognal skript skozi
<tt>/bin/sh</tt>.  Primer zgornje kode bi zdaj izgledal takole:
<code>
/* poskusi pognati program */
execl(program, basename(program), (char *)0);

/* klic exec je spodletel - morda gre za skript ukazne lupine? */
if (errno == ENOEXEC && (fp = fopen(program, "r")) != NULL) {
i = getc(fp);
(void) fclose(fp);
if (i == '#')
    execl ("/bin/csh", "csh", "-c", program, (char *)0);
else
    execl ("/bin/sh", "sh", "-c", program, (char *)0);
}

/* Oh, ne, g. Bill!! */
perror(program);
return -1;
</code>
Dve pomembni stvari, Prvič, to je popravek lupine ,<tt/csh/`.  V jedru
se ni nič spremenilo in drugim ukaznim lupinam ni bilo nič dodano.  Če
poskušate pognati skript s klicem <tt>execl()</tt>, boste še vedno
dobili napako <tt/ENOEXEC/, pa naj se skript začne z znakom ,<tt/#/`
ali pa ne.  Če poskušate pognati skript, ki se začne z znakom ,<tt/#/`
v čem drugem kot <tt/csh/ (na primer v <tt>/bin/sh</tt>), ga bo
obravnavala lupina <tt/sh/, ne <tt/csh/.

Drugič, čarovnija je v tem, da se bodisi skript začne z ,<tt/#/`, ali
pa se ne začne z ,<tt/#/`.  Stvari kot so ,<tt/:/` in ,<tt>:
/bin/sh</tt>` na začetku skriptov dela čarobne preprosto dejstvo, da
niso ,<tt/#/`.  Torej je vse to identično, če je na začetku skripta:
<tscreen><verb>
:

: /bin/sh

                <--- prazna vrstica

: /usr/games/rogue

echo "Hm ... sprašujem se, pod katero ukazno lupino tečem???"
</verb></tscreen>
V vseh teh primerih bodo vse ukazne lupine poskušale izvesti skript
z <tt>/bin/sh</tt>.

Podobno, tudi vse naslednje je identično, če je na začetku skripta:
<tscreen><verb>
#

# /bin/csh

#! /bin/csh

#! /bin/sh

# Hm ... sprašujem se, pod katero ukazno lupino tečem???
</verb></tscreen>
Vse te vrstice se začnejo z znakom ,<tt/#/`.  To pomeni, da se bo
skript pognal <bf/le/, če ga boste poskušali pognati iz <tt/csh/,
sicer se bo pognal z <tt>/bin/sh</tt>.

(Opomba: če poganjate <tt/ksh/, zamenjajte v zgornjem besedilu
,,<tt/sh/`` s ,,<tt/ksh/``.  Kornova ukazna lupina je teoretično
združljiva z Bournovo, torej poskuša sama pognati te skripte.  Vaše
izkušnje so lahko drugačne z nekaterimi drugimi dostopnimi ukaznimi
lupinami, kot so <tt/zsh/, <tt/bash/, itd.)

Očitno postane popravek za ,<tt/#/` nepotreben, če imate v jedru
podporo za ,<tt/#!/`.  Pravzaprav je lahko nevaren, saj ustvarja zmedo
pri ugotovitvi, kaj naj bi se zgodilo v primeru ,,<tt>#!
/bin/sh</tt>``.

Uporaba ,<tt>#!</tt>` bolj in bolj prevladuje.  System V Release 4
pobira številne lastnosti z Berkeleya, vključno s to.  Nekateri
proizvajalci sistemov System V Release 3.2 nadgrajujejo na nekatere
bolj vidne dobrote V.4 in vam poskušajo prepričati, da je to dovolj
in, da ne potrebujete stvari, kot so pravi, delujoči tokovi ali
dinamično nastavljivi parametri jedra.

XENIX ne podpira ,<tt/#!/`.  Ukazna lupina <tt>/bin/csh</tt> na Xenixu
nima popravka za ,<tt/#/`.  Podpora za ,<tt/#!/` v Xenixu bi bila
fina, a sam ne bi zadrževal diha med čakanjem nanjo.



<!-- 4 -->
<sect>Napredna vprašanja; radi jih vprašujejo ljudje, ki mislijo, da že poznajo vse odgovore
<p>
<sect1>Kako berem znake s terminala, ne da bi bilo uporabniku treba pritisniti <tt/RETURN/?
<p>
<verb>
Subject: How do I read characters ... without requiring the user to hit RETURN?
Date: Thu Mar 18 17:16:55 EST 1993
</verb>
Preverite način <tt/cbreak/ v BSD ali način <tt/~ICANON/ v SysV.

Če se sami ne želite spoprijeti s terminalskimi parametri (z uporabo
sistemskega klica <tt/ioctl(2)/), lahko prepustite delo programu
<tt/stty/ - a to je počasno in neučinkovito, in včasih boste morali
spremeniti kodo, da bo delala pravilno:
<code>
#include <stdio.h>
main()
{
    int c;

    printf("Pritisnite katerikoli znak za nadaljevanje\n");
    /*
     * funkcija ioctl() bi bila tukaj boljša;
     * le leni programerji delajo takole:
     */
    system("/bin/stty cbreak");        /* ali "stty raw" */
    c = getchar();
    system("/bin/stty -cbreak");
    printf("Hvala, ker ste vnesli %c.\n", c);

    exit(0);
}
</code>
Nekaj ljudi mi je poslalo različne bolj pravilne rešitve tega
problema.  Žal mi je, da jih ne morem vključiti, saj zares presegajo
namen tega seznama.

Preveriti boste želeli tudi dokumentacijo prenosljive knjižnice
zaslonskih funkcij, imenovane ,,<tt/curses/``.  Če vas zanima V/I
enega samega znaka, vas pogosto zanima tudi neka vrsta kontrole
prikaza na zaslonu, in knjižnica <tt/curses/ priskrbi različne
prenosljive rutine za obe funkciji.



<sect1>Kako preverim, če je treba prebrati znak, ne da bi ga zares prebral?
<p>
<verb>
Subject: How do I check to see if there are characters to be read ... ?
Date: Thu Mar 18 17:16:55 EST 1993
</verb>
<p>
V nekaterih različicah Unixa je mogoče preveriti, ali je v danem
datotečnem deskriptorju kaj neprebranih znakov.  V BSD-ju lahko
uporabite <tt>select(2)</tt>.  Uporabite lahko tudi <tt>FIONREAD
ioctl</tt>, ki vrne število znakov, ki čakajo na prebranje, a to
deluje le pri terminalih, cevovodih in vtičih.  V System V Release 3
lahko uporabite <tt>poll(2)</tt>, a to deluje le na tokovih.  V Xenixu
- in torej na Unixu SysV r3.2 in poznejših - sistemski klic
<tt>rdchk()</tt> poroča o tem ali se bo klic <tt>read()</tt> na danem
datotečnem deskriptorju blokiral.

Ni načina, da bi preverili, ali so znaki dostopni za branje s kazalca
<tt/FILE/.  (Lahko gledate po notranjih podatkovnih strukturah stdio,
da bi videli, če je vmesni pomnilnik vhoda neprazen, a to ne bo
delovalo, saj ne veste, kaj se bo zgodilo naslednjič, ko boste hoteli
napolniti vmesni pomnilnik.)

Včasih ljudje vprašujejo to vprašanje z namenom, da bi napisali
<tscreen><verb>
if (znaki dostopni iz fd)
        read(fd, buf, sizeof buf);
</verb></tscreen>
in dobili učinek neblokovnega branja z <tt/read/.  To ni najboljši
način za izvedbo tega, saj je možno, da bodo znaki dostopni, ko
preverite dostopnost, a ne bodo več dostopni, ko pokličete <tt/read/.
Namesto tega prižgite zastavico <tt>O_NDELAY</tt> (ki se pod BSD
imenuje tudi <tt/FNDELAY/) z izbiro <tt>F_SETFL</tt> funkcije
<tt>fcntl(2)</tt>.  Starejši sistemi (Version 7, 4.1 BSD) nimajo
<tt>O_NDELAY</tt>; na teh sistemih lahko najbližje neblokovnemu branju
pridete z uporabo <tt>alarm(2)</tt>, da branju poteče čas.



<sect1>Kako ugotovim ime odprte datoteke?
<p>
<verb>
Subject: How do I find the name of an open file?
Date: Thu Mar 18 17:16:55 EST 1993
</verb>
V splošnem je to pretežko.  Datotečni deskriptor je lahko obešen na
cevovod ali pty, in v tem primeru nima imena.  Lahko je obešen na
datoteko, ki je bila odstranjena.  Lahko ima več imen, zaradi pravih
ali simboličnih povezav.

Če morate to res storiti, in prepričajte se, da ste o tem razmislili
na dolgo in široko in se odločili, da nimate druge izbire, lahko
uporabite <tt/find/ z izbiro <tt/-inum/ in morda še <tt/-xdev/, ali
uporabite <tt/ncheck/, ali še enkrat oponašajte funkcionalnost enega
od teh orodij v vašem programu.  Zavedajte se, da preiskovanje 600
megabytnega datotečnega sistema za datoteko, ki je morda sploh ni,
traja nekaj časa.



<sect1>Kako lahko tekoči program ugotovi svojo lastno pot?
<p>
<verb>
Subject: How can an executing program determine its own pathname?
Date: Thu Mar 18 17:16:55 EST 1993
</verb>
Vaš program lahko pogleda <tt>argv[0]</tt>; če se začenja z
,,<tt>/</tt>``, je to verjetno ime absolutne poti do vašega programa,
sicer lahko vaš program pogleda v vsak imenik, imenovan v okoljski
spremenljivki <tt/PATH/ in poskuša najti prvi imenik, ki vsebuje
izvedljivo datoteko, katere ime se ujema s programovim <tt>argv[0]</tt>
(ki je po dogovoru ime programa, ki se izvaja).  Če združite ta imenik
in vrednost <tt>argv[0]</tt>, imate verjetno pravo ime.

Ne morete pa biti prepričani, saj je povsem legalno, da en program
izvede drugega z <tt/exec()/ s katerokoli vrednostjo <tt>argv[0]</tt>,
ki si jo zaželi.  Da <tt/exec/ izvaja nove programe z imenom
izvedljive datoteke v <tt>argv[0]</tt>, je le dogovor.

Na primer, povsem hipotetični primer:
<tscreen><verb>        
#include <stdio.h>
main()
{
    execl("/usr/games/rogue", "vi Disertacija", (char *)NULL);
}
</verb></tscreen>
Izvedeni program misli, da je njegovo ime (njegova vrednost
<tt>argv[0]</tt>) ,,<tt>vi Disertacija</tt>``.  (Tudi nekateri drugi
programi lahko mislijo, da je ime programa, ki ga trenutno poganjate
,,<tt>vi Disertacija</tt>``, a seveda je to le hipotetični primer,
zato tega ne poskušajte sami :-)



<sect1>Kako uporabim <tt/popen()/ za odprtje procesa za branje <bf/in/ pisanje?
<p>
<verb>
Subject: How do I use popen() to open a process for reading AND writing?
Date: Thu Mar 18 17:16:55 EST 1993
</verb>
<p>
Problem, ko poskušate preusmeriti vhod in izhod poljubnemu suženjskemu
procesu je, da lahko nastane mrtva zanka, če oba procesa hkrati čakata
na še-ne-generiran vhod.  Zanki se lahko izognemo tako, da <bf/obe/
strani upoštevata strog protokol brez mrtvih zank, toda, ker to
zahteva sodelovanje med procesi, je neprimerno za knjižnično funkcijo,
podobno <tt/popen()/.

Distribucija ,,<tt/expect/`` vključuje knjižnico funkcij, ki jih lahko
C-jevski programer kliče neposredno.  Ena izmed funkcij dela isto
stvar kot <tt/popen/ za hkratno branje in pisanje.  Uporablja ptys
namesto cevi, in nima problemov z zaciklanjem.  Prenosljiva je na BSD
in SV.  Glejte vprašanje <ref id="background" name=",,Kako poženem
passwd, ftp, telnet, tip in druge interaktivne programe v skriptu
ukazne lupine v ozadju?``"> za več podatkov o distribuciji
<tt/expect/.



<sect1>Kako izvedem v C-ju <tt/sleep()/ za manj kot sekundo?
<p>
<verb>
Subject: How do I sleep() in a C program for less than one second?
Date: Thu Mar 18 17:16:55 EST 1993
</verb>
<p>
Najprej se zavedajte, da je vse, kar lahko določite <bf/minimalna/
količina zakasnitve; dejanska zakasnitev bo odvisna od upravniških
zadev, kot je obremenitev sistema, in je lahko poljubno dolga, če
nimate sreče.

Ne obstaja funkcija standardne knjižnice, na katero bi se lahko
zanesli v vseh okolji za ,,dremanje`` (angl. napping, običajen izraz
za kratke spance).  Nekatera okolja priskrbijo funkcijo
,,<tt>usleep(<em/n/)</tt>``, ki zadrži izvajanje za <em>n</em>
mikrosekund.  Če vaše okolje ne podpira <tt/usleep()/, je tukaj nekaj
njenih implementacij za okolja BSD in System V.

Naslednja koda Douga Gwyna je prirejena z emulacijske podpore
Systema V za 4BSD in izrablja sistemski klic <tt/select()/
na 4BSD-ju.  Doug jo je prvotno imenoval ,,<tt/nap()/``; vi jo
boste verjetno želeli klicati ,,<tt/usleep()/``:
<code>
/*
    usleep - podporna rutina za emulacijo sistemskih klicev 4.2BSD
    zadnja sprememba originalne verzije:  29. oktober 1984     D A Gwyn
*/

extern int        select();

int
usleep( usec )                          /* vrne 0, če je ok, sicer -1 */
    long                usec;           /* premor v mikrosekundah */
    {
    static struct                       /* `timeval' */
	    {
	    long        tv_sec;         /* sekunde */
	    long        tv_usec;        /* mikrosekunde */
	    }   delay;          /* premor _select() */

    delay.tv_sec = usec / 1000000L;
    delay.tv_usec = usec % 1000000L;

    return select( 0, (long *)0, (long *)0, (long *)0, &amp;delay );
    }
</code>
<p>
Na Unixih System V bi lahko to storili takole:
<code>
/*
podsekundni premori za System V - ali karkoli, kar ima poll()
Don Libes, 4/1/1991

BSD-jeva analogija te funkcije je definirana v mikrosekundah, medtem,
kot je poll() definiran v milisekundah.  Zaradi združljivosti, ta
funkcija priskrbi natančnost "po dolgem teku" tako, da oklesti prave
zahteve na milisekundo natančno in akumulira mikrosekunde med
posameznimi klici z idejo, da jo verjetno kličete v tesni zanki, in se
bo po dolgem teku napaka izničila.

Če je ne kličete v tesni zanki, potem skoraj gotovo ne potrebujete
mikrosekundne natančnosti in v tem primeru vam ni mar za mikrosekunde.
Če vam bi bilo mar, tako ali tako ne bi uporabljali Unixa, saj lahko
naključno prebavljanje sistema (npr. razporejanje) zmelje časomerilno
kodo.

Vrne 0 ob uspešnem premoru, -1 ob neuspešnem.

*/

#include <poll.h>

int
usleep(usec)
unsigned int usec;                /* mikrosekunde */
{
    static subtotal = 0;        /* mikrosekunde */
    int msec;                   /* milisekunde */

    /* 'foo' je tukaj le zato, ker so imele nekatere verzije 5.3
     * hrošča, pri katerem se prvi argument poll() preverja za
     * obstoj pravilnega pomnilniškega naslova, čeprav je drugi
     * argument enak 0.
     */
    struct pollfd foo;

    subtotal += usec;
    /* če je premor < 1 ms, ne naredi ničesar, a si zapomni */
    if (subtotal < 1000) return(0);
    msec = subtotal/1000;
    subtotal = subtotal%1000;
    return poll(&amp;foo,(unsigned long)0,msec);
}
</code>
Še ena možnost za dremanje na System V in verjetno tudi drugih ne-BSD
Unixih je paket <tt/s5nap/ Jona Zeeffa, objavljen v <htmlurl
name="comp.sources.misc" url="news:comp.sources.misc">, volume 4.  Ne
potrebuje namestitve gonilnika naprave, a deluje brez napak, ko se
namesti, (Njegova ločljivost je omejena z vrednostjo <tt/HZ/ v jedru,
saj uporablja rutino <tt/delay()/ v jedru.)

Mnogo novejših Unixov ima funkcijo <tt/nanosleep/.



<sect1>Kako pripravim skripte ,setuid` ukazne lupine do delovanja?
<p>
<verb>
Subject: How can I get setuid shell scripts to work?
Date: Thu Mar 18 17:16:55 EST 1993
</verb>
&lsqb; Ta odgovor je dolg, a to je zapleteno in pogosto zastavljeno
vprašanje.  Hvala Maartenu Litmaathu za ta odgovor in za spodaj
omenjeni program ,,<tt/indir/``. &rsqb;
<enum>
  <item>Najprej predpostavimo, da ste na različici Unixa (npr.
    4.3BSD ali SunOS), ki pozna tako imenovane ,,izvedljive skripte
    ukaznih lupin``.  Takšen skript se mora začeti s podobno
    vrstico:
<tscreen><verb>
#!/bin/sh
</verb></tscreen>
    Skript se imenuje ,,izvedljivi``, ker se tako kot resnična
    (binarna) izvedljiva datoteka začne s tako imenovano
    ,,magično številko``, ki določa tip izvedljive datoteke.
    Glejte tudi razdelek <ref id="scriptstart"
    name=",,Zakaj se nekateri skripti začnejo z ,,#!...``?``">.
    V našem primeru je ta številka enaka ,,<tt/#!/`` in OS vzame
    ostanek prve vrstice kot interpreter za skript, ki mu morda
    sledi 1 uvodna izbira kot je:
<tscreen><verb>
#!/bin/sed -f
</verb></tscreen>
    Denimo, da se ta skript imenuje ,<tt/foo/` in se nahaja
    v imeniku <tt>/bin</tt>.  Če potem napišete:
<tscreen><verb>
foo arg1 arg2 arg3
</verb></tscreen>
    bo OS preuredil zadeve tako, kot bi napisali:
<tscreen><verb>
/bin/sed -f /bin/foo arg1 arg2 arg3
</verb></tscreen>
    Vendar je tukaj neka razlika: če je prižgan bit setuid za ,<tt/foo/`,
    bo spoštovan v prvi obliki ukaza; če zares vpišete drugo obliko,
    bo OS spoštoval bite z dovoljenji programa <tt>/bin/sed</tt>, ki
    seveda ni setuid.
    <p>
  <item>Prav, toda kaj, če se moj skript ukazne lupine <bf/ne/
    začne s takšno vrstico ,<tt/#!/`, ali, če moj OS o tem nič ne ve?
    <p>
    No, če ga ukazna lupina (ali kdorkoli drug) poskuša izvesti,
    bo OS vrnil indikacijo napake, saj se datoteka ne začne z veljavno
    magično številko.  Ukazna lupina bo po sprejetju te indikacije
    <bf/predpostavila/, da gre za skript ukazne lupine in mu dala
    še eno priložnost:
<tscreen><verb>
/bin/sh lupinski_skript argumenti
</verb></tscreen>
    A zdaj smo že videli, da se v tem primeru bit setuid datoteke
    ,<tt>lupinski_skript</tt>` <bf/ne bo/ spoštoval!
    <p>
  <item>Prav, kaj pa varnostna tveganja pri lupinskih skriptih setuid?
    <p>
    Dobro, denimo, da se skript imenuje ,<tt>/etc/skript_setuid</tt>`
    in se začenja z vrstico:
<tscreen><verb>
#!/bin/sh
</verb></tscreen>
    Zdaj pa poglejmo kaj se zgodi, če izvedemo naslednje ukaze:
<tscreen><verb>
$ cd /tmp
$ ln /etc/skript_setuid -i
$ PATH=.
$ -i
</verb></tscreen>
    Vemo, da bo zadnji ukaz preurejen v:
<tscreen><verb>
/bin/sh -i
</verb></tscreen>
    Toda ta ukaz nam bo dal interaktivno ukazno lupino, ki bo z bitom
    setuid tekla, kot da bi jo pognal lastnik skripta!
    <p>
    Na srečo lahko to varnostno luknjo zlahka zapremo, če napišemo
    v prvo vrstico:
<tscreen><verb>
#!/bin/sh -
</verb></tscreen>
    Znak ,<tt/-/` označuje konec seznama izbir: naslednji argument
    ,<tt/-i/` bo vzet kot ime datoteke, iz katere naj se berejo
    ukazi, kot bi tudi moral biti!
    <p>
  <item>Vendar pa obstajajo veliko resnejši problemi:
<tscreen><verb>
$ cd /tmp
$ ln /etc/skript_setuid temp
$ nice -20 temp &
$ mv moj_skript temp
</verb></tscreen>
    Tretji ukaz bo preurejen v:
<tscreen><verb>
nice -20 /bin/sh - temp
</verb></tscreen>
    Ker se ta ukaz izvaja počasi, bo morda lahko četrti ukaz
    zamenjal originalno datoteko ,<tt/temp/` s trojanskim konjem
    ,<tt>moj_skript</tt>` <bf>preden</bf> ukazna lupina sploh
    odpre ,<tt/temp/`!  Obstajajo 4 načini za krpanje te varnostne
    luknje:
    <p>
    <enum>
      <item>naj OS zažene skript setuid na drugačen, varen način
        - System V R4 in 4.4BSD uporabljata gonilnik <tt>/dev/fd</tt>,
        s katerim podata interpreterju datotečni deskriptor skripta;
      <p>
      <item>naj bo skript interpretiran posredno, skozi vmesnik,
        ki se prepriča, da je vse v redu, preden požene pravi
        interpreter - če uporabljate program ,<tt/indir/` iz arhiva
        <htmlurl name="comp.sources.unix" url="news:comp.sources.unix">
        bodo skripti setuid izgledali takole:
<tscreen><verb>
#!/bin/indir -u
#?/bin/sh /etc/skript_setuid
</verb></tscreen>
      <p>
      <item>napravite ,,binarni ovoj``: pravo izvedljivo datoteko, ki je
        setuid in katere edina naloga je pognati interpreter z imenom
        skripta kot argumentom;
      <p>
      <item>napravite splošen ,,strežnik za skripte setuid``, ki
        poskuša najti zahtevano ,opravilo` v bazi podatkov veljavnih
        skriptov in ob uspehu požene pravi interpreter s pravimi argumenti.
    </enum>
    <p>

  <item>Zdaj, ko smo se prepričali, da se interpretira pravilna datoteka,
    ali so prisotna še kakšna tveganja?
    <p>
    Seveda!  Za skripte ukazne lupine ne smete pozabiti eksplicitno
    nastavitev spremenljivke <tt/PATH/ na varno pot.  Lahko ugotovite
    zakaj?  Tukaj je še spremenljivka <tt/IFS/, ki lahko povzroča
    težave, če ni pravilno nastavljena.  Tudi druge okoljske
    spremenljivke lahko ogrozijo varnost sistema, npr. <tt/SHELL/ ...
    Nadalje se morate prepričati, da ukazi v skriptih ne dovoljujejo
    interaktivnih ubežnih zaporedij ukazne lupine!  Potem je tukaj
    umask, ki je lahko nastavljen na kaj čudnega ...
    <p>
    Et cetera.  Zavedati se morate, da skript setuid ,,podeduje``
    vse hrošče in varnostna tveganja ukazov, ki jih kliče!
    <p>
</enum>
Po vsem tem dobimo vtis, da so lupinski skripti setuid precej tvegan
posel!  Morda bo za vas bolje programirati v C-ju!



<sect1>Kako lahko ugotovim, kateri uporabnik ali proces ima odprto datoteko ali uporablja določen datotečni sistem (da ga lahko odklopim)?
<p>
<verb>  
Subject: How can I find out which user or process has a file open ... ?
Date: Thu Mar 18 17:16:55 EST 1993
</verb>
<p>
Uporabite <tt/fuser/ (system V), <tt/fstat/ (BSD), <tt/ofiles/ (v javni
lasti) ali <tt/pff/ (v javni lasti).  Ti programi vam bodo povedali
različne stvari o procesih, ki uporabljajo določene datoteke.

V arhivih <tt>comp.sources.unix</tt>, <htmlurl name="volume 18"
url="ftp://ftp.rge.com/pub/usenet/sources/comp.sources.unix/volume18/">,
najdete prenos <tt/fstat/ z 4.3 BSD na Dynix, SunOS in Ultrix.

<tt/pff/ je del paketa <tt/kstuff/ in deluje na kar nekaj sistemih.
Navodila za nabavo <tt/kstuff/ najdete v vprašanju <ref id="procID"
name=",,Kako lahko v skriptu ali programu ugotovim ID procesa
programa z določenim imenom?``">.

Obveščen sem bil, da obstaja tudi program, imenovan <tt/lsof/, a ne
vem, kje se ga dobi.

Michael Fink &lt;<tt>Michael.Fink@uibk.ac.at</tt>&gt; dodaja:

Če ne morete odmestiti datotečnega sistema (z <tt/umount/), za
katerega zgornja orodja ne poročajo o odprtih datotekah, se
prepričajte, da datotečni sistem, ki ga poskušate odmeščati ne vsebuje
aktivnih točk nameščanja (uporabite <tt>df(1)</tt>).



<sect1>Kako izsledim ljudi, ki me tipajo (s <tt/finger/)?
<p>
<verb>
Subject: How do I keep track of people who are fingering me?
From: Jonathan I. Kamens
From: malenovi@plains.NoDak.edu (Nikola Malenović)
Date: Thu, 29 Sep 1994 07:28:37 -0400
</verb>
<p>
V splošnem ne morete ugotoviti userid nekoga, ki vas tipa z
oddaljenega stroja.  Morda lahko ugotovite stroj, s katerega prihajajo
oddaljene zahteve.  Ena od možnosti, če jo vaš sistem podpira, in, če
je tipalnemu strežniku (angl. finger daemon) prav, jo, da naredite
vašo datoteko <tt/.plan/ za ,,imenovano cev`` (angl. named pipe)
namesto običajno datoteko. (Za to uporabite ,<tt/mknod/`.)

Potem lahko poženete program, ki bo odprl vašo datoteko <tt/.plan/ za
pisanje; odpiranje bo blokirano dokler nek drugi proces (namreč
<tt/fingerd/) ne odpre <tt/.plan/ za branje.  Zdaj lahko skozi to pipo
pošljete, kar pač želite, kar vam omogoča, da prikažete različno
informacijo <tt/.plan/ vsakič, ko vas nekdo potipa.  Eden od programov
za to je paket ,,<tt/planner/``, objavljen v volume 41 arhivov
<tt>comp.sources.misc</tt>.

Seveda to sploh ne bo delovalo, če vaš sistem ne podpira imenovanih
cevi ali, če vaš lokalni <tt/fingerd/ vztraja, da imate navadne
datoteke <tt/.plan/.

Vaš program lahko tudi izkoristi priložnost in pogleda v izhod
programa ,,<tt/netstat/``, ter s tem ugotovi, odkod prihaja zahteva za
<tt/finger/, toda to vam ne bo izdalo identitete oddaljenega
uporabnika.

Če želite dobiti oddaljeni userid, mora oddaljena stran poganjati
identifikacijski strežnik, kot je RFC 931.  Trenutno obstajajo tri
implementacije RFC 931 za popularne stroje BSD, in nekaj aplikacij
(kot <tt/ftpd/ z wuarchive), ki podpirajo ta strežnik.  Za več
informacij se priključite elektronskemu spisku <tt/rfc931-users/ z
običajno zahtevo ,,<tt/subscribe/`` na <htmlurl
name="rfc931-users-request@kramden.acf.nyu.edu"
url="mailto:rfc931-users-request@kramden.acf.nyu.edu">.

Glede tega odgovora obstajajo tri opozorila.  Prvo je, da mnogi
sistemi NFS napačno prepoznajo imenovano cev.  To pomeni, da bo poskus
branja cevi na drugem stroju lahko blokiral, dokler ne poteče
predviden čas, ali videl cev kot datoteko dolžine 0, in je ne bo
nikoli izpisal.

Drugi problem je, da na veliko sistemih strežnik <tt/fingerd/ preveri,
ali datoteka <tt/.plan/ vsebuje podatke (in je bralna), preden jo
poskuša brati.  V tem primeru bodo oddaljeni klici <tt/finger/
popolnoma zgrešili vašo datoteko <tt/.plan/.

Tretji problem je, da imajo sistemi, ki podpirajo imenovane cevi, na
voljo v danem času le fiksno (končno) število le-teh - preverite
nastavitveno datoteko jedra in izbiro <tt/FIFOCNT/.  Če število cevi
na sistemu prekorači vrednost <tt/FIFOCNT/, sistem prepreči izdelavo
novih cevi, dokler nekdo ne sprosti virov.  Razlog za to je, da je
vmesni pomnilnik odmerjen v pomnilniku, ki se ne preklaplja
(angl. buffers are allocated in a non-paged memory).



<sect1>Je mogoče ponovno priključiti proces na terminal, ko je bil ta odklopljen, tj. po zagonu programa v ozadju in odjavi?<label id="retach">
<p>
<verb>
Subject: Is it possible to reconnect a process to a terminal ... ?
Date: Thu Mar 18 17:16:55 EST 1993
</verb>
<p>
Večina različic Unixa ne podpira ,,odklopa`` in ,,priklopa`` procesov
(angl. detaching/attaching processes), kot ju podpirajo operacijski
sistemi kot sta VMS in Multics.  Vendar obstajajo prosto dostopni
paketi, s katerimi lahko poženete procese na takšen način, da se lahko
pozneje spet pritrdijo na terminal.

<itemize>
<item>
Prvi tak paket je ,,<tt/screen/``, ki je opisan v arhivih
<htmlurl name="comp.sources.unix" url="news:comp.sources.unix"> kot
,,Screen, multiple windows on a CRT`` (slov. ,,Zaslon, več oken na CRT``
- glejte paket <tt/screen-3.2/ v <htmlurl name="comp.sources.misc"
url="news:comp.sources.misc">, volume 28).  Ta paket bo tekel
vsaj na sistemih BSD, System V r3.2 in SCO UNIX.
<p>
<item>
Drugi je ,,<tt/pty/``, ki je v arhivih <tt>comp.sources.unix</tt>
opisan kot ,,Run a program under a pty session`` (slov. ,,Poženite
program v seji pty`` - glejte <tt/pty/ v <htmlurl name="volume 23"
url="ftp://ftp.rge.com/pub/usenet/sources/comp.sources.unix/volume23/">).
Načrtovan je le za uporabo v sistemih, podobnih BSD.
<p>
<item>
Tretji je ,,<tt/dislocate/``, ki je skript, priložen distribuciji
<tt/expect/.  Za razliko od prejšnjih dveh bi moral ta teči na
vseh različicah Unixa.  Podrobnosti o tem, kako dobite <tt/expect/
najdete v vprašanju <ref id="background" name=",,Kako poženem passwd,
ftp, telnet, tip in druge interaktivne programe v skriptu ukazne
lupine v ozadju?``">.
</itemize>
Nobeden od teh paketov ne deluje retroaktivno, se pravi, da morate
pognati proces pod pripomočkom <tt/screen/ ali <tt/pty/, če ga
želite odklopiti in priklopiti.



<sect1>Je mogoče ,,vohuniti`` na terminalu, gledajoč izhod, ki se prikazuje na drugem terminalu?
<p>
<verb>
Subject: Is it possible to "spy" on a terminal ... ?
Date: Wed, 28 Dec 1994 18:35:00 -0500
</verb>
<p>
Za to obstaja več različnih poti, čeprav nobena od njih ni popolna:
<itemize>
  <item>Pripomoček <tt/kibitz/ dovoljuje dvema (ali več) človekoma, da sta
    v stiku prek ukazne lupine (ali poljubnega programa).
    Uporaba vključuje:
    <itemize>
      <item>opazovanje ali pomoč pri terminalski seji druge osebe;
      <item>beleženje pogovora z možnostjo pomika nazaj, shranjevanje
        pogovora, in celo spreminjanje med tekom;
      <item>moštveno igranje iger, urejanje dokumentov ali druga
        opravila, pri katerih ima vsaka oseba določene kvalitete
        in določene pomanjkljivosti, ki se komplementirajo.
    </itemize>
    <p>
    <tt/kibitz/ pride kot del distribucije <tt/expect/.  Glejte
    <ref id="background" name=",,Kako poženem passwd, ftp, telnet,
    tip in druge interaktivne programe v skriptu ukazne lupine v ozadju?``">.
    <p>
    Za uporabo pripomočka <tt/kibitz/ potrebujete dovoljenje osebe,
    ki jo želite vohuniti.  Vohunjenje brez privolitve zahteva manj
    prijetne pristope:
  <p>
  <item>
    Napišete lahko program, ki brska po strukturah jedra in opazuje
    izhodni vmesni pomnilnik spornega terminala, ter pri tem
    izpisuje znake, kot se izpisujejo na izhod.  To očitno ni nekaj,
    kar naj bi poskušal kdorkoli, ki nima izkušenj pri delu okoli
    jedra operacijskega sistema Unix.  Še več, katerokoli metodo
    boste že uporabili, bo verjetno zelo neprenosljiva.
  <p>
  <item>Če želite to početi ves čas na določenem pritrjenem terminalu
    (npr. če želite, da bodo lahko operaterji preverili zaslonski
    terminal stroja z drugih strojev), lahko dejansko povežete
    monitor s terminalskim kablom.  Na primer, vtaknite izhod
    monitorja v serijska vrata drugega stroja, in na teh vratih
    poženite program, ki bo nekam shranil svoj vhod in ga potem
    prenesel na <bf/druga/ vrata, tista, ki gredo zares na fizični
    terminal.  Če to počnete, se morate prepričati, da se ves
    izhod terminala pošilja nazaj po žici, če povezujete le
    žice računalnik-&gt;terminal, to ni problem.  To ni nekaj,
    kar bi lahko počel nekdo, ki ni domač z napeljavo terminalskih
    žic in podobno.
  <p>
  <item>Zadnja različica paketa <tt/screen/ vključuje večuporabniški
    način.  Nekaj podatkov o paketu <tt/screen/ najdete v vprašanju
    <ref id="retach" name=",,Je mogoče ponovno priključiti proces na
    terminal, ko je bil ta odklopljen, tj. po zagonu programa v ozadju
    in odjavi?``">.
  <p>
  <item>Če ima sistem, ki ga uporabljate, tokove (SunOS, SVR4), vam
    kot nasvet priporočamo program, objavljen v volume 28 arhiva
    skupine <tt>comp.sources.misc</tt>.
    <bf/In/ ni ga treba najprej zagnati (vnaprej morate nastaviti
    vaš sistem, da samodejno potisne modul <tt/advise/ na tok vsakič,
    ko se odpre tty ali pty).
</itemize>



<!-- 5 -->
<sect>Vprašanja, povezana z različnimi ukaznimi lupinami in njihovimi razlikami<label id="shells">
<p>
<sect1>Se lahko ukazne lupine klasificirajo v kategorije?
<p>
<verb>
Subject: Can shells be classified into categories?
From: wicks@dcdmjw.fnal.gov (Matthew Wicks)
Date: Wed, 7 Oct 92 14:28:18 -0500
</verb>
<p>
V splošnem obstajata dva glavna razreda ukaznih lupin.  Prvi razred
sestavljajo lupine, izpeljane iz Bournove ukazne lupine, in vključuje
<tt/sh/, <tt/ksh/, <tt/bash/ in <tt/zsh/.  Drugi razred sestavljajo
ukazne lupine, izpeljane iz C-jevske in vključuje <tt/csh/ in <tt/tcsh/.
Kot dodatek je tukaj še <tt/rc/, za katero večina ljudi meni, da
je ,,razred zase``, čeprav nekateri lahko ugovarjajo, da <tt/rc/
spada v razred Bournovih ukaznih lupin.

Z zgornjo klasifikacijo in nekaj previdnosti je mogoče napisati
skripte, ki bodo delovali v vseh ukaznih lupinah Bournove lupinske
kategorije, in napisati druge skripte, ki bodo delovali v vseh ukaznih
lupinah C-jevske lupinske kategorije.



<sect1>Kako ,,vključim`` en skript ukazne lupine iz drugega lupinskega skripta?
<p>
<verb>
Subject: How do I "include" one shell script from within another shell script?
From: wicks@dcdmjw.fnal.gov (Matthew Wicks)
Date: Wed, 7 Oct 92 14:28:18 -0500
</verb>
<p>
Vse ukazne lupine Bournove kategorije (vključno z <tt/rc/)
uporabljajo ukaz ,,<tt/./``.  Vse ukazne lupine C-jevske kategorije
uporabljajo ,,<tt/source/``.



<sect1>Ali vse ukazne lupine podpirajo vzdevke (angl. aliases)?  Lahko uporabimo tudi kaj drugega?
<p>
<verb>
Subject: Do all shells have aliases?  Is there something else that can be used?
From: wicks@dcdmjw.fnal.gov (Matthew Wicks)
Date: Wed, 7 Oct 92 14:28:18 -0500
</verb>
<p>
Vse pomembnejše ukazne lupine, razen <tt/sh/, podpirajo vzdevke, a vse
ne delajo z njimi na enak način.  Na primer, nekateri ne sprejemajo
argumentov.

Čeprav niso strogo ekvivalentne, imajo funkcije ukaznih lupin (ki
obstajajo v večini ukaznih lupin Bournove kategorije) skoraj isto
funkcionalnost, kot vzdevki.  Funkcije v ukaznih lupinah lahko počnejo
stvari, ki jih vzdevki ne morejo.  Funkcije ne obstajajo v Bournovih
ukaznih lupinah, izpeljanih iz Unixa Version 7, ki vključuje System
III in BSD 4.2.  BSD 4.3 in System V imata ukazne lupine s podporo
funkcij.

Uporabite <tt/unalias/ za odstranitev vzdevkov (nastalih z <tt/alias/)
in <tt/unset/ za odstranitev funkcij.



<sect1>Kako se prirejajo spremenljivke ukaznih lupin?
<p>
<verb>
Subject: How are shell variables assigned?
From: wicks@dcdmjw.fnal.gov (Matthew Wicks)
Date: Wed, 7 Oct 92 14:28:18 -0500
</verb>
<p>
Ukazne lupine C-jevske kategorije uporabljajo
<tscreen><verb>
set spremenljivka=vrednost
</verb></tscreen>
za spremenljivke, lokalne ukazni lupini, in
<tscreen><verb>
setenv spremenljivka vrednost
</verb></tscreen>
za okoljske spremenljivke.  Spremenljivk se v teh ukaznih lupinah
znebite z uporabo ukazov <tt>unset</tt> in <tt>unsetenv</tt>.

Ukazne lupine Bournove kategorije uporabljajo
<tscreen><verb>
spremenljivka=vrednost
</verb></tscreen>
in morda potrebujejo tudi
<tscreen><verb>
export IME_SPREMENLJIVKE
</verb></tscreen>
da postavijo spremenljivko v okolje.  Spremenljivk se
znebite z <tt>unset</tt>.



<sect1>Kako ugotovim, ali poganjam interaktivno ukazno lupino?
<p>
<verb>
Subject: How can I tell if I am running an interactive shell?
From: wicks@dcdmjw.fnal.gov (Matthew Wicks)
From: dws@ssec.wisc.edu (DaviD W. Sanderson)
Date: Fri, 23 Oct 92 11:59:19 -0600
</verb>
<p>
V ukaznih lupinah C-jevske kategorije, poglejte spremenljivko
<tt>$prompt</tt>.

V Bournovi kategoriji ukaznih lupin lahko pogledate spremenljivko
<tt>$PS1</tt>, vendar je bolj pogledati spremenljivko <tt>$-</tt>.
Če <tt>$-</tt> vsebuje ,<tt/-i/`, je ukazna lupina interaktivna.
Preverite takole:
<tscreen><verb>
case $- in
*i*)    # izvedi stvari za interaktivno ukazno lupino
        ;;
*)      # izvedi stvari za neinteraktivno ukazno lupino
        ;;
esac
</verb></tscreen>



<sect1>Katere datoteke ,,s piko`` uporabljajo različne ukazne lupine?
<p>
<verb>
Subject: What "dot" files do the various shells use?
From: wicks@dcdmjw.fnal.gov (Matthew Wicks)
From: tmb@idiap.ch (Thomas M. Breuel)
Date: Wed, 28 Oct 92 03:30:36 +0100
</verb>
<p>
Čeprav ta seznam morda ni popoln, ponuja večino informacij.
<descrip>
  <tag/csh/ Nekatere različice imajo sistemski datoteki <tt/.cshrc/
    in <tt/.login/.  Vsaka različica jih postavlja na različna mesta.
    <p>
    Ob nastopu (v tem vrstnem redu):
    <itemize>
      <item><tt/.cshrc/ - vedno; razen ob uporabi izbire <tt/-f/.
      <item><tt/.login/ - prijavne ukazne lupine.
    </itemize>
    <p>
    Ob prekinitvi:
    <itemize>
      <item><tt/.logout/ - prijavne ukazne lupine.
    </itemize>
    <p>
    Ostalo:
    <itemize>
      <item><tt/.history/ - shranjuje zgodovino (temelji na
        <tt>$savehist</tt>).
    </itemize>
    <p>
  <tag/tcsh/ Ob nastopu (v tem vrstnem redu):
    <itemize>
      <item><tt>/etc/csh.cshrc</tt> - vedno.
      <item><tt>/etc/csh.login</tt> - prijavne ukazne lupine.
      <item><tt/.tcshrc/ - vedno.
      <item><tt/.cshrc/ - če manjka <tt/.tcshrc/.
      <item><tt/.login/ - prijavne ukazne lupine.
    </itemize>
    <p>
    Ob prekinitvi:
    <itemize>
      <item><tt/.logout/ - prijavne ukazne lupine.
    </itemize>
    <p>
    Ostalo:
    <itemize>
      <item><tt/.history/ - shranjuje zgodovino (temelji na
        <tt>$savehist</tt>).
      <item><tt/.cshdirs/ - shranjuje sklad imenikov.
    </itemize>
    <p>
  <tag/sh/ Ob nastopu (v tem vrstnem redu):
    <itemize>
      <item><tt>/etc/profile</tt> - prijavne ukazne lupine.
      <item><tt/.profile/ - prijavne ukazne lupine.
    </itemize>
    <p>
    Ob prekinitvi:
    <itemize>
      <item> katerikoli ukaz (ali skript), določen z ukazom:
<tscreen><verb>
trap "ukaz" 0
</verb></tscreen>
    </itemize>
    <p>
  <tag/ksh/ Ob nastopu (v tem vrstnem redu):
    <itemize>
      <item><tt>/etc/profile</tt> - prijavne ukazne lupine.
      <item><tt/.profile/ - prijavne ukazne lupine; razen ob uporabi
        izbire <tt/-p/.
      <item><tt>$ENV</tt> - vedno, če je nastavljena; razen ob
        uporabi izbire <tt/-p/.
      <item><tt>/etc/suid_profile</tt> - ob uporabi izbire <tt/-p/.
    </itemize>
    <p>
    Ob prekinitvi:
    <itemize>
      <item> katerikoli ukaz (ali skript), določen z ukazom:
<tscreen><verb>
trap "ukaz" 0
</verb></tscreen>
    </itemize>
    <p>
  <tag/bash/ Ob nastopu (v tem vrstnem redu):
    <itemize>
      <item><tt>/etc/profile</tt> - prijavne ukazne lupine.
      <item><tt>.bash_profile</tt> - prijavne ukazne lupine.
      <item><tt/.profile/ - prijavne ukazne lupine, če ni
        datoteke <tt>.bash_profile</tt>.
      <item><tt/.bashrc/ - interaktivne neprijavne ukazne lupine.
      <item><tt>$ENV</tt> - vedno, če je nastavljena.
    </itemize>
    <p>
    Ob prekinitvi:
    <itemize>
      <item><tt>.bash_logout</tt> - prijavne ukazne lupine.
    </itemize>
    <p>
    Drugo:
    <itemize>
      <item><tt/.inputrc/ - inicializacija branja vrstic.
    </itemize>
    <p>
  <tag/zsh/ Ob nastopu (v tem vrstnem redu):
    <itemize>
      <item><tt/.zshenv/ - vedno, razen ob določitvi izbire <tt/-f/.
      <item><tt/.zprofile/ - prijavne ukazne lupine.
      <item><tt/.zshrc/ - interaktivne ukazne lupine, razen ob
        določitvi izbire <tt/-f/.
      <item><tt/.zlogin/ - prijavne ukazne lupine.
    </itemize>
    <p>
    Ob prekinitvi:
    <itemize>
      <tt/.zlogout/ - prijavne ukazne lupine.
    </itemize>
    <p>
  <tag/rc/ Ob nastopu:
    <itemize>
      <item><tt/.rcrc/ - prijavne ukazne lupine.
    </itemize>
</descrip>



<sect1>Zanima me več o razlikah med različnimi ukaznimi lupinami.
<p>
<verb>
Subject: I would like to know more about the differences ... ?
From: wicks@dcdmjw.fnal.gov (Matthew Wicks)
Date: Wed, 7 Oct 92 14:28:18 -0500
</verb>
<p>
Zelo podrobna primerjava ukaznih lupin <tt>sh</tt>, <tt>csh</tt>,
<tt>tcsh</tt>, <tt>ksh</tt>, <tt>bash</tt>, <tt>zsh</tt>, in
<tt>rc</tt> je v datoteki dostopna po anonimnem FTP-ju z več naslovov:
<itemize>
  <item><url url="ftp://ftp.uwp.edu/pub/vi/docs/shell-100.BetaA.Z">
  <item><url
url="ftp://utsun.s.u-tokyo.ac.jp/misc/vi-archive/docs/shell-100.BetaA.Z">
</itemize>
<p>
Ta datoteka primerja zastavice, programsko skladnjo, vhodno/izhodne
preusmeritve in parametre/okoljske spremenljivke ukaznih lupin.
Ne ukvarja pa se s tem, katere datoteke ,,s piko`` se uporabljajo in
dedovanjem okoljskih spremenljivk in funkcij.



<!-- 6 -->
<sect>Pregled različic Unixa<label id="UNIXflavours">
<p>
<sect1>Opozorilo in uvod
<p>
<verb>
From: "Pierre (P.) Lewis" <lew@bnr.ca>
Date: Tue Aug 15 15:14:00 EDT 1995
X-Version: 2.9
</verb>
<bf>Opozorilo bralcem:</bf>
Rad bi osvežil ta PZV s spletnimi kazalci na različne Unixe, ki jih
omenjam.  Ne oklevajte s pošiljanjem, slej ko prej bom končal
osvežitev tega dela.  E-pošta:
<htmlurl name="lew@bnr.ca" url="mailto:lew@bnr.ca">.

Nadaljnje besedilo je ponujeno brez zagotovitve točnosti ali
popolnosti.  Storil sem, kar sem lahko storil v času, ki ga imam na
voljo, pogosto z nasprotujočimi si informacijami, in delo še vedno
napreduje.  Upam, da bom nadaljeval z izboljševanjem tega povzetka.
Komentarji in popravki so dobrodošli: <htmlurl name="lew@bnr.ca"
url="mailto:lew@bnr.ca">.

Najprej kratka definicija.  Z imenom ,,Unix`` mislimo operacijski
sistem, tipično napisan v C-ju, s hierarhično urejenim datotečnim
sistemom, integracijo V/I za datoteke in naprave, katerega vmesnik
sistemskih klicev vključuje storitve kot sta <tt>fork()</tt>,
<tt>pipe()</tt>, in katerega uporabniški vmesnik vključuje orodja kot
so <tt/cc/, <tt/troff/, <tt/grep/, <tt/awk/, in izbiro ukazne školjke.
Opazite, da je ,,UNIX`` registrirana blagovna znamka podjetja USL
(AT&amp;T), zdaj v lasti konzorcija X/Open, a bo tukaj uporabljana v
svojem generičnem pomenu.

Večina Unixov je izpeljanih bolj ali manj neposredno iz izvorne kode,
napisane v AT&amp;T (zdaj Novell, verjetno je v večini še vedno kakšen
ostanek prvotne kode prve različice v C-ju), a obstajajo tudi kloni
(se pravi, z Unixom združljivi sistemi brez kode AT&amp;T).

Kot dodatek, obstajajo okolja, podobna Unixu (npr. VOS), ki počivajo
na drugih operacijskih sistemih (OS), in OS, ki jih je navdihnil Unix
(da, tudi DOS!).  Teh tukaj ne obravnavamo.  Le malo pišemo o Unixih,
ki delujejo v realnem času (angl. real-time Unices), čeprav načrtujemo
več.

Unix pride v izredno različnih okusih.  To je v veliki meri posledica
dostopnosti izvorne kode in preprostosti prenosa in spremembe Unixa.
Tipično, izdelovalec Unixa začne z eno osnovnih vrst (glejte spodaj),
vzame ideje/kodo od druge večje vrste, doda in spremeni veliko stvari,
itd.  Rezultat je še ena nova vrsta Unixa.  Dandanes je na voljo
dobesedno na stotine Unixov, najbližja stvar standardnemu Unixu je (po
definiciji) System V.

Ta odgovor je bil napisan predvsem iz podatkov na Mreži in
e-pošti.  Nekaj posebnih virov je omenjenih v ustreznih
razdelkih.

Priznanja (poleg virov): <tt>pat@bnr.ca</tt>, <tt>guy@auspex.com</tt>,
<tt>pen@lysator.liu.se</tt>, <tt>mikes@ingres.com</tt>,
<tt>mjd@saul.cis.upenn.edu</tt>, <tt>root%candle.uucp@ls.com</tt>,
<tt>ee@atbull.bull.co.at</tt>, <tt>Aaron_Dailey@stortek.com</tt>,
<tt>ralph@dci.pinetree.org</tt>, <tt>sbdah@mcshh.hanse.de</tt>,
<tt>macmach@andrew.cmu.edu</tt>, <tt>jwa@alw.nih.gov</tt> [4.4BSD],
<tt>roeber@axpvms.cern.ch</tt>, <tt>bob@pta.pyramid.com.au</tt>,
<tt>bad@flatlin.ka.sub.org</tt>, <tt>m5@vail.tivoli.com</tt>,
<tt>dan@fch.wimsey.bc.ca</tt>, <tt>jlbrand@uswnvg.com</tt>,
<tt>jpazer@usl.com</tt>, <tt>ym@satelnet.org</tt>,
<tt>merritt@gendev.slc.paramax.com</tt>, <tt>quinlan@yggdrasil.com</tt>,
<tt>steve@rudolph.ssd.csd.harris.com</tt>, <tt>bud@heinous.isca.uiowa.edu</tt>,
<tt>pcu@umich.edu</tt>, <tt>Dan_Menchaca@quickmail.apple.com</tt>,
<tt>D.Lamptey@sheffield.ac.uk</tt>, <tt>derekn@vw.ece.cmu.edu</tt>,
<tt>gordon@PowerOpen.org</tt>,
<tt>romain@pyramid.com</tt>, <tt>rzm@dain.oso.chalmers.se</tt>,
<tt>chen@adi.com</tt>, <tt>tbm@tci002.uibk.ac.at</tt>,
<tt>sllewis@nando.net</tt>, <tt>edwin@modcomp.demon.co.uk</tt>,
veliko ljudem, ki sem jih še pozabil našteti, in vsem drugim ljudem,
katerih sporočila berem.  Najlepša hvala!



<sect1>Zelo kratek pogled na zgodovino Unixa
<p>
Zgodovina Unixa se začne davnega leta 1969 na slavnem
,,malo-uporabljanem računalniku PDP-7 v kotu`` na katerem so Ken
Thompson, Dennis Ritchie (črka ,R` v ,,K&amp;R``) in drugi začeli delo
na tem, kar je potem postalo Unix.  Ime ,,Unix`` je bilo mišljeno kot
besedna igra imena obstoječega operacijskega sistema ,,Multics`` (in
se je najprej pisalo ,,Unics`` - iz angl. UNiplexed Information and
Computing System).

Prvih 10 let je bil razvoj Unixa pravzaprav omejen na Bell Labs.  Te
prve različice so bile označene kot ,,Version n`` ali ,,Nth Edition``
(priročnikov), in so delovale na računalnikih DEC PDP-11 (16 bitov) in
poznejših VAX-ih (32 bitov).  Pomembnejše različice vključujejo:

<itemize>
<item>V1 (1971):  Prva različica Unixa, v zbirniku na PDP-11/20.
  Vključevala je datotečni sistem, <tt>fork()</tt>, <tt/roff/, <tt/ed/.
  Uporabljana je bila kot urejevalnik besedila za pripravo patentov.
  Klic <tt>pipe()</tt> se je pojavil prvič v V2!
<p>
<item>V4 (1973):  Prepisan v C, kar je verjetno najpomembnejši
  dogodek v zgodovini tega OS: pomeni, da se Unix lahko prenaša
  na novo strojno opremo v nekaj mesecih, spremembe pa so
  preproste.  Programski jezik C je bil prvotno načrtovan za
  operacijski sistem Unix, in torej obstaja močna sinergija
  med C-jem in Unixom.
<p>
<item>V6 (1975):  Prva različica Unixa, široko dostopna zunaj
  ustanove Bell Labs (posebej na univerzah).  To je bil tudi
  začetek raznolikosti in popularnosti Unixa.  1.xBSD (PDP-11)
  je bil izpeljan iz te različice.  J. Lions je objavil svoj
  ,,Komentar o operacijskem sistemu Unix``, ki temelji na V6.
<p>
<item>V7 (1979):  Za veliko ljudi je to ,,zadnji pravi Unix``,
  ali ,,izboljšanje glede na vse prejšnje in prihodnje Unixe``
  &lsqb;Bourne&rsqb;.  Vključeval je popoln K&amp;R C, <tt/uucp/,
  Bournovo ukazno lupino.  V7 je bil prenesen na VAX kot 32V.
  Jedro V7 je bilo veliko borih 40 Kbytov!
<p>
  Tukaj so (za referenco) sistemski klici V7:
  <tt/_exit/, <tt/access/, <tt/acct/, <tt/alarm/, <tt/brk/,
  <tt/chdir/, <tt/chmod/, <tt/chown/, <tt/chroot/, <tt/close/,
  <tt/creat/, <tt/dup/, <tt/dup2/, <tt/exec*/, <tt/exit/,
  <tt/fork/, <tt/fstat/, <tt/ftime/, <tt/getegid/, <tt/geteuid/,
  <tt/getgid/, <tt/getpid/, <tt/getuid/, <tt/gtty/, <tt/indir/,
  <tt/ioctl/, <tt/kill/, <tt/link/, <tt/lock/, <tt/lseek/,
  <tt/mknod/, <tt/mount/, <tt/mpxcall/, <tt/nice/, <tt/open/,
  <tt/pause/, <tt/phys/, <tt/pipe/, <tt/pkoff/, <tt/pkon/,
  <tt/profil/, <tt/ptrace/, <tt/read/, <tt/sbrk/, <tt/setgid/,
  <tt/setuid/, <tt/signal/, <tt/stat/, <tt/stime/, <tt/stty/,
  <tt/sync/, <tt/tell/, <tt/time/, <tt/times/, <tt/umask/,
  <tt/umount/, <tt/unlink/, <tt/utime/, <tt/wait/, <tt/write/.
</itemize>

Omenjene različice Vn je razvila skupina <em>Computer Research
Group</em> (CRG) ustanove Bell Labs.  Druga skupina, <em>Unix System
Group</em> (USG), je odgovorna za podporo.  Tretja skupina pri Bell
Labs je bila tudi vpletena v razvijanje Unixa, <em>Programmer's
WorkBench</em> (PWB), kateri se moramo zahvaliti, na primer, za
<tt/sccs/, poimenske cevi (angl. named pipes) in druge pomembne
zamisli.  Obe skupini sta se leta 1983 združili v <em>Unix System
Development Lab</em>.

Druga različica Unixa je bila CB Unix (Columbus Unix) s kolumbijske
veje Bell Labs, odgovorne za sisteme za podporo operacij.  Njihov
glavni prispevek je del SV IPC.

Delo na Unixu v Bell Labs se je v osemdesetih nadaljevalo.  Serije V
je naprej razvijala skupina CRG (Stroustrup omenja V10 v drugi izdaji
njegove knjige o C++), a sicer ne slišimo veliko o tem.  Podjetje,
zdaj odgovorno za Unix (System V) se imenuje Unix System Laboratories
(USL) in je bilo v večinski lasti koncerna AT&amp;T do začetka leta
1993, ko ga je kupil Novell.  Konec leta 1993 je Novell odstopil
pravice do uporabe blagovne znamke ,,UNIX`` mednarodnemu združenju
X/Open.

A z Unixom se je veliko dogajalo zunaj AT&amp;T, posebej na univerzi
Berkeley (s koder prihaja druga večja vrsta Unixa).  Proizvajalci
(predvsem delovnih postaj) so prav tako prispevali veliko (npr. NFS
podjetja Sun).

Knjiga ,,Life with Unix`` Dona Libesa in Sandy Ressler je fascinantno
branje za vsakogar, ki ga zanima Unix, in pokriva veliko zgodovine,
posredovanj, itd.  Dobršen del tega razdelka je povzetega po tej
knjigi.



<sect1>Glavne vrste Unixa
<p>
<verb>
From: "Pierre (P.) Lewis" <lew@bnr.ca>
Date: Mon Jan  9 16:59:14 EST 1995
X-Version: 2.7
</verb>
<p>
Naslednje je bolj ali manj pogled zgodnjih 90-ih.

Do nedavnega sta obstajali dve glavni vrsti Unixa: System V (pet)
podjetja AT&amp;T, in Berkeley Software Distribution (BSD).  SVR4 je
pravzaprav mešanica obeh teh vrst.  Konec 1991 je bil pri Open
Software Foundation izdan OSF/1 (kot neposreden tekmec Systemu V) in
lahko (prihodnost bo povedala) spremeni to sliko.

V nadaljevanju sledi pregled glavnih izdaj in lastnosti sistemov
System V, BSD in OSF/1.

System V podjetja AT&amp;T.  Tipično na strojni opremi Intela.
Najbolj prenašani Unix, tipično z razširitvami BSD (<tt/csh/,
nadzor opravil, <tt/termcap/, <tt/curses/, <tt/vi/, simbolične
povezave).  Evolucijo Systema V zdaj nadzoruje Unix International
(UI).  Članstvo UI vključuje AT&amp;T, Sun, ...
Novičarski skupini:
<htmlurl name="comp.unix.sysv286" url="news:comp.unix.sysv286">
in <htmlurl name="comp.unix.sysv386" url="news:comp.unix.sysv386">.
Glavne izdaje:
<itemize>
<item>System III (1982): prvi komercialni Unix podjetja AT&amp;T
   <itemize>
     <item>vrste FIFO (imenovane cevi)  (pozneje?)
   </itemize>

<item>System V (1983):
   <itemize>
     <item>paket IPC (<tt/shm/, <tt/msg/, <tt/sem/)
   </itemize>

<item>SVR2 (1984):
   <itemize>
     <item>funkcije ukazne lupine (<tt/sh/)
     <item>SVID (definicija vmesnika System V,
          angl. System V Interface Definition)
   </itemize>

<item>SVR3 (1986) za platforme ?:
   <itemize>
     <item>tokovi (STREAMS, navdih pri V8), <tt>poll()</tt>,
          TLI (omrežno programje)
     <item>RFS
     <item>deljene programske knjižnice
     <item>SVID 2
     <item>prenos pomnilniških strani na zahtevo (angl. demand paging),
         če strojna oprema to podpira
   </itemize>

<item>SVR3.2:
   <itemize>
     <item>združitev s Xenixom (Intel 80386)
     <item>omreženost
   </itemize>

<item>SVR4 (1988), glavni tok implementacij Unixa, mešanica
    sistemov System V, BSD, in SunOS.
   <itemize>
     <item>S SVR3: sistemska administracija, terminal I/F,
          tiskalnik (z BSD-ja?), RFS, STREAMS, uucp
     <item>Z BSD-ja: FFS, TCP/IP, vtiči (angl. sockets),
         <tt>select()</tt>, <tt/csh/
     <item>S SunOS: NFS, grafični vmesnik OpenLook, X11/NeWS,
         podsistem navideznega pomnilnika z datotekami, ki
         ustrezajo pomnilniku, deljene knjižnice (!= od SVR3?)
     <item><tt/ksh/
     <item>ANSI C
     <item>internacionalizacija (8-bitno čist)
     <item>ABI (Application Binary Interface - rutine namesto trapov
         (? angl. routines instead of traps))
     <item>POSIX, X/Open, SVID3
   </itemize>

<item>SVR4.1
   <itemize>
     <item>asinhron V/I (s SunOS?)
   </itemize>

<item>SVR4.2 (temelji na SVR4.1ES)
   <itemize>
     <item>datotečni sistem Veritas, ACL-ji
     <item>dinamično nalaganje modulov jedra
   </itemize>

<item>Prihodnost:
   <itemize>
     <item>SVR4 MP (večprocesorski)
     <item>uporaba mikrojedra Chorus
   </itemize>

</itemize>

Berkeley Software Distribution (BSD, distribucija programja z
Berkeleya).  Tipična na VAX-ih, RISC-ih, več delovnih postajah.  Zdaj
bolj dinamične, raziskovalne različice kot System V.  BSD Unix je
odgovoren za večino priljubljenosti Unixa.  Večina izboljšav Unixa se
je začela tukaj.  Skupina, odgovorna na UCB (University of California,
Berkeley) je <em>Computer System Research Group</em> (CSRG).  Ukinili
so jo leta 1992.  Novičarska skupina: <htmlurl name="comp.unix.bsd"
url="news:comp.unix.bsd">.  Glavne izdaje:

<itemize>
<item>2.xBSD (1978) za PDP-11, še vedno pomemben?
   (2.11BSD je bil izdan 1992!).
   <itemize>
     <item><tt/csh/
   </itemize>

<item>3BSD (1978):
   <itemize>
     <item>navidezni pomnilnik
   </itemize>

<item>4.?BSD:
   <itemize>
     <item><tt/termcap/, <tt/curses/
     <item><tt/vi/
   </itemize>

<item>4.0BSD (1980).

<item>4.1BSD (?): osnova za poznejše različice AT&amp;T CRG
   <itemize>
     <item>nadzor opravil
     <item>samodejna nastavitev jedra
     <item><tt>vfork()</tt>
   </itemize>

<item>4.2BSD (1983):
   <itemize>
     <item>TCP/IP, vtiči, ethernet
     <item>datotečni sistem UFS: dolga imena datotek, simbolične povezave
     <item>novi zanesljivi signali (v SVR3 zdaj zanesljivi signali 4.1)
     <item><tt>select()</tt>
   </itemize>

<item>4.3BSD (1986) za VAX, ?:
   <itemize>
     <item>TCP/IP, vtiči, ethernet
     <item>datotečni sistem UFS: dolga imena datotek, simbolične povezave
     <item>novi zanesljivi signali (v SVR3 zdaj zanesljivi signali 4.1)
     <item><tt>select()</tt>
   </itemize>

<item>4.3 Tahoe (1988): 4.3BSD z izvorno kodo, podpora za Tahoe
   (32-bitni supermini)
   <itemize>
     <item>Fat FFS
     <item>novi algoritmi za TCP
   </itemize>

<item>4.3 Reno (1990) za VAX, Tahoe, HP 9000/300:
   <itemize>
     <item>večina standarda POSIX 1003.1
     <item>novi algoritmi za TCP
     <item>omrežni datotečni sistem NFS (od Suna)
     <item>pomnilniški datotečni sistem MFS
     <item>OSI: TP4, CLNP, ISODE-ov FTAM, VT in X.500; SLIP
     <item>Kerberos
   </itemize>

<item>Trakova Net1 (?) in Net2 (junij 1991): del BSD, za katerega
   ni potrebna pravna zaščita razširjanja USL

<item>4.4BSD (alpha, junij 1992) za HP 9000/300, Sparc, 386, DEC, drugi;
   niti VAX, niti Tahoe; dve različici, lahka (vsebina ~Net2 plus,
   popravki in nove arhitekture) in oteženo (vse, potrebuje licenco USL):
   <itemize>
     <item>nov navidezni pomnilniški sistem (VMS), ki temelji na Mach 2.5
     <item>vmesnik navideznega datotečnega sistema, logično strukturiran
       datotečni sistem, velikost lokalnega datotečnega sistema do 2^63,
       NFS (prosto razširljiv, deluje s Suni, čez UDP ali TCP)
     <item>podpora omrežjem ISO/OSI (izpeljanim iz ISODE): TP4/CLNP/802.3
       in TP0/CONS/X.25, seje in zgornje v uporabniškem prostoru
       (angl. session and above in user space);  FTAM, VT, X.500.
     <item>večina POSIX.1 (posebej nov terminalski gonilnik a la SV),
       veliko od POSIX.2, izboljšan nadzor opravil; glave ANSI C
     <item>Kerberos integriran z večino sistema (vključno z NFS)
     <item>izboljšave TCP/IP (vključno s predvidevanjem glave
       (angl. header prediction), SLIP)
     <item>pomembne spremembe jedra (nov dogovor o sistemskih klicih, ...)
     <item>druge izboljšave: vrste FIFO, zaklepanje datoteke
       v določenem območju bytov (angl. byte-range file locking)
   </itemize>

</itemize>

Ustanova <em>Open Software Foundation</em> (OSF) je konec leta 1991 izdala
svoj Unix imenovan OSF/1.  Še vedno potrebuje licenco SVR2.
Združljiv/podrejen SVID 2 (in prihajajoči 3), POSIX, X/Open, itd.
Člani OSF vključujejo Apollo, Dec, HP, IBM, ...

<itemize>
<item>OSF/1 (1991):
   <itemize>
     <item>počiva na jedru Mach 2.5
     <item>simetrično multiprocesiranje, paralelizirano jedro, niti
     <item>logični diski, zrcaljenje diska (angl. disk mirroring),
        UFS (domoroden), S5 FS, NFS
     <item>izboljšana varnost (B1 z nekaterimi lastnostmi B2, B3; ali C2),
        4.3BSD admin
     <item>STREAMS, TLI/XTI, vtiči (angl. sockets)
     <item>deljene knjižnice, dinamični nalagalnik (vključno z jedrom)
     <item>grafični vmesnik Motif
   </itemize>

<item>izdaja 1.3 (junij 1994)
   <itemize>
      <item>OSF/1 MK (mikro-jedro) temelji na Mach 3.0
      <item>zadošča trenutnemu osnutku specifikacije Specification 1170
         (mišljeno za standardizacijo v procesu Fast Track konzorcija
         X/Open)
      <item>Data Capture I/F, Common Data Link I/F,
      <item>podpora ISO 10646 (Unicode) in 64-bitna podpora
   </itemize>

</itemize>

Ta seznam večjih vrst bi moral verjetno vključevati tudi Xenix
(Microsoft), ki je bil osnova za mnoge prenose.  Izpeljan je bil iz
V7, S III in končno System V, na zunaj jim je podoben, a znatno
spremenjen navznoter (zmogljivosti so uglašene za mikroračunalnike).

Dve zelo dobri knjigi opisujeta notranjo sestavo dveh glavnih vrst.
Ti knjigi sta:
<itemize>
<item>System V: ,,<em>Design of the Unix Operating System</em>``, M. J. Bach.
<item>BSD: ,,<em>Design and Implementation of the 4.3BSD Unix Operating
   System</em>``, Leffler, McKusick, Karels, Quaterman
</itemize>
Za dober uvod v OSF/1 (ne tako tehničen kot prejšnji dve knjigi),
glejte: ,,<em>Guide to OSF/1, A Technical Synopsis</em>``, izdano pri
založbi O'Reilly.  Na SunOS, ,,<em>Virtual Memory Architecture in
SunOS</em>`` in ,,<em>Shared Libraries in SunOS</em>`` v spisih
,,<em>USENIX Proceedings</em>``, poletje 1989.

Dober nabor člankov o prihodnosti Unixa je ,,<em>Unix Variants</em>``
v izdaji revije Unix Review, april 1992.  Drugi dobri viri informacij
vključujejo datoteko <tt>bsd-faq</tt> in mnoge novičarske skupine,
omenjene v besedilu.



<sect1>Glavni igralci in standardi Unixa<label id="mainplayers">
<p>
<verb>
From: "Pierre (P.) Lewis" <lew@bnr.ca> 
Date: Mon Jan 21 16:59:14 EST 1995
X-Version: 2.8
</verb>
<p>
Najpomembnejši igralci na odru Unixa so trenutno (zgodnje leto 1995,
popravki so zelo dobrodošli, to so novi byti):
<itemize>
  <item>Novell, ki je kupil USL (zgodaj 1993) in ima zdaj izvorno kodo.
  <item>X/Open, ki ima tržne pravice do uporabe blagovne znamke ,,UNIX``.
  <item>OSF, kot razvijalec OSF/1 in Motif, in kot organizacija, ki
    vodi projekt CODE (OSF-jev nov delovni model).  Organizacija OSF je
    bila reorganizirana leta 1994 (in Sun se je priključil), odnosi
    z X/Open so bili formalizirani.
  <item>IEEE s standardi POSIX, LAN.
  <item>PowerOpen (IBM, Apple, Motorola, Bull, drugi), ki promovira
    PowerPC.  Ne zamešajte ga z grafičnim okoljem z istim imenom.
</itemize>

Naslednje kratko opisuje najpomembnejše standarde, ki se nanašajo
na Unix.

<itemize>
  <item>IEEE:
    <itemize>
      <item>standardi 802.x (LAN) (LLC, ethernet, token ring, token bus)
      <item>POSIX (ISO 9945?): Portable Operating System I/F - prenosljiv
        vmesnik operacijskega sistema (Unix, VMS in OS/2!)
        (samo ? ti so bili do sedaj končani)
        <itemize>
          <item>1003.1:  knjižnične procedure (večinoma sistemski klici)
             - približno V7 razen za signale in terminalski vmesnik (1990)
          <item>1003.2:  ukazna lupina in pripomočki
          <item>1003.3:  testne metode in ustreznost
          <item>1003.4:  realni čas: binarni semaforji, zaklepanje
            pomnilnika procesa, v pomnilnik preslikane datoteke,
            deljen pomnilnik, razporejanje prioritet, signali v realnem
            času, ure in časomerilci, podajanje sporočil IPC,
            sinhroniziran V/I, asinhron V/I, datoteke v realnem času
          <item>1003.5:  povezave jezika Ada
          <item>1003.6:  varnost
          <item>1003.7:  sistemsko upravljanje (vključuje tiskanje)
          <item>1003.8:  transparenten dostop do datotek
          <item>1003.9:  povezave jezika FORTRAN
          <item>1003.10: super-računalništvo
          <item>1003.12: vmesniki, neodvisni od protokola
          <item>1003.13: profili v realnem času (angl. real-time profiles)
          <item>1003.15: vmesniki za super-računalniški batch (?)
          <item>1003.16: povezave jezika C (?)
          <item>1003.17: storitve z imeniki
          <item>1003.18: standardiziran profil po POSIX (?)
          <item>1003.19: povezave jezika FORTRAN 90
        </itemize>
    </itemize>

  <item>X/Open (konzorcij proizvajalcev, ustanovljen 1984):
    <itemize>
      <item>X/Open Portability Guides (XPGn) - vodniki po združljivosti
        z X/Open:
        <itemize>
          <item>XPG2 (1987), močan vpliv SV
            <itemize>
              <item>Vol 1:  ukazi in pripomočki
              <item>Vol 2:  sistemski klici in knjižnice
              <item>Vol 3:  terminalski vmesnik (<tt/curses/, <tt/termio/),
                IPC (SV), internacionalizacija
              <item>Vol 4:  programski jeziki (C, COBOL!)
              <item>Vol 5:  upravljanje s podatki (ISAM, SQL)
            </itemize>
          <item>XPG3 (1989) dodaja: X11 API (sistemski klici za X11)
          <item>XPG4 (1992) dodaja: XTI?   22 komponent
        </itemize>
      <item>zaporedja vmesnikov XOM:
        <itemize>
          <item>XOM (X/Open Object Management) splošni mehanizmi
            vmesnikov za naslednje
          <item>XDS (X/Open Directory Service)
          <item>XMH (X/Open Mail ??)
          <item>XMP (X/Open Management Protocols) - ne Bullov CM API?
        </itemize>
      <item>X/Open ima zdaj pravice za uporabo blagovne znamke
        ,,UNIX`` (pozno 1993);
      <item>,,Spec 1170`` - ta specifikacija v pripravi opisuje
        skupen API (programski vmesnik aplikacij), ki mu bodo
        morali zadostiti proizvajalci, ki želijo uporabljati
        ime ,,UNIX`` (ko bodo na voljo zbirke testov).  Združitev
        SVID, OSF-jev AES in druge reči.
    </itemize>

  <item>AT&amp;T -
    (je to še relevantno leta 1994?  Kdo je zdaj odgovoren za
    SVID, TLI, APLI?)
    <itemize>
      <item>System V Interface Definition (SVID) - definicija
        vmesnika Systema V
        <itemize>
          <item>SVID1 (1985, SVR2)
            <itemize>
              <item>Vol 1:  sistemski klici in knjižnice (podobno XPG2.1)
            </itemize>
          <item>SVID2 (1986, SVR3)
            <itemize>
              <item>Vol 1:  sistemski klici in knjižnice
                (osnova, razširitve jedra)
              <item>Vol 2:  ukazi in pripomočki
                (osnovni, napredni, upravniški, razvoj programja),
                terminalski vmesnik
              <item>Vol 3:  terminalski vmesnik (spet), STREAMS in TLI, RFS
            </itemize>
          <item>SVID3 (19??, SVR4) dodaja
            <itemize>
              <item>Vol 4:  ??  &amp;c
            </itemize>
        </itemize>
      <item>vmesniki API (programski vmesnik za aplikacije)   
        <itemize>
          <item>Transport Library Interface (TLI)
          <item>ACSE/Presentation Library Interface (APLI)
        </itemize>
    </itemize>

  <item>COSE (COmmon Open Software Environment - skupno okolje odprtega
    programja) &lsqb;IBM, HP, SunSoft in drugi&rsqb;:
    cilj je zbližati različne platforme Unixa.  Iniciative v naslednjih
    področjih:
    <itemize>
      <item>namizna okolja
      <item>aplikacijski vmesnik API (kot Spec 1180 - en sam programski
        vmesnik) - verjetneje najpomembnejši dosežek na tej točki;
        odstrani razlike med SCO, AIX, Solaris, HP-UX, UnixWare.
      <item>porazdeljene računske storitve (OSF-jev DCE in SunSoftov ONC)
      <item>objektne tehnologije (OMG-jeva CORBA)
      <item>grafika
      <item>večpredstavnost
      <item>upravljanje sistemov
    </itemize>

  <item>PowerOpen Environment (POE, okolje PowerOpen), ki ga promovira
    združenje PowerOpen (POA).  Standard za Unixu podobne OS, ki tečejo
    na čipu PowerPC.  Definira:
    <itemize>
      <item>API (programski vmesnik za aplikacije, izpeljan iz AIX,
        ustreza POSIX, XPG4, Motif, &amp;c) in
      <item>ABI (binarni aplikacijski vmesnik), razločljiv faktor
        med drugimi standardi kot so POSIX, XPG4, &amp;c..
        Katerikoli sistem, ki bo ustrezal POE, bo lahko poganjal
        katerokoli programje za POE.
    </itemize>
    Ključne odlike:
    <itemize>
      <item>zasnova na arhitekturi PowerPC
      <item>neodvisnost od strojnega vodila
      <item>implementacije sistema se lahko raztezajo od prenosnikov
        do super-računalnikov
      <item>potrebuje večuporabniški, večopravilni operacijski sistem
      <item>omrežna podpora
      <item>razširitve X windows, Motif
      <item>ustreznost preizkušena in potrjena od neodvisne stranke
        (POA)
    </itemize>
    AIX 4.1.1 bo ustrezal PowerOpen.  MacOS ne ustreza in tudi ne bo.
    (Zgornje je prirejeno iz <tt>powerpc-faq</tt> novičarske skupine
    <htmlurl name="comp.sys.powerpc" url="news:comp.sys.powerpc">.)
</itemize>

IBM je vpleten v projekt COSE in v projekt POE.  Kako neki bosta
tadva sodelovala?



<sect1>Ugotovitev vrste vašega Unixa
<p>
<verb>
From: "Pierre (P.) Lewis" <lew@bnr.ca>
Date: Mon May 30 15:44:28 EDT 1994
X-Version: 2.6
</verb>
<p>
Ta razdelek našteva vrsto stvari, ki jih lahko pogledate v poskusu, da
bi ugotovili osnovno vrsto vašega Unixa.  Glede na precejšnjo
izmenjavo kode in idej med različnimi vrstami in mnogih sprememb, ki
so jih naredili proizvajalci, je vsaka izjava oblike ,,Ta Unix je tipa
SVR2!`` v najboljšem primeru statistična (razen nekaterih prenosov
SVRn).  Veliko Unixov ponuja tudi večino iz obeh svetov (pomešano, kot
SunOS, ali striktno razločeno, kot Apollo?).  Zato ta razdelek
verjetno ni preveč uporaben ...

Pomaga vam lahko tudi seznam lastnosti iz prejšnjih razdelkov.  Na
primer, če ima sistem <tt>poll(2)</tt>, ne pa tudi <tt>select(2)</tt>,
je zelo verjetno, da izhaja iz SVR3.  Namig vam lahko da tudi ime OS,
kot tudi prijavno sporočilo (npr. SGI-jevo ,,IRIX SVR3.3.2``) ali
izhod ukaza ,,<tt>uname -a</tt>``.  Dostopni ukazi vam lahko tudi dajo
namig, a to je verjetno manj zanesljivo kot lastnosti jedra.  Na
primer, tip terminalske inicializacije (inittab ali ttys) je bolj
zanesljiv indikator, kot tiskalniški podsistem.

<verb>
Lastnost            Tipično v SVRx          Tipično v xBSD

ime jedra           /unix                   /vmunix

terminalska
inicializacija      /etc/inittab            /etc/ttys (le getty do 4.3)

zagonska
inicializacija      imeniki /etc/rc.d       datoteke /etc/rc.*

mountani datotečni
sistem              /etc/mnttab             /etc/mtab

običajna ukazna
lupina              sh, ksh                 csh, #! hack

domorodni dat.
sistem              S5 (blk: 512-2K)        UFS (blk: 4K-8K)
                    imena dat. <= 14 bytov  imena datotek < 255 bytov

skupine             potrebuje newgrp(1)     avtomatsko članstvo
                    SVR4: več skupin

tiskalniški
podsistem           lp, lpstat, cancel      lpr, lpq, lprm (lpd daemon) ??

nadzor terminala    termio, terminfo,       termios (sgtty pred 4.3reno)
                    SVR4: termios (POSIX)   termcap

nadzor opravil      >= SVR4                 da

ukaz ps             ps -ef                  ps -aux

večkratni wait      poll                    select

string fcns         memset, memcpy          bzero, bcopy

mapiranje
procesov            /proc  (SVR4)
</verb>

Ko se pomikamo v pozna 90-ta leta, je to verjetno vedno manj in manj
relevantno.



<sect1>Kratki opisi nekaterih znanih (komercialnih/prostih) Unixov
<p>
<verb>
From: "Pierre (P.) Lewis" <lew@bnr.ca>
Date: Tue Aug 15 15:14:00 EDT 1995
X-Version: 2.9
</verb>
<p>
(Sploh nisem zadovoljen s tem razdelkom, žal nimam niti časa, niti
dokumentacije, da bi ga zelo izboljšal.  Vseboval naj bi le Unixe,
znane širšemu občinstvu.  Majhni in neameriški Unixi so dobrodošli,
npr. Eurix.  Nujno preformatiranje.)

Ta razdelek našteva (po abecedi) nekaj bolj znanih Unixov skupaj s
kratkim opisom njihove narave.  Žal je zastarel skoraj po definiciji
...

AIX: IBM-ov Unix, temelji na SVR2 (poznejši na SVR3.2?) z raznimi
  stopnjami razširitev BSD za različno strojno opremo.
  Lasten sistemski upravljalnik (SMIT).  Podpira CP 850
  in Latin-1.  Precej različen od večine Unixov in tudi
  med sabo.  Novičarska skupina:
  <htmlurl url="news:comp.unix.aix" name="comp.unix.aix">.
  <itemize>
    <item>1.x (za 386 PS/2)
    <item>2.x (za PC RT)
    <item>3.x (za RS/6000), <em>paging kernel</em>,
       <em>logical volume manager</em>, i18n;
    <item>3.2 dodaja TLI/STREAMS.  Bazira na SV z veliko izboljšavami.
    <item>4.1 je zadnji (vključuje podporo za PowerPC?)
    <item>AIX/ESA, teče na računalnikih <em>mainframe</em> S/370 in S/390,
      temelji na OSF/1.  AIX bi moral biti osnova za OSF/1, a so
      namesto njega izbrali Mach.  Upam, da ta podrazdelek
      konvergira.  <tt>:-)</tt>
  </itemize>

AOS (IBM):  Prenos 4.3BSD na IBM PC RT (za izobraževalne ustanove).
  Ne zamešajte ga z DG-ovim OS istega imena.

Arix:  SV

A3000UX (Commodore): Unix (?) SVR4 za računalnike Amiga s procesorjem
  Motorola 68030.

A/UX (Apple): SV z razširitvami z Berkeleya, NFS, Mac GUI.  System 6
  (pozneje System 7) teče kot gost A/UX (obratno kot MachTen).
  Novičarska skupina: <htmlurl url="news:comp.unix.aux" name="comp.unix.aux">.
  <itemize>
    <item>2.0:  SVR2 z 4.2BSD, aplikacije za Mac System 6.
    <item>3.0 (1992): SVR2.2 z 4.3BSD in razširitvami SVR3/4; X11R4,
       MacX, TCP/IP, NFS, NIS, RPC/XDR, različne ukazne lupine, UFS ali S5FS.
       aplikacije za System 7.
    <item>4.0 bo OSF/1.  Toda slišim, da se je Apple odločil pustiti
      A/UX (zdaj bo skupaj z IBM uporabljal AIX za PPC).
  </itemize>

3B1 (680x0): Osnovan na SV, naredil Convergent za AT&amp;T.
  Novičarska skupina: <htmlurl url="news:comp.sys.3b1" name="comp.sys.3b1">.

BNR/2: pomeni BSD Net/2 Release? Vključuje NetBSD/1, FreeBSD.

BOS za Bullov DPX/2 (680x0)
  <itemize>
    <item>V1 (1990): SVR3 z razširitvami BSD (FFS, <tt/select/, vtiči),
      simetrično MP, X11R3
    <item>V2 (1991): dodaja nadzor opravil, zrcaljenje diska, varnost C2,
      razširitve DCE
    <item>Obstaja tudi BOS/X, in z AIX združljiv Unix za delovne
      postaje Bull PPC.  Ni znano, v kakšnem sorodu je z zgornjima dvema.
  </itemize>

386BSD: Jolitzov prenos programja Net/2.  POSIX, 32-biten,
  še vedno v stanju alpha (zdaj različica 0.1).

BSD/386 (80386):  od BSDI, z izvorno kodo (naraslo programje Net2)
  Novičarska skupina: <htmlurl name="comp.unix.bsd" url="news:comp.unix.bsd">.

Chorus/MiXV:  Unix SVR3.2 (SVR4) okoli zasnove Chorus, ABI/BCS.

Coherent (Mark Williams Company): Za 80286. klon Unixa, združljiv z V7,
  nekaj SVR2 (IPC). V4.0 je 32-bitna.  Novičarska skupina:
  <htmlurl name="comp.os.coherent" url="news:comp.os.coherent">.
  Mark Williams je ukinil podjetje v zgodnjem 1995.

Consensys: SVR4.2

CTIX: osnova SV, od podjetja Convergent

D-NIX:  SV

DC/OSx (Pyramid):  SVR4. Novičarska skupina:
  <htmlurl url="news:comp.sys.pyramid" name="comp.sys.pyramid">.

DELL UNIX &lsqb;DELL Computer Corp.&rsqb;: SVR4

DomainIX: glejte DomainOS spodaj.

DomainOS (Apollo, zdaj HP): lasten OS; vrhnja plast je BSD4.3 in
  SVR3 (proces lahko uporabi enega, nobenega ali oba).  Razvoj
  je zdaj ustavljen, nekatere lastnosti so zdaj v OSF/1 (in NT).
  Zdaj na SR10.4.  Ime za SR9.* je bilo DomainIX.  Novičarska skupina:
  <htmlurl name="comp.sys.apollo" url="news:comp.sys.apollo">.

DVIX (NT-jev DVS):  SVR2

DYNIX (Sequent): na osnovi 4.2BSD

DYNIX/PTX: na osnovi SVR3

EP/IX (Control Data Corp.): za MIPS 2000/3000/6000/4000; osnova je
  RISC/OS 4 in 5, zadošča POSIX-ABI. Načini SVR3, SVR4 in BSD.

Esix (80386):  čisti SVR4, X11, OpenLook (NeWS), Xview

Eurix (80?86):  SVR3.2 (Nemčija)

FreeBSD: 386bsd 0.1 s popravki in veliko osveženimi pripomočki.

FTX: Stratus fault-tolerant OS (stroj 68K ali i860-i960)

Generics UNIX (80386): SVR4.03 (Nemčija)

GNU Hurd (?):  ,,vaporware`` <em>Free Software Foundation</em> (FSF):
  Emulator Unixa na jedru Mach 3.0.  Veliko GNU-jevih orodij je
  zelo popularnih (Emacs) in uporabljanih v prostih Unixih.

HELIOS (Perihelion Software): za transputer INMOS in veliko drugih
  platform.

HP-UX (HP):  starejši iz S III (SVRx), zdaj SVR2 (4.2BSD?) s pripomočki SV
  (imajo probleme z odločanjem).
  <itemize>
    <item>6.5: SVR2
    <item>7.0: SVR3.2, symlinks
    <item>7.5
    <item>8.0: osnova BSD? za HP-9000 CISC (300/400) in RISC (800/700),
      delitev knjižnic
    <item>9.0: vključuje DCE
  </itemize>

Interactive SVR3.2 (80x86): čisti SVR3.  Interactive je kupil Sun;
  bo njihov sistem preživel Solaris?

Idris: prvi klon Unixa, naredil ga je Whitesmith.  Majhen Unix?
  Za transputerje INMOS in druge?

IRIX (SGI):  Različica 4: SVR3.2, precej BSD.  Različica 5.x
  (trenutna je 5.2) temelji na SVR4.
  Novičarska skupina: <htmlurl name="comp.sys.sgi" url="news:comp.sys.sgi">.

Linux (386/486/586): Unix pod GNU Public License (vendar ne od FSF).
  Dostopen z izvorno kodo.  Zadošča POSIX z razširitvami SysV in BSD.
  Prenaša se na Alpha/AXP in PowerPC (prenosi na Amige in Atarije
  s procesorji 680x0 že obstajajo; prenos se dela tudi na MIPS/4000).
  Novičarske skupine:
  <htmlurl name="comp.os.linux" url="news:comp.os.linux">.{<htmlurl
  name="admin" url="news:comp.os.linux.admin">,<htmlurl
name="announce" url="news:comp.os.linux.announce">,
<htmlurl name="development" url="news:comp.os.linux.development">,<htmlurl
 name="help" url="news:comp.os.linux.help">,<htmlurl
 name="misc" url="news:comp.os.linux.misc">}.

MacBSD, ?: deluje na Mac II (neposredno na strojno opremo).

MachTen, Tenon Intersystems:  teče kot gost pod MacOS; okolje 4.3BSD
  s TCP, NFS.  Pomanjšana različica: MachTen Personal.

MacMach (Mac II): 4.3BSD na mikrojedru Mach 3.0, X11, Motif, programje GNU,
  izvorna koda, poskusni System 7 kot opravilo Mach.  Popoln z vso
  izvorno kodo (potrebuje licenco Unix).

Mach386: od Mt Xinu.  Temelji na Mach 2.5, z razširitvami 4.3BSD-Tahoe.
  Tudi 2.6 MSD (Mach Source Distribution).

Microport (80x86):  čisti SVR4, X11, OpenLook GUI

Minix (80x86, Atari, Amiga, Mac):  klon Unixa, združljiv z V7.
  Prodaja se z izvorno kodo.  Se POSIXizira.  Za PC-je in gotovo
  za veliko drugih (npr. transputer INMOS).  Novičarska skupina:
  <htmlurl name="comp.os.minix" url="news:comp.os.minix">.

MipsOS:  SV-jevski (RISC/OS, zdaj opuščen, je bil BSD-jevski)

more/BSD (VAX, HP 9000/300):  Mt Xinu-ov Unix, temelji na 4.3BSD-Tahoe.

NCR UNIX: SVR4 (4.2?)

Net/2 tape (Berkeley, 1991): BSD Unix, posebej združljiv z 4.3BSD,
  vključuje le kodo, prosto kode AT&amp;T, nobene nizkonivojske kode.
  Glejte 386BSD in BSD/386 zgoraj.

NetBSD 0.8: je pravzaprav 386bsd v novi obleki. Prenesen na računalnike
  &lsqb;34&rsqb;86, MIPS, Amiga, Sun, Mac.  Kakšno je razmerje z Net/2?
  <itemize>
    <item>1.0 je prišla ven v 1994
  </itemize>

NEXTSTEP (Intel Pentium in 86486, Hewlett-Packard PA-RISC, NeXT 68040):
  BSD4.3 na jedru Mach, lastni grafični vmesnik.
  <itemize>
    <item>1.x, 2.0, 2.1, 2.2, 3.0, 3.1 (stare)
    <item>3.2 (trenutna različica,
              Intel Pentium in 86486,
              Hewlett-Packard PA-RISC,
              NeXT 68040)
    <item>3.3 (prihaja; na voljo različica za SPARC)
    <item>4.0 (bo napovedana, vključevala bo različico za Sun SPARC in
      bo upoštevala OpenStep)
    <item>NEXTSTEP za PowerPC ali DEC Alpha še ni napovedan
      (ali ga načrtujejo?)
  </itemize>

NEWS-OS (Sony)
  <itemize>
    <item>3.2
  </itemize>

OSF/1 (DEC): DEC-ov prenos OSF/1.  Mislim, da je to zdaj (april 1993)
  dostopno na DEC-ovi zadnji 64-bitni Alphi AXP.

OSx (Pyramid): Dvojni prenos SysV.3 in BSD4.3. Novičarska skupina:
  <htmlurl name="comp.sys.pyramid" url="news:comp.sys.pyramid">.

PC-IX (IBM 8086):  SV

Plan 9 (AT&amp;T): napovedan 1992, popoln ponoven napis, ni jasno, kako blizu
  Unixa je.  Ključne točke: distribuiran, zelo majhen, različni stroji
  (Sun, Mips, Next, SGI, generic hobbit, 680x0, PC-ji), C (ne C++, kot
  pravijo govorice), nov prevajalnik, okenski sistem ,,8 1/2`` (tudi
  zelo majhen), 16-bitni Unicode, CPE/datotečni strežnik na zelo hitrih
  omrežjih.

SCO Xenix (80x86): Različice za XT (nerobustne!), 286, 386 (s preklapljanjem
  pomnilnika na zahtevo (angl. demand paging)).  Danes je večino kode
  iz Systema V.  Stabilen izdelek.

SCO Unix (80x86):  SVR3.2 (prenehal jemati kodo USL na tej točki).

Sinix &lsqb;Siemens&rsqb;: osnova System V.

Solaris (Sparc, x86):
  <itemize>
    <item>1.0:  pravzaprav isti kot SunOS 4.1.1, z OpenWindows 2.0 in
      pripomočki DeskSet.
    <item>1.0.1:  SunOS 4.1.2 z multiprocesiranjem (jedro ni večnitno);
      ni za 386
    <item>2.0: (sprva napovedovan kot SunOS 5.0 v 1988) počiva na SVR4
      (s simetričnim MP?), vključeval bo podporo za 386; z OpenWindows 3.0
      (X11R4) in OpenLook, DeskSet, ONC, NIS.  Oba formata binarnih
      datotek: a.out (BSD) in elf (SVR4).  Podpora za Kerberos.
      Prevajalniki odvezani!
    <item>Solaris zadošča OpenStep (ne-NeXT, toda z NEXTSTEP API)
      z zadnjo različico (1994?).
    <item>Sun bo poslal svojo implementacijo OpenStep s projektom DOE
      za Solaris.  Prve različice bodo za Sunove stroje SPARC, toda
      pozneje se bo pojavila različica za Solaris 2.4 za x86 in PowerPC.
  </itemize>

UHC (80x86): čisti SVR4, X11, Motif

Ultrix (DEC):  temelji na 4.2BSD z veliko 4.3.
  Novičarska skupina: <htmlurl name="comp.unix.ultrix"
  url="news:comp.unix.ultrix">.
  <itemize>
    <item>4.4 je zadnja
  </itemize>

UNICOS (Cray):  osnova System V.  Novičarska skupina:
  <htmlurl name="comp.unix.cray" url="news:comp.unix.cray">.
  <itemize>
    <item>5.x, 6,x, 7.0
  </itemize>

UnixWare Release 4.2 &lsqb;Univel&rsqb;: SVR4.2; čez NetWare.
  Univel ne obstaja več.

UTEK (Tektronix)
  <itemize>
    <item>4.0
  </itemize>

VOLVIX (Archipel S.A.): OS na osnovi Unix, zgrajen okoli mikro-jedra
  temelječega na komunikaciji, distribuciji in realnem času.
  Sistemski klici SVR3.2, BSD4.4 datotečni/omrežni sistemski klici
  (VFS, FFS).  Tudi NFS in X11.
  Pravi VOLVIX je za transputerje.

Xenix (80x86):  Prvi Unix na Intelovi strojni opremi, temelji na
  SVR2 (prej na S III in celo V7).  Novičarska skupina:
  <htmlurl name="comp.unix.xenix" url="news:comp.unix.xenix">.

<sect1>Unixi, delujoči v realnem času
<p>
<verb>
From: "Pierre (P.) Lewis" <lew@bnr.ca>
Date: Tue Aug 15 15:14:00 EDT 1995
X-Version: 2.9
</verb>
<bf>Pozor!</bf> Ta razdelek hudo potrebuje dodatno delo.  Je poln
napak in je nepopoln.  Upam, da ga bom imel čas pogledati to zimo
(bilo je ,,to jesen``).  Dvomim, da so vsi spodnji res Unixi -
prispevki so dobrodošli.  Seznam tudi vključuje pogostejše Unixe z
lastnostmi realnega časa, in nekatere ne-Unixaške sisteme z Unixu
podobnim API.  Mislim, da zadnji ne spadajo zares sem, a ko sem že
zbral nekaj podatkov jih nočem zavreči.  Glejte tudi novičarsko
skupino <htmlurl url="news:comp.realtime" name="comp.realtime">.

AIX: AIX/6000 ima podporo realnemu času.

Concurrent OS (Concurrent): pravi Unix, ki ga je Concurrent znatno spremenil.

CX/UX: pravi UNIX, ki ga je znatno spremenil Harris, da bi ponujal
  zmožnosti realnega časa.  Zadošča končni različici POSIX.4.

EP/LX (Control Data): prenos sistema LynxOS na R3000.
  Prej se je imenoval TC/IX.

LynxOS (Lynx Real-Time Systems, Inc): združljiv z Berkeley in SV,
  popoln ponoven napis (v lasti podjetja), prednik SVR5.
  Ni UNIX, a podpira večino vmesnikov Unixa (SV in BSD).
  Upošteva POSIX.  Popolnoma predkupen (angl. preemptive),
  fiksne prioritete.

MiX: implementacija SVR4 z mikrojedrom, izdelal Chorus.

Motorola SVR4 ima zmožnosti realnega časa.

QNX (Quantum Software): realno časovni OS, združljiv z Unixom.

REAL/IX: temelji na Systemu V 3.2 z odlikami RT features
  (povsem predkupno jedro, razporejevalnik fiksnih prioritet,
  časomerilec RT, &amp;c.).  Za sisteme, grajene na 68xxx in 88xxx.
  Ustreza POSIX (1003.1 - 1988) in v obliki za 88k ustreza tudi
  88open BCS.  Dostopen tudi za x86/Pentium.

RTMX O/S &lsqb;RTMX Incorporated&rsqb;: elementi NET2, 4.4BSD-Lite in
  lastne kode.  Vključuje tudi orodja FSF.  Razširitve realnega
  časa (POSIX).

RTU (Concurrent), za škatle z 68K

Solaris 2 ima realno časovne zmožnosti?

Stellix (Stardent); je Unix, ali je tudi realno časovni?

Venix/386: Interactive SVR3.2 z realno časovnimi razširitvami.

VMEexec (Motorola): ni Unix, a deli nekatere vmesnike z Unixom.

VxWorks (Wind River Systems): Malo skupnega z Unixom, le nekateri
  vmesniki (a ne datotečni sistem).  Novičarska skupina:
  <htmlurl url="news:comp.os.vxworks" name="comp.os.vxworks">.

(o naslednjih ne vem ničesar)

Convex RTS

REAL/IX (AEG)

Sorix (Siemens)

System V/86 (Motorola)

TC/IX (CCD)

Velocity (Ready Systems)



<sect1>Slovarček Unixa
<p>
<verb>
From: "Pierre (P.) Lewis" <lew@bnr.ca>
Date: Tue Aug 15 15:14:00 EDT 1995
X-Version: 2.9
</verb>
<p>
Ta razdelek ponuja kratke definicije različnih konceptov in komponent
sistemov Unix (ali: povezanih s sistemi Unix).

Chorus: mikrojedro s prenosom sporočil (angl. message-passing microkernel),
  lahko predstavlja osnovo za prihodnje izdaje SV.  Na Chorusu že
  tečejo SVR4 (binarno združljivi).

CORBA (Common Object Request Broker Architecture).

COSE (Common Open Software Environment) &lsqb;Sun, HP, IBM&rsqb;:
  skupni videz in občutek (Motif - Sun bo pustil OpenLook odmreti),
  skupni API.  Reakcija proti Windows NT.
  Glejte zgornji razdelek <ref id="mainplayers"
  name=",,Glavni igralci in standardi Unixa``">.

DCE (Distributed Computing Environment, od OSF): Vključuje RPC (NCS
  Apolla), imeniške storitve (lokalne na DNS, globalne na X.500),
  časovne, varnostne in nitne storitve, DFS (distribuirani datotečni
  sistem), neodvisen od OS.

DME (Distributed Management Environment, od OSF):  prihodnost.

DO (Distributed Objects &lsqb;Enterprise&rsqb;): ???.

FFS (Fast File System): od Berkeley, 1983.  Ekvivalent (točen?)
  UFS v SunOS.  Ima pojme kot so skupine cilindrov, fragmenti.

FSF (Free Software Foundation)

Mach: sodobna jedra z univerze CMU (Carnegie Mellon University),
  na katerih temelji veliko Unixov in drugih OS (npr. OSF/1, MacMach, ...):
  <itemize>
    <item>2.5: monolitno jedro z 4.2BSD
    <item>3.0: mikrojedro s strežnikom BSD Unix v uporabniškem
      prostoru (in drugi OS, npr. MS-DOS)
  </itemize>
  Novičarska skupina: <htmlurl name="comp.os.mach" url="news:comp.os.mach">.

MFS (Memory File System): pomnilniški datotečni sistem

NeWS (Network extensible Window System), podjetja Sun?: temelji na
  PostScriptu, omrežen, zbirke orodij (in tudi odjemnikov) naloženih
  v strežnik.  Del OpenWindows.

NFS (Network File System):  Sun je prispeval v BSD, strežnik brez stanj
  (angl. stateless server)

ONC (Open Network Computing): Sun(?), vključuje RPC, imenski strežnik
  (NIS, znan tudi kot YP), NFS, ... (najdemo ga v veliko Unixih in drugih
  OS).

OpenStep &lsqb;NeXT, Sun&rsqb;: ???

PowerOpen: standard in organizacija za promocijo PowerPC.
  Vključuje IBM, Apple in Motorolo; drugi? 
 Glejte zgornji razdelek <ref id="mainplayers"
  name=",,Glavni igralci in standardi Unixa``">.

PowerPC (PPC): procesorski čip RISC &lsqb;IBM, Motorola&rsqb;.

RFS (Remote File System):  SV, strežnik s stanji (angl. stateful server),
  nezdružljiv z NFS

RPC (Remote Procedure Call): visoko-nivojski mehanizem IPC (med-procesna
  komunikacija).  Dve vrsti.
  <itemize>
    <item>ONC: Čez TCP ali UDP (pozneje OSI), uporablja XDR za šifriranje
      podatkov.
    <item>DCE: ima drugačen mehanizem RPC (temelji na NCS Apolla)
  </itemize>

S5 FS:  domorodni datotečni sistem Systema V, bloki od 512 bytov do 2 Kb.

sockets (vtiči):  BSD-jev vmesniški mehanizem za omrežja (primerjajte
  s TLI).

STREAMS:  mehanizem podajanja sporočil, najprej v SVR3, ki poskrbi
  za zelo dober vmesnik za razvoj protokolov.

TFS (Translucent File System): Sun, COW, uporabljen na datotekah.

TLI (Transport Library Interface):  vmesnik SV do transportnih
  storitev (TCP, OSI).  UI je tudi definiral APLI (ACSE/Presentation
  Library Interface)

UFS (?): domorodni sistem BSD, kot ga vidi SunOS, bloki od 4 Kb do 8 Kb,
  skupine cilindrov, fragmenti.

XTI (X/Open Transport Interface):  TLI z izboljšavami

X11:  okenski sistem z MIT-a, orientiran na pike



<!-- 7 -->
<sect>Primerjava sistemov za upravljanje konfiguracij (RCS, SCCS).
<p>
<sect1>RCS vs. SCCS:  Uvod
<p>
<verb>
Subject: RCS vs SCCS:  Introduction
Date: Sat, 10 Oct 92 19:34:39 +0200
From: Bill Wohler <wohler@newt.com>
</verb>
<p>
V nedavni anketi je bila večina glasov v prid RCS, nekaj v prid SCCS,
in nekaj predlaganih alternativ, kot je CVS.

Funkcionalno sta RCS in SCCS praktično ekvivalentna.  RCS ima
nekaj več odlik, saj se še naprej osvežuje.

Vedite tudi, da se je RCS učil na napakah SCCS ...



<sect1>RCS vs. SCCS:  Kako sta primerljiva vmesnika?
<p>
<verb>
Subject: RCS vs SCCS:  How do the interfaces compare?
Date: Sat, 10 Oct 92 19:34:39 +0200
From: Bill Wohler <wohler@newt.com>
</verb>
<p>
RCS ima za nove uporabnike preprostejši vmesnik.  Obstaja manj ukazov,
je bolj intuitiven in konsistenten, in ponuja več uporabnih
argumentov.

V SCCS morajo biti veje posebej ustvarjene.  V RCS se preverjajo kot
katerikoli druga različica.



<sect1>RCS vs. SCCS:  Kaj je v datoteki popravkov?
<p>
<verb>
Subject: RCS vs SCCS:  What's in a Revision File?
Date: Sat, 10 Oct 92 19:34:39 +0200
From: Bill Wohler <wohler@newt.com>
</verb>
<p>
RCS shranjuje zgodovino v datotekah s podaljškom ,,<tt/,v/``.  SCCS
shranjuje zgodovino v datotekah s predpono ,,<tt/s./``.

RCS v trenutnem imeniku in podimeniku za RCS samodejno poišče datoteke
za RCS, lahko pa določite tudi kakšno drugo datoteko za RCS.
Uporabniški vmesnik <tt/sccs/ programa SCCS vedno uporablja imenik za
SCCS.  Če ne uporabljate uporabniškega vmesnika <tt/sccs/, morate
določiti polno ime datoteke za SCCS.

RCS shranjuje svoje popravke tako, da vzdržuje kopijo zadnje različice
in razlike besedila do prejšnjih različic.  SCCS uporablja koncept
,,združevanja razlik``.

Vsa aktivnost RCS se dogaja v eni sami datoteki za RCS.  SCCS vzdržuje
več datotek.  To je lahko neredno in begajoče.

Ročno urejanje datotek za RCS ali za SCCS je slaba zamisel, saj so
napake tako lahke za storiti in tako usodne za zgodovino datoteke.  V
obeh primerih je lahko urejati podatke o popravkih, vendar ne želite
popravljati resničnega besedila različice v RCS.  Če urejate datoteko
za SCCS, boste morali preračunati kontrolno vsoto s programom
<tt/admin/.



<sect1>RCS vs. SCCS:  Katere so ključne besede?
<p>
<verb>
Subject: RCS vs SCCS:  What are the keywords?
Date: Sat, 10 Oct 92 19:34:39 +0200
From: Bill Wohler <wohler@newt.com>
</verb>
<p>
RCS in SCCS uporabljata različne ključne besede, ki se v besedilu
razvijejo.  Pri SCCS se, ob izvlečenju datoteke za branje, ključna
beseda ,,<tt>%I%</tt>`` nadomesti s številko popravka.

Ključne besede RCS so lažje za zapomnitev, toda razvijanje ključnih
besed se lažje nastavi v SCCS.

V SCCS se ključne besede razvijejo pri izvlečenju le za branje.  Če se
različica z razvitimi ključnimi besedami prepiše v datoteko, ki bi
morala biti razlikovana (angl. deltaed), so ključne besede izgubljene
in podatki o različicah datoteke ne bodo osveževani.  Po drugi strani,
RCS ob razvitju obdrži ključne besede, torej se temu izogne.



<sect1>Kaj je simbolično ime v RCS?
<p>
<verb>
Subject: What's an RCS symbolic name?
Date: Sat, 10 Oct 92 19:34:39 +0200
From: Bill Wohler <wohler@newt.com>
</verb>
<p>
RCS vam dovoljuje obravnavati množico datotek kot družino datotek,
medtem, ko je SCCS mišljen prvotno za hranjenje zgodovine popravkov
datotek.

RCS to omogoča z uporabo simboličnih imen: vse izvorne datoteke, ki so
povezane z aplikacijsko različico, lahko označite z uporabo
<tscreen><verb>
rcs -n
</verb></tscreen>
in jih pozneje zlahka izvlečete kot združeno enoto.  V SCCS bi morali
za to napisati skript, ki bi vpisoval in bral vsa imena datotek in
različic v in iz datoteke.



<sect1>RCS vs. SCCS:  Kaj pa hitrost?
<p>
<verb>
Subject: RCS vs SCCS:  How do they compare for performance?
Date: Sat, 10 Oct 92 19:34:39 +0200
From: Bill Wohler <wohler@newt.com>
</verb>
<p>
Ker sistem RCS shranjuje celotno zadnjo različico, je precej hitrejši
pri izvlečenju zadnje različice.  Od RCS 5.6 naprej je tudi hitrejši
od SCCS pri izvlečenju starejših različic.



<sect1>RCS vs. SCCS:  Identifikacija različic
<p>
<verb>
Subject: RCS vs SCCS:  Version Identification.
Date: Sat, 10 Oct 92 19:34:39 +0200
From: Bill Wohler <wohler@newt.com>
</verb>
<p>
SCCS zna ugotoviti, kdaj se je v sistem dodala določena vrstica kode.



<sect1>RCS vs. SCCS:  Kako se obnašata v težavah?
<p>
<verb>
Subject: RCS vs SCCS:  How do they handle problems?
Date: Sat, 10 Oct 92 19:34:39 +0200
From: Bill Wohler <wohler@newt.com>
</verb>
<p>
Če vam manjkajo orodja za SCCS ali RCS, ali, če je datoteka popravkov
v RCS ali SCCS pokvarjena in orodja nočejo delati z njo, lahko še
vedno obnovite zadnjo različico v sistemu RCS.  To za SCCS ni res.



<sect1>RCS vs. SCCS:  Kako se razumeta z ukazom <tt>make(1)</tt>?
<p>
<verb>
Subject: RCS vs SCCS:  How do they interact with make(1)?
Date: Wed, 30 Dec 1992 10:41:51 -0700
From: Blair P. Houghton <bhoughto@sedona.intel.com>
</verb>
<p>
Dejstvo, da SCCS uporablja predpone za imena datotek
(<tt>s.datoteka.c</tt>) pomeni, da jih <tt>make(1)</tt> ne more
obravnavati na običajen način, in morate uporabiti posebna pravila (z
uporabo znakov ,<tt/&tilde;/`), da ga pripravite k sodelovanju s SCCS;
kljub temu <tt>make(1)</tt> na nekaterih platformah Unixa ne bo
uporabil privzetih pravil za datoteke, ki jih upravlja SCCS.

Zapis s podaljškom (<tt>datoteka.c,v</tt>), ki ga uporablja RCS,
pomeni, da lahko v vseh izvedbah programa <tt>make</tt> uporabljate
običajna podaljškovna pravila, tudi, če izvedba ni načrtovana posebej
za obvladovanje datotek RCS.



<sect1>RCS vs. SCCS:  Pretvorba
<p>
<verb>
Subject: RCS vs SCCS:  Conversion.
Date: Tue, 10 Jan 1995 21:01:41 -0500
From: Ed Ravin <elr@wp.prodigy.com>
</verb>
<p>
Za pretvorbo iz SCCS v RCS je na voljo nepodprti skript za ukazno
lupino <tt/csh/.  Najdete ga lahko na naslovu <url
url="ftp://ftp.std.com/src/gnu/cvs-1.3/contrib/sccs2rcs">.

Za pretvorbo iz RCS v SCCS morate napisati svoj skript ali program.



<sect1>RCS vs. SCCS:  Podpora
<p>
<verb>
Subject: RCS vs SCCS:  Support
Date: Sat, 10 Oct 92 19:34:39 +0200
From: Bill Wohler <wohler@newt.com>
</verb>
<p>
SCCS podpira podjetje AT&amp;T.  RCS podpira ustanova Free Software
Foundation.  Torej RCS teče na veliko več platformah, vključno z
osebnimi računalniki.

Večina programov <tt/make/ prepozna SCCS-jevo predpono ,,<tt/s./``,
medtem, ko je GNU-jev <tt/make/ eden redkih, ki obravnavajo RCS-jev
podaljšek ,,<tt/,v/``.

Nekateri programi <tt/tar/ imajo izbiro <tt/-F/, ki ignorira imenike
za RCS, za SCCS, ali oboje.



<sect1>RCS vs. SCCS:  Primerjava ukazov
<p>
<verb>
Subject: RCS vs SCCS:  Command Comparison
Date: Sat, 10 Oct 92 19:34:39 +0200
From: Bill Wohler <wohler@newt.com>
</verb>
<p>
<verb>
SCCS                        RCS                   Razlaga
====                        ===                   =======

sccs admin -i -ndat dat     ci dat                Prvič vpiše datoteko
                                                  ,dat` in ustvari
						  datoteko sprememb.

sccs get dat                co dat                Izvleče datoteko
                                                  ,dat` za branje.

sccs edit dat               co -l dat             Izvleče ,dat` za
                                                  spremembo.

sccs delta dat              ci dat                Izvleče predhodno
                                                  zaklenjeno datoteko.

what dat                    ident dat             Izpiše informacijo
                                                  o ključni besedi.

sccs prs dat                rlog dat              Izpiše zgodovino
                                                  datoteke.

sccs sccsdiff -rx -ry dat   rcsdiff -rx -ry dat   Primerja dva popravka.

sccs diffs dat              rcsdiff dat           Primerja trenutno
                                                  različico z zadnjim
						  popravkom.

sccs edit -ix-y dat         rcsmerge -rx-y dat    Združi spremembe med
                                                  dvema različicama
                                                  v datoteko.

???                         rcs -l dat            Zaklene zadnji
                                                  popravek.

???                         rcs -u dat            Odklene zadnji
                                                  popravek.  Morda
                                                  stre ključavnico
                                                  drugega uporabnika,
						  a mu pošlje
						  sporočilo z razlago.
</verb>



<sect1>RCS vs. SCCS:  Priznanja
<p>
<verb>
Subject: RCS vs SCCS:  Acknowledgements
Date: Sat, 10 Oct 92 19:34:39 +0200
From: Bill Wohler <wohler@newt.com>
</verb>
<p>
Želim se zahvaliti naslednjim ljudem, ki so prispevali te članke.  Na
ta spisek želim dodati tudi vaše ime - prosim, pošljite pripombe ali
dodatne vire Billu Wohlerju &lt;<htmlurl name="wohler@newt.com"
url="mailto:wohler@newt.com">&gt;.
<itemize>
  <item>Karl Vogel &lt;<tt>vogel@c-17igp.wpafb.af.mil</tt>&gt;
  <item>Mark Runyan &lt;<tt>runyan@hpcuhc.cup.hp.com</tt>&gt;
  <item>Paul Eggert &lt;<tt>eggert@twinsun.com</tt>&gt;
  <item>Greg Henderson &lt;<tt>henders@infonode.ingr.com</tt>&gt;
  <item>Dave Goldberg &lt;<tt>dsg@mbunix.mitre.org</tt>&gt;
  <item>Rob Kurver &lt;<tt>rob@pact.nl</tt>&gt;
  <item>Raymond Chen &lt;<tt>rjc@math.princeton.edu</tt>&gt;
  <item>Dwight &lt;<tt>dwight@s1.gov</tt>&gt;
</itemize>



<sect1>Ali lahko dobim več podatkov o sistemih za upravljanje konfiguracij?
<p>
<verb>
Subject: Can I get more information on configuration management systems?
Date: Thu Oct 15 10:27:47 EDT 1992
From: Ted Timar <tmatimar@isgtec.com>
</verb>
<p>
Bill Wohler, ki je zbral vse podatke v tem delu teh PZV, je zbral še
dosti več podatkov.  Dobite jih na naslovu <url
url="ftp://ftp.wg.omron.co.jp/pub/unix-faq/docs/rev-ctl-sys">.


</article>
