Pogosto zastavljena vpra¹anja o Unixu Ted Timar <tmatimar@isgtec.com> v2.9, 11. junij 1996 _________________________________________________________________ Povzetek Pred vami je slovenski prevod spisa Unix FAQ, pogosto zastavljenih vpra¹anj z odgovori v novièarskih skupinah comp.unix.questions in 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! _________________________________________________________________ Kazalo 1. Administrativni podatki * 1.1 O tem spisu * 1.2 Pravna za¹èita * 1.3 Dostopnost * 1.4 Zahvale 2. Splo¹na vpra¹anja * 2.1 Kaj pomeni ¹tevilka v oklepajih pri sklicevanju na ,rm(1)` ali ,ctime(3)`? * 2.2 Kaj pomeni {kak¹en nerazumljiv ukaz na Unixu}? * 2.3 Kako deluje most med novièarsko skupino ,,comp.unix.questions`` * 2.4 Katere so uporabne knjige o Unixu ali C-ju? * 2.5 Kaj se je zgodilo s seznamom izgovarjave, ki je bil del tega spisa? 3. Relativno osnovna vpra¹anja, ki jih navadno spra¹ujejo zaèetniki * 3.1 Kako odstranim datoteko z imenom, ki se zaène z ,-`? * 3.2 Kako odstranim datoteko, ki ima v svojem imenu èudne znake? * 3.3 Kako dobim rekurziven izpis vsebine imenika? * 3.4 Kako lahko v svoj pozivnik vkljuèim ime trenutnega imenika? * 3.5 Kako s skriptom ukazne lupine preberem znake s terminala? * 3.6 Kako preimenujem *.foo v *.bar ali spremenim imena datotek v male èrke? * 3.7 Zakaj dobim ob ukazu ,,rsh gostitelj ukaz`` [kak¹no èudno sporoèilo o napaki]? * 3.8 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? * 3.9 Kako lahko v csh loèeno preusmerim stdout in stderr? * 3.10 Kako znotraj .cshrc ugotovim, ali sem prijavna ukazna lupina? * 3.11 Kako v lupini naredim ujemalni vzorec, ki se ujema z vsemi datotekami, razen z ,,.`` in ,,..``? * 3.12 Kako poi¹èem zadnji argument v skriptu Bournove ukazne lupine? * 3.13 Kaj je narobe, èe imam ,.` v svoji poti $PATH? * 3.14 Kako lahko iz skripta ukazne lupine zapiskam na terminalu? * 3.15 Zakaj ne morem uporabiti programa ,,talk`` za pogovor s prijateljem na stroju X? * 3.16 Zakaj da koledar napaèen izpis? 4. Vmesna vpra¹anja * 4.1 Kako lahko ugotovim èas, ko je bila datoteka ustvarjena? * 4.2 Kako lahko uporabim rsh, ne da bi rsh poèakal konec oddaljenega ukaza? * 4.3 Kako lahko skraj¹am datoteko? * 4.4 Zakaj simbol ,,{}`` ukaza find ne naredi to, kar ¾elim? * 4.5 Kako lahko za¹èitim simboliène povezave? * 4.6 Kako lahko ,,obnovim`` pobrisano datoteko? * 4.7 Kako lahko proces ugotovi, ali teèe v ozadju? * 4.8 Zakaj preusmerjanje v zanki ne dela, kot bi moralo? (Bournova lupina) * 4.9 Kako po¾enem passwd, ftp, telnet, tip in druge interaktivne programe v skriptu ukazne lupine v ozadju? * 4.10 Kako lahko v skriptu ali programu ugotovim ID procesa, ki pripada programu z doloèenim imenom? * 4.11 Kako preverim izhodni status oddaljenega ukaza, pognanega z rsh? * 4.12 Je mogoèe programu awk podati tudi spremenljivke ukazne lupine? * 4.13 Kako se znebim procesov-zombijev, ki vztrajajo? * 4.14 Kako dobim vrstice iz cevovoda tako, kot se pi¹ejo, namesto le v veèjih blokih? * 4.15 Kako lahko vstavim datum v ime datoteke? * 4.16 Zakaj se nekateri skripti zaènejo z ,,#!...``? 5. Napredna vpra¹anja; radi jih vpra¹ujejo ljudje, ki mislijo, da ¾e poznajo vse odgovore * 5.1 Kako berem znake s terminala, ne da bi bilo uporabniku treba pritisniti RETURN? * 5.2 Kako preverim, èe je treba prebrati znak, ne da bi ga zares prebral? * 5.3 Kako ugotovim ime odprte datoteke? * 5.4 Kako lahko tekoèi program ugotovi svojo lastno pot? * 5.5 Kako uporabim popen() za odprtje procesa za branje in pisanje? * 5.6 Kako izvedem v C-ju sleep() za manj kot sekundo? * 5.7 Kako pripravim skripte ,setuid` ukazne lupine do delovanja? * 5.8 Kako lahko ugotovim, kateri uporabnik ali proces ima odprto datoteko ali uporablja doloèen datoteèni sistem (da ga lahko odklopim)? * 5.9 Kako izsledim ljudi, ki me tipajo (s finger)? * 5.10 Je mogoèe ponovno prikljuèiti proces na terminal, ko je bil ta odklopljen, tj. po zagonu programa v ozadju in odjavi? * 5.11 Je mogoèe ,,vohuniti`` na terminalu, gledajoè izhod, ki se prikazuje na drugem terminalu? 6. Vpra¹anja, povezana z razliènimi ukaznimi lupinami in njihovimi razlikami * 6.1 Se lahko ukazne lupine klasificirajo v kategorije? * 6.2 Kako ,,vkljuèim`` en skript ukazne lupine iz drugega lupinskega skripta? * 6.3 Ali vse ukazne lupine podpirajo vzdevke (angl. aliases)? Lahko uporabimo tudi kaj drugega? * 6.4 Kako se prirejajo spremenljivke ukaznih lupin? * 6.5 Kako ugotovim, ali poganjam interaktivno ukazno lupino? * 6.6 Katere datoteke ,,s piko`` uporabljajo razliène ukazne lupine? * 6.7 Zanima me veè o razlikah med razliènimi ukaznimi lupinami. 7. Pregled razlièic Unixa * 7.1 Opozorilo in uvod * 7.2 Zelo kratek pogled na zgodovino Unixa * 7.3 Glavne vrste Unixa * 7.4 Glavni igralci in standardi Unixa * 7.5 Ugotovitev vrste va¹ega Unixa * 7.6 Kratki opisi nekaterih znanih (komercialnih/prostih) Unixov * 7.7 Unixi, delujoèi v realnem èasu * 7.8 Slovarèek Unixa 8. Primerjava sistemov za upravljanje konfiguracij (RCS, SCCS). * 8.1 RCS vs. SCCS: Uvod * 8.2 RCS vs. SCCS: Kako sta primerljiva vmesnika? * 8.3 RCS vs. SCCS: Kaj je v datoteki popravkov? * 8.4 RCS vs. SCCS: Katere so kljuène besede? * 8.5 Kaj je simbolièno ime v RCS? * 8.6 RCS vs. SCCS: Kaj pa hitrost? * 8.7 RCS vs. SCCS: Identifikacija razlièic * 8.8 RCS vs. SCCS: Kako se obna¹ata v te¾avah? * 8.9 RCS vs. SCCS: Kako se razumeta z ukazom make(1)? * 8.10 RCS vs. SCCS: Pretvorba * 8.11 RCS vs. SCCS: Podpora * 8.12 RCS vs. SCCS: Primerjava ukazov * 8.13 RCS vs. SCCS: Priznanja * 8.14 Ali lahko dobim veè podatkov o sistemih za upravljanje konfiguracij? _________________________________________________________________ 1. Administrativni podatki 1.1 O tem spisu Pred vami je slovenski prevod spisa Unix FAQ, pogosto zastavljenih vpra¹anj z odgovori v novièarskih skupinah comp.unix.questions in 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 comp.unix.questions in 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 ,,Answers to Frequently Asked Questions`` v novièarski skupini 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 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 roman.maurer@fmf.uni-lj.si. 1.2 Pravna za¹èita Zbirko originalnih nasvetov je pravno za¹èitil (c) 1994 Ted Timar, razen dela ,,Pregled razlièic Unixa``, ki sta ga za¹èitila (c) 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. 1.3 Dostopnost 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 ftp://rtfm.mit.edu/pub/usenet/news.answers/, ki je zrcaljen tudi na slovenskem stre¾niku ftp://ftp.arnes.si/usenet/news.answers/. Ime, pod katerim se arhivira PZV, vidite v vrstici ,,Archive-Name:`` na vrhu èlanka. Original teh PZV je shranjen pod imeni ,,unix-faq/faq/part[1-7]``. Formatirane razlièice originalnega spisa Unix FAQ v formatu Texinfo, tekstovnem formatu in formatu za *roff so dostopne z anonimnim FTP-jem v imeniku 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 ftp://ftp.lugos.si/pub/lugos/doc/FAQ-sl/ (i¹èite datoteke Unix-FAQ-sl.*) ali v svetovnem spletu na naslovu http://www.lugos.si/delo/slo/HOWTO-sl/Unix-FAQ-sl.html. 1.4 Zahvale Subject: Who helped you put this list together? Date: Thu Mar 18 17:16:55 EST 1993 Ta spis je ena prvih zbirk pogosto zastavljenih vpra¹anj (PZV; angl. Frequently Asked Questions - FAQ). Prviè je bil sestavljen julija 1989. Ted Timar <tmatimar@isgtec.com> 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 ,,Vpra¹anja, povezana z razliènimi ukaznimi lupinami in njihovimi razlikami`` je prete¾no zapisal Matthew Wicks <wicks@dcdmjw.fnal.gov>. Temo ,,Pregled razlièic Unixa`` je prete¾no zapisal Pierre (P.) Lewis <lew@bnr.ca>. 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 *roff (paketi makro ukazov ms in mm). Andrew Cromarty ga je pretvoril v format Texinfo. Marty Leisner <leisner@sdsp.mc.xerox.com> 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: * Steve Hayman <shayman@Objectario.com> * Pierre Lewis <lew@bnr.ca> * Jonathan Kamens <jik@mit.edu> * Tom Christiansen <tchrist@mox.perl.com> * Maarten Litmaath <maart@nat.vu.nl> * Guy Harris <guy@auspex.com> Dne 26. septembra 1998 s popravki 16. februarja 1999 je Roman Maurer <roman.maurer@fmf.uni-lj.si> ta spis prevedel v sloven¹èino. Hvala Ale¹u Ko¹irju <kosir@hermes.si> za ¹tevilne popravke prevoda! _________________________________________________________________ 2. Splo¹na vpra¹anja 2.1 Kaj pomeni ¹tevilka v oklepajih pri sklicevanju na ,rm(1)` ali ,ctime(3)`? Subject: When someone refers to 'rn(1)' ... the number in parentheses mean? Date: Tue, 13 Dec 1994 16:37:26 -0500 ©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 man 3 ctime in s tem pogledate stran o ,,ctime`` v tretjem poglavju priroènika. Tradicionalna poglavja priroènika so: 1 Ukazi na uporabni¹kem nivoju 2 Sistemski klici 3 Funkcije v knji¾nicah 4 Naprave in gonilniki naprav 5 Datoteèni formati 6 Igre 7 Razliène zadeve - paketi makro ukazov itd. 8 Ukazi za vzdr¾evanje in tek sistema Nekatere razlièice Unixa uporabljajo ne¹tevilska imena razdelkov. Xenix, na primer, uporablja ,,C`` za ukaze in ,,S`` za funkcije. Nekatere novej¹e razlièice Unixa se razlikujejo in razumejo ukaz v obliki ,,man -s# naslov`` namesto ,,man # title``. Vsako poglavje ima uvod, ki ga lahko preberete z ukazom man # intro kjer je # ¹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 ,,time(1)``, stran referenènega priroènika o ukazu ,time` za merjenje èasov izvajanja programov, in tudi ,,time(3)``, stran referenènega priroènika o podprogramu ,time`, s katerim prika¾ete trenutni èas. Uporabite lahko razlièici ,,man 1 time`` ali ,,man 3 time`` 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. 2.2 Kaj pomeni {kak¹en nerazumljiv ukaz na Unixu}? Subject: What does {some strange unix command name} stand for? Date: Thu Mar 18 17:16:55 EST 1993 awk "Aho Weinberger & Kernighan" Jezik in program, ki ga interpretira, se imenujeta po zaèetnicah priimkov njegovih avtorjev, ki so Al Aho, Peter Weinberger in Brian Kernighan. grep "Global Regular Expression Print" Izraz grep izhaja iz ukaza za ed, ki je izpisal vse vrstice, ki so ustrezale podanemu iskalnemu vzorcu g/re/p kjer pomeni ,,re`` ,,regularni izraz`` (angl. regular expression). fgrep "Fixed GREP" fgrep i¹èe le fiksne vzorce. Èrka ,f` ni okraj¹ava za ,,fast`` (slov. ,,hitro``) - pravzaprav je ,,fgrep foobar *.c`` navadno poèasnej¹i kot ,,egrep foobar *.c`` (Da, to je nekam presenetljivo. Poskusite!) Fgrep je vseeno uporaben, ko i¹èete v datoteki veèje ¹tevilo iskalnih vzorcev, kot jih prenese egrep. egrep "Extended GREP" egrep uporablja imenitnej¹e regularne izraze kot grep. Mnogi ljudje vselej uporabljajo egrep, saj uporablja bolj¹e algoritme kot grep ali fgrep in je navadno najhitrej¹i od njih. cat "CATenate" Obrobna angle¹ka beseda ,,catenate`` pomeni ,,spenjati (z verigo)`` ali ,,povezovati v zaporedja``, kar je toèno to, kar naredi ,,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). gecos "General Electric Comprehensive Operating Supervisor" Ko je podjetje General Electric prodalo svojo enoto za velike sisteme podjetju Honeywell, je ta izpustil ,,E`` iz ,,GECOS``. Datoteka z gesli za Unix ima polje ,,pw_gecos``. To polje je resnièni ostanek zgodnjih èasov. Dennis Ritchie je poroèal: Vèasih smo poslali tiskalni¹ki izhod ali paketna opravila na stroj GCOS. Polje gcos v datoteki z gesli je bilo mesto, v katerega smo stlaèili podatke za kartico $IDENT. Ni ravno elegantno. nroff "New ROFF" troff "Typesetter new ROFF" To sta naslednika programa ,,roff``, ki je bil ponovna izvedba programa ,,runoff`` s sistema Multics in s katerim ste ,,iztirili`` (angl. ,,run off``) dober izvod va¹ega dokumenta. tee T Po izrazoslovju vodovodnih in¹talaterjev - cepilec pipe v obliki èrke T. bss "Block Started by Symbol" Dennis Ritchie pravi: 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 [-hm?] 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.) 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``). biff "BIFF" 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: Potrdim lahko izvor imena 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. rc (kot v ,,.cshrc`` ali ,,/etc/rc``) "RunCom" ,,rc`` izhaja iz ,,runcom`` s sistema MIT CTSS pribli¾no okrog leta 1965. Brian Kernighan & Dennis Ritchie sta takole pripovedovala Vicki Brown: Obstajal je pripomoèek, ki je izvedel ukaze, shranjene v datoteki; imenoval se je ,,runcom``, okraj¹ava za ,,run commands`` (slov. po¾eni ukaze), in tak¹no datoteko smo zaèeli klicati ,,neki runcom``. ,,rc`` v Unixu je ostalina te uporabe. ,,rc`` je tudi ime ukazne lupine novega operacijskega sistema Plan 9. Perl "Practical Extraction and Report Language" ali Perl "Pathologically Eclectic Rubbish Lister" 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 comp.lang.perl.misc. Knjiga ,,Life with Unix`` Dona Libesa vsebuje mnogo veè tak¹nih poslastic. 2.3 Kako deluje most med novièarsko skupino ,,comp.unix.questions`` in elektronskim seznamom ,,info-unix``? Subject: How does the gateway between "comp.unix.questions" ... work ? Date: Thu Mar 18 17:16:55 EST 1993 Elektronska seznama ,,info-unix`` in ,,unix-wizards`` sta posebni po¹tni razlièici skupin comp.unix.questions in 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 info-unix-request@brl.mil ali unix-wizards-request@brl.mil. Ne prièakujte takoj¹njega odgovora. Tukaj so podrobnosti, zahvaljujoè vzdr¾evalcu seznama, Bobu Reschlyju: Po¹iljanje na seznama info-UNIX in UNIX-wizards 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 ( comp.unix.questions ali 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 ,,news@brl-adm``. 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. 2.4 Katere so uporabne knjige o Unixu ali C-ju? Subject: What are some useful Unix or C books? Date: Thu Mar 18 17:16:55 EST 1993 Mitch Wright (mitch@cirrus.com) 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 ftp://ftp.rahul.net/pub/mitch/YABL/yabl (192.160.13.1). Popravke in predloge po¹iljajte na mitch@cirrus.com. Samuel Ko (kko@sfu.ca) 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 ftp://rtfm.mit.edu/pub/usenet/news.answers/books/unix. Popravke in predloge po¹iljajte na kko@sfu.ca. Èe ne morete uporabiti anonimnega FTP-ja, po¹ljite vrstico ,,help`` na ftpmail@decwrl.dec.com za navodila o prena¹anju datotek po elektronski po¹ti. 2.5 Kaj se je zgodilo s seznamom izgovarjave, ki je bil del tega spisa? Subject: What happened to the pronunciation list ... ? Date: Thu Mar 18 17:16:55 EST 1993 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 <carlp@frigg.isc-br.com>. 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, <eric@snark.thyrsus.com>), 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 ftp://ftp.wg.omron.co.jp/pub/unix-faq/docs/Pronunciation-Guide. _________________________________________________________________ 3. Relativno osnovna vpra¹anja, ki jih navadno spra¹ujejo zaèetniki 3.1 Kako odstranim datoteko z imenom, ki se zaène z ,-`? Subject: How do I remove a file whose name begins with a "-" ? Date: Thu Mar 18 17:16:55 EST 1993 Poi¹èite tak naèin imenovanja datoteke, da se ne zaène s pomi¹ljajem. Najpreprostej¹i odgovor je primer rm ./-imedatoteke (seveda predvidevamo, da je ,,-imedatoteke`` v tem primeru v trenutnem imeniku). Ta naèin izogibanja dvoumnemu ,-` na zaèetku imen deluje tudi pri drugih ukazih. Veliko ukazov, posebej tistih, ki so bili napisani z uporabo rutine ,,getopt(3)`` za razèlembo argumentov, sprejme tudi argument ,,--``, ki pomeni ,,to je zadnja izbira, vse po tem ni veè izbira``. Va¹a razlièica rm potemtakem morebiti razume tudi rm -- -imedatoteke Nekatere razlièice rm, ki ne uporabljajo getopt(), razumejo podobno tudi en sam ,,-``, torej lahko poskusite kar z ,,rm - -imedatoteke``. 3.2 Kako odstranim datoteko, ki ima v svojem imenu èudne znake? Subject: How do I remove a file with funny characters in the filename ? Date: Thu Mar 18 17:16:55 EST 1993 Èe je ,,èuden znak`` znak ,/`, 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 ,,蹾ȩ®``), nadaljujte z branjem. Prvi klasièni odgovor je uporaba ukaza na naèin rm -i vzorec*ki*ustreza*le*datoteki*ki*jo*¾elite 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 rm -ri . ki vas za vsako datoteko v trenutnem imeniku vpra¹a, ali naj jo odstrani. V angle¹kem okolju odgovorite z ,y` pri problematièni datoteki in z ,n` pri vseh ostalih datotekah. ®al to ne deluje pri veliko razlièicah 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 ,,chmod a-x``, 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 ,,-r`` ukaza rm ali znaka * ali ? (angl. wildcard). Tretji klasièni odgovor je find . -type f ... -ok rm '{}' \; kjer je ,,...`` 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 ,,ls -i .``) in potem uporabite find . -inum 12345 -ok rm '{}' \; ali find . -inum 12345 -ok mv '{}' novo-ime-datoteke \; ,,-ok`` je varnostno preverjanje - program vas bo vpra¹al za potrditev ukaza, preden ga bo izvedel. Spra¹evanju se lahko izognete z uporabo ,,-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 ,/`? 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: ime datoteke inode datoteka1 12345 datoteka2.c 12349 datoteka3 12347 Teoretièno sta ,/` in ,\0` le dva znaka, ki se ne moreta pojaviti v imenu datoteke - znak ,/` zato, ker se uporablja za loèevanje imenikov in datotek, in znak ,\0` 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: ime datoteke inode 91/02/07 12357 Tak¹ne datoteke ne bo pobrisalo nobeno zgoraj opisano èaranje z ukazoma find in rm, saj morata tako tadva pripomoèka kot tudi vsi drugi programi na Unixu razumeti znak ,/` na obièajen naèin. Vsak obièajen program bo ¾elel narediti unlink("91/02/07"), kar jedro razume kot ,,pobri¹i datoteko 07 v podimeniku 02 imenika 91``, toda to ni tisto, kar hoèemo - imamo datoteko imenovano ,,91/02/07`` 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 ,,ls -i``, da boste izvedeli ¹tevilko inode nesreène datoteke, potem odklopite datoteèni sistem (z umount), uporabite ,,clri`` za izbris inodea, in popravite datoteèni sistem s ,,fsck`` in s stisnjenimi pestmi. Postopek unièi podatke o datoteki. Èe jih ¾elite obdr¾ati, lahko poskusite: * ustvarite nov imenik v istem star¹evskem imeniku, kot ga ima imenik, ki vsebuje datoteko na slabem glasu, * iz starega imenika v novega premaknite vse, kar lahko (se pravi vse, razen datoteke s slabim imenom), * na imeniku z datoteko s slabim imenom napravite ,,ls -id`` , da dobite njegovo ¹tevilko inumber, * odklopite datoteèni sistem, * uporabite ,,clri`` na imeniku, ki vsebuje sporno datoteko, * obnovite datoteèni sistem s ,,fsck``. Potem boste datoteko poiskali takole: * namestite datoteèni sistem; * preimenujte imenik, ki ste ga ustvarili, tako da bo imel enako ime, kot stari imenik (saj je stari imenik dokonèno pobrisal ,,fsck``); * premaknite datoteko iz imenika ,,lost+found`` v imenik s primernej¹im imenom. Alternativa temu pristopu je popravljanje imenika na zahteven naèin z brkljanjem po surovem datoteènem sistemu (angl. raw file system). Uporabite ,,fsdb``, èe ga imate. 3.3 Kako dobim rekurziven izpis vsebine imenika? Subject: How do I get a recursive directory listing? Date: Thu Mar 18 17:16:55 EST 1993 Nekaj od tega bo naredilo to, kar ¾elite: ls -R (vse razlièice ,ls` nimajo ,-R`) find . -print (to mora delovati povsod) du -a . (poka¾e ime in velikost) Èe i¹èete vzorec z jokerji (angl. wildcard), ki bo ustrezal vsem datotekam ,,.c`` v tem imeniku in pod njim, ga ne boste na¹li, paè pa lahko uporabite: % nek-ukaz `find . -name '*.c' -print` ,,find`` je zmogljiv program. Pouèite se o njem. 3.4 Kako lahko v svoj pozivnik vkljuèim ime trenutnega imenika? Subject: How do I get the current directory into my prompt? Date: Thu Mar 18 17:16:55 EST 1993 Odvisno od tega, katero ukazno lupino uporabljate. V nekaterih ukaznih lupinah je to preprosto, v drugih pa te¾ko ali celo nemogoèe. * C Shell (csh): Vstavite tole v svojo datoteko .cshrc - preuredite spremenljivko pozivnika po svojem okusu. alias setprompt 'set prompt="${cwd}% "' setprompt # nastavitev uvodnega pozivnika alias cd 'chdir \!* && setprompt' Èe uporabljate pushd in popd, boste potrebovali tudi: alias pushd 'pushd \!* && setprompt' alias popd 'popd \!* && setprompt' Nekatere lupine csh nimajo spremenljivke $cwd - namesto tega lahko uporabite `pwd`. Èe ¾elite dobiti v va¹ pozivnik le zadnjo komponento va¹ega trenutnega imenik (,,mail% `` namesto ,,/usr/spool/mail% ``), lahko uporabite alias setprompt 'set prompt="$cwd:t% "' Pomen operatorjev && in || v nekaterih starej¹ih lupinah csh je zamenjan. Poskusite: false && echo napaka Èe izpi¹e ,,napaka``, morate zamenjati && in || (in dobiti bolj¹o razlièico csh.) * Bourne Shell (sh): Èe imate novej¹o razlièico Bournove ukazne lupine (SVR2 ali novej¹o), lahko uporabite za izdelavo svojega ukaza funkcijo lupine, denimo ,,xcd``: xcd() { cd $* ; PS1="`pwd` $ "; } Èe imate starej¹o Bournovo ukazno lupino, je to zapleteno, a mogoèe. Dodajte v va¹o datoteko .profile: 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 in potem postavite ta izvedljivi skript (brez zamikanja!), recimo mu ,,xcd`` nekam v va¹o pot (PATH). : 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"} Zdaj spreminjajte imeniku z ukazom ,,xcd /nek/imenik``. * Korn Shell (ksh): Vstavite to v va¹o datoteko .profile: PS1='$PWD $ ' Èe ¾elite le zadnjo komponento imenika, uporabite PS1='${PWD##*/} $ ' * T C shell (tcsh) Tcsh je popularna izbolj¹ana razlièica csh z nekaterimi dodatnimi vgrajenimi spremenljivkami (in veliko drugih zmo¾nosti): %~ trenutni imenik, uporablja ~ za $HOME %/ polna pot trenutnega imenika %c ali %. konèna komponenta trenutnega imenika tako, da lahko preprosto uka¾ete set prompt='%~ ' * BASH (FSF-jeva ukazna lupina ,,Bourne Again SHell``) Simbol \w v $PS1 daje polno ime poti trenutnega imenika, z uporabo ~ za $HOME; \W daje osnovno ime (angl. basename) trenutnega imenika. Torej lahko poleg zgornjih re¹itev za sh in ksh uporabite tudi PS1='\w $ ' ali PS1='\W $ ' 3.5 Kako s skriptom ukazne lupine preberem znake s terminala? Subject: How do I read characters from the terminal in a shell script? Date: Thu Mar 18 17:16:55 EST 1993 V sh, uporabite read. Navadno se uporabi podobna zanka: while read vrstica do echo $vrstica ... done V csh uporabite $<, kot tukaj: while ( 1 ) set vrstica = "$<" if ( "$vrstica" == "" ) break ... end ®al se v csh ne da razloèevati med prazno vrstico in koncem datoteke. Èe uporabljate sh in bi radi prebrali en sam znak s terminala, lahko poskusite nekaj podobnega: 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 ." 3.6 Kako preimenujem *.foo v *.bar ali spremenim imena datotek v male èrke? Subject: How do I rename "*.foo" to "*.bar", or change file names to lowercase? Date: Thu Mar 18 17:16:55 EST 1993 Zakaj ne deluje ,,mv *.foo *.bar``? Premislite, kako ukazna lupina razvija jokerje (angl. wildcards). Niza ,,*.foo`` in ,*.bar`` se razvijeta, preden ukaz mv sploh vidi argumente. Odvisno od va¹e ukazne lupine lahko to spodleti na veè naèinov. CSH izpi¹e ,,No match.``, ker ne najde ,,*.bar``. SH izvede ,,mv a.foo b.foo c.foo *.bar``, kar bo uspelo le, èe imate en sam imenik, ki ustreza ,,*.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 ,,mv`` na vsaki posamezni datoteki. Èe ima va¹ sistem ,,basename``, lahko uporabite: * C Shell: foreach f ( *.foo ) set base=`basename $f .foo` mv $f $base.bar end * Bourne Shell: for f in *.foo; do base=`basename $f .foo` mv $f $base.bar done Nekatere ukazne lupine poznajo posebne mehanizme za zamenjavo vrednosti spremenljivk (angl. variable substitution features), tako lahko namesto ukaza ,,basename`` uporabite vgrajene mehanizme, kot so: * C Shell: foreach f ( *.foo ) mv $f $f:r.bar end * Korn Shell: for f in *.foo; do mv $f ${f%foo}bar done Èe nimate ukaza ,,basename`` ali bi ¾eleli preimenovati foo.* v bar.*, lahko uporabite kar ,,sed`` ali podobno orodje, da predelate ime datoteke, a v splo¹nem je ideja zanke enaka. S pripomoèkom ,,sed`` lahko spremenite imena datotek v ukaze za mv in po¹ljete ukaze za izvajanje lupini ,,sh``. Poskusite: ls -d *.foo | sed -e 's/.*/mv & &/' -e 's/foo$/bar/' | sh Obstaja program Vladimirja Lanina, imenovan ,,mmv``, ki opravi preimenovanje datotek in je bil aprila 1990 objavljen v comp.sources.unix (Volume 21, issues 87 and 88). Omogoèa vam uporabo na naèin mmv '*.foo' '=1.bar' 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: * C Shell: foreach f ( * ) mv $f `echo $f | tr '[A-Z]' '[a-z]'` end * Bourne Shell: for f in *; do mv $f `echo $f | tr '[A-Z]' '[a-z]'` done * Korn Shell: typeset -l l for f in *; do l="$f" mv $f $l done Èe ¾elite biti posebno temeljiti in pravilno obravnavati datoteke z izrojenimi imeni (ki vkljuèujejo presledke ali takorekoè karkoli), boste morali uporabiti: * Bourne Shell: for f in *; do g=`expr "xxx$f" : 'xxx\(.*\)' | tr '[A-Z]' '[a-z]'` mv "$f" "$g" done Ukaz ,expr` vedno izpi¹e ime datoteke, tudi, èe je to enako ,-n`, ali, èe vsebuje ube¾na zaporedja za System V, kakr¹no je ,\c`. Nekatere razlièice ukaza ,,tr`` potrebujejo ,[` in ,]`, nekatere ju ne. V tem konkretnem primeru ju je povsem ne¹kodljivo vkljuèiti. Razlièice ukaza tr, ki noèejo ,,[]`` bodo primerno mislile, da bi morale preslikati ,[` v ,[` in ,]` v ,]`. * Èe imate name¹èen programski jezik ,,perl``, lahko ta skript Larryja Walla za preimenovanje datotek uporabite zelo koristno. Uporabljate ga lahko za ¹irok spekter sprememb imen datotek. #!/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 $_; } 3.7 Zakaj dobim ob ukazu ,,rsh gostitelj ukaz`` [kak¹no èudno sporoèilo o napaki]? Subject: Why do I get [some strange error message] when I "rsh host command" ? Date: Thu Mar 18 17:16:55 EST 1993 (Govorimo o programu za oddaljeno ukazno lupino ,,rsh``, ki se ponekod imenuje ,,remsh`` ali ,,remote``. Obstaja tudi ukazna lupina z omejitvami, imenovana ,,rsh``, kar pa je druga stvar.) Èe va¹ oddaljeni raèun uporablja C-jevsko ukazno lupino (csh), bo oddaljeni gostitelj pognal csh, da bi izvedel va¹ ,ukaz`, in ukazna lupina bo prebrala va¹o oddaljeno datoteko .cshrc. Morda ta .cshrc vsebuje ,,stty``, ,,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 rsh na èudne naèine. Tukaj je primer. Denimo, da imate v va¹i datoteki .cshrc tole: stty erase ^H biff y Dobili boste èudna sporoèila, kot je tole: % rsh nek-stroj date stty: : Can't assign requested address Where are you? Tue Oct 1 09:24:45 EST 1991 Podobne napake lahko dobite, èe izvajate doloèena opravila pripomoèkov ,,at`` ali ,,cron``, ki prav tako bereta va¹o datoteko .cshrc. Na sreèo je popravek preprost. Zelo verjetno je v va¹i datoteki ,,.cshrc`` na kupe operacij, ki jih preprosto ni vredno izvajati drugje kot v interaktivnih ukaznih lupinah (npr. ,,set history=N``). Tedaj jih postavite v pogojni blok v va¹i ,,.cshrc`` z if ( $?prompt ) then operacije... endif Ker v neinteraktivnih ukaznih lupinah spremenljivka ,,prompt`` ni nastavljena, bodo sporne operacije izvedene le v interaktivnih ukaznih lupinah. Morda boste ¾eleli premakniti nekatere ukaze v va¹ prijavni skript .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 .login. 3.8 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? Subject: How do I ... and have that change affect my current shell? Date: Thu Mar 18 17:16:55 EST 1993 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 csh ime ,,mojskript`` in ta vsebuje: cd /zelo/dolga/pot setenv PATH /nekaj:/nekaj-drugega ali èe imate podoben skript za Bournovo ali Kornovo ukazno lupino cd /zelo/dolga/pot PATH=/nekaj:/nekaj-drugega export PATH in posku¹ate pognati ,,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 ,,cd``. Ta bo spremenil svoj trenutni imenik, in z ukazom ,,setenv`` spremenil 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 ,,.`` (za Bournovo ali Kornovo lupino) ali ukaz ,,source`` (za lupino C). Se pravi, v Bournovih ali Kornovih ukaznih lupinah napi¹ete . mojaskripta v lupini C pa source myscript È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 ,,Kako lahko dobim trenutni imenik v moj pozivnik?`` za nekaj primerov. Veliko bolj podroben odgovor je pripravil Thomas Michanek <xtm@telelogic.se>. Dobite ga lahko po FTP-ju z naslova ftp://ftp.wg.omron.co.jp/pub/unix-faq/docs/script-vs-env. 3.9 Kako lahko v csh loèeno preusmerim stdout in stderr? 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 V csh lahko preusmerite stdout z ,,>`` ter hkrati stdout in stderr z ,,>&``, a ni neposrednega naèina le za preusmeritev stderr. Najbolj¹e, kar lahko naredite, je ( ukaz >datoteka_za_stdout ) >&datoteka_za_stderr ki po¾ene ,,ukaz`` v ukazni podlupini; stdout se preusmeri znotraj podlupine v datoteko ,,datoteka_za_stdout``, stdout in stderr podlupine pa se skupaj preusmerita v datoteko ,,datoteka_za_stderr``, toda na tej toèki je stdout ¾e preusmerjen, tako da v datoteki ,,datoteka_za_stderr`` konèa pravzaprav le stderr. Èe ¾elite le prepreèiti preusmeritev stdout, tedaj to za vas stori sh: sh -c 'ukaz 2>datoteka_za_stderr' 3.10 Kako znotraj .cshrc ugotovim, ali sem prijavna ukazna lupina? Subject: How do I tell inside .cshrc if I'm a login shell? Date: Thu Mar 18 17:16:55 EST 1993 Ko ljudje govorijo tako, pravzaprav s tem mislijo nekaj od naslednjega: * Kako lahko ugotovim, ali gre za interaktivno ukazno lupino? ali pa * Kako lahko ugotovim, ali gre za najvi¹je nivojsko ukazno lupino? Morda lahko ugotovite, ali je va¹a ukazna lupina resnièno prijavna lupina (se pravi, bo prebrala ,,.login`` potem, ko bo opravila z ,,.cshrc``) tako, da zapravljate èas s ,,ps`` in ,,$$``. Prijavne lupine imajo v splo¹nem imena, ki se zaènejo s ,-`. Èe vas v resnici zanimata drugi dve vpra¹anji, je tukaj naèin organizacije va¹e datoteke .cshrc, da to izveste. _________________________________________________________________ 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 _________________________________________________________________ 3.11 Kako v lupini naredim ujemalni vzorec, ki se ujema z vsemi datotekami, razen z ,,.`` in ,,..``? Subject: How do I construct a ... matches all files except "." and ".." ? Date: Thu Mar 18 17:16:55 EST 1993 In vi ste mislili, da bo to preprosto ... * Ustreza vsem datotekam, ki se ne zaèenjajo z ,,.``; .* Ustreza vsem datotekam, ki se zaèenjajo z ,,.``, toda to vkljuèuje posebna vnosa ,,.`` in ,,..``, ki ju pogosto ne ¾elite; .[!.]* (Le novej¹e ukazne lupine; nekatere lupine uporabljajo ,,^`` namesto ,,!``; ukazne lupine POSIX-a morajo sprejeti ,,!``, a lahko sprejmejo tudi ,,^``; prenosljive aplikacije ne bi smele uporabljati necitiranega ,,^`` takoj za ,,[``.) Ustreza vsem datotekam, ki se zaènejo z ,,.`` in jim sledi ne-,,.``; ¾al bo to spregledalo ,,..foo``; .??* Ustreza datotekam, ki se zaènejo z ,,.`` in so dolge vsaj tri znake. To se prikupno izogne ,,.`` in ,,..``, a tudi spregleda ,,.a``. Èe ¾elite varno ujemanje z vsemi datotekami, razen ,,.`` in ,,..``, morate uporabiti 3 vzorce (èe nimate imen datotek, kot je ,,.a``, lahko izpustite prvega): .[!.]* .??* * Alternativno lahko zaposlite zunanji program ali dva in uporabite substitucijo znotraj narekovaja (angl. backquote substitution). To (ali ,ls -A` na nekaterih razlièicah Unixa) je precej dobro: `ls -a | sed -e '/^\.$/d' -e '/^\.\.$/d'` a tudi to bo zamoèilo pri datotekah z znaki za novo vrsto, znaki IFS ali jokerjih v njihovih imenih. V ksh lahko uporabite: .!(.|) * 3.12 Kako poi¹èem zadnji argument v skriptu Bournove ukazne lupine? Subject: How do I find the last argument in a Bourne shell script? Date: Thu Mar 18 17:16:55 EST 1993 Odgovor sta prispevala: * Martin Weitzel <@mikros.systemware.de:martin@mwtech.uucp> * Maarten Litmaath <maart@nat.vu.nl> Èe ste preprièani, da argumentov ni veè kot devet, potem lahko uporabite: eval zadnji=\${$#} V ukaznih lupinah, zdru¾ljivih s standardom POSIX, to deluje za vsako ¹tevilo argumentov. Vselej deluje tudi: for zadnji do : done Primer se posplo¹i takole: for i do predpredzadnji=$predzadnji predzadnji=$zadnji zadnji=$i done Zdaj pa denimo, da ¾elite odstraniti zadnji argument iz seznama ali obrniti seznam argumentov ali za vsak N dostopati neposredno do N-tega argumenta. Tukaj navajamo osnovni primer, kako to storiti, in uporabimo le vgrajene konstrukte ukazne lupine, ne da bi ustvarjali dodatne podprocese: 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 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! N-ti argument lahko zdaj poi¹èete takole: eval argN=\$argv$N Èe ¾elite obrniti argumente, morate spremeniti vrstico, oznaèeno z (1), argv="\"\$argv$h$t$u\" $argv" Kako odstranite zadnji argument, vam prepu¹èamo za nalogo. Èe dovoljujete tudi podprocese, ki morda izvajajo nevgrajene ukaze, lahko spremenljivke ,argvN` doloèite preprosteje: N=1 for i do eval argv$N=\$i N=`expr $N + 1` done 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 N-ti argument, saj so spremenljivke ,argvN` nastavljene v obratnem vrstnem redu: argv= for i do eval argv$#=\$i argv="\"\$argv$#\" $argv" shift done eval set x "$argv" shift 3.13 Kaj je narobe, èe imam ,.` v svoji poti $PATH? Subject: What's wrong with having '.' in your $PATH ? Date: Thu Mar 18 17:16:55 EST 1993 Malce ozadja: spremenljivka okolja PATH je seznam imenikov, loèenih z dvopièji. Ko vpi¹ete ukaz brez jasno doloèene poti (npr. napi¹ete ,,ls`` in ne ,,/bin/ls``), va¹a ukazna lupina i¹èe izvedljivo datoteko s tem imenom po vseh imenikih, na¹tetih v seznamu PATH, lepo po vrsti, in izvede prvi program, ki ga najde. Eden od imenikov v seznamu PATH je lahko tudi trenutni imenik ,,.``. Kot znak za trenutni imenik v seznamu PATH lahko uporabite tudi prazni imenik. Ta dva naèina oznaèevanja sta ekvivalentna: * za uporabnike csh: setenv PATH :/usr/ucb:/bin:/usr/bin setenv PATH .:/usr/ucb:/bin:/usr/bin * za uporabnike sh ali ksh: PATH=:/usr/ucb:/bin:/usr/bin export PATH PATH=.:/usr/ucb:/bin:/usr/bin export PATH Posestvovanje ,,.`` nekje v PATH je udobno - za poganjanje programov v trenutnem imeniku lahko namesto ,,./a.out`` napi¹ete ,,a.out``. A obstaja kavelj. Premislite, kaj se zgodi v primeru, da je ,,.`` prvi vnos v seznamu PATH. Denimo, da je va¹ trenutni imenik javno dostopen za pisanje, na primer ,,/tmp``. Èe je tam sluèajno program, imenovan ,,/tmp/ls``, ki ga je tam pustil kak drug uporabnik, ter vi napi¹ete ,,ls`` (namesto, da bi, seveda, pognali obièajen program ,,/bin/ls``), bo va¹a ukazna lupina pognala ,,./ls``, 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 ,,.`` na konec PATH: setenv PATH /usr/ucb:/bin:/usr/bin:. Èe ste zdaj v imeniku /tmp in napi¹ete ,,ls``, bo ukazna lupina najprej preiskala /usr/ucb, /bin in /usr/bin za program, imenovan ,,ls``, preden bo pogledala v ,,.``, kar daje manj mo¾nosti, da bi nehote pognali program ,,ls`` drugega uporabnika. Tudi to ni povsem varno - èe ste neroden strojepisec in nekega dne napi¹ete ,,sl -l`` namesto ,,ls -l``, tvegate, da boste pognali ,,./sl``, è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 ,,.`` vkljuèen v PATH: setenv PATH /usr/ucb:/bin:/usr/bin Èe naredite to, boste morali za zagon programov vselej pisati ,,./program`` namesto program, a poveèanje varnosti je verjetno vredno tega truda. 3.14 Kako lahko iz skripta ukazne lupine zapiskam na terminalu? 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 Odgovor je odvisen od razlièice va¹ega Unixa (ali raje od vrste programa ,,echo``, ki je na voljo na va¹em stroju). BSD-jevski ,,echo`` uporablja izbiro ,,-n`` za prepreèitev izpisa konènega znaka za konec vrstice (angl. final newline) in ne razume osmi¹kega zapisa \nnn. Ukaz se torej glasi echo -n '^G' kjer ^G pomeni dobesedni znak BEL (vstavite ga lahko v Emacsu s kombinacijo ,,Ctrl-Q Ctrl-G`` ali v vi z uporabo ,,Ctrl-V Ctrl-G``). Na Unixih SysV ukaz ,,echo`` razume zapis \nnn in uporablja \c za prepreèitev izpisa konènega znaka za konec vrstice, torej je odgovor: echo '\007\c' 3.15 Zakaj ne morem uporabiti programa ,,talk`` za pogovor s prijateljem na stroju X? 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 Unix ima tri raz¹irjene programe ,,talk`` in nobeden od njih se ne zna pogovoriti z ostalima. ,,Stari`` talk vkljuèuje prva dva tipa. Ta razlièica (pogosto imenovana otalk) pri pogovoru med stroji ni upo¹tevala vrstnega reda bytov. Zaradi tega se razlièica otalk za Vax ni mogla pogovarjati z razlièico otalk za Sun. Te razlièice 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 talk (pogosto imenovan ntalk), ki ve za omre¾ni vrstni red bytov. Ta talk deluje med vsemi stroji, ki ga podpirajo. Ta razlièica talk-a uporablja vrata 518. Dandanes obstaja nekaj programov talk, ki hkrati govorijo ntalk in eno od razlièic otalk. Najbolj znan med njimi se imenuje ,,ytalk``. 3.16 Zakaj da koledar napaèen izpis? Subject: Why does calendar produce the wrong output? From: tmatimar@isgtec.com (Ted Timar) Date: Thu Sep 8 09:45:46 EDT 1994 Pogosto ljudje ugotovijo, da izhod Unixovega koledarskega programa ,,cal`` ne ustreza njihovim prièakovanjem. Koledar za september 1752 je zelo èuden: 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 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 ,,cal 9 94``. To izpi¹e koledar za september leta 94, ne pa leta 1994. _________________________________________________________________ 4. Vmesna vpra¹anja 4.1 Kako lahko ugotovim èas, ko je bila datoteka ustvarjena? Date: Thu Mar 18 17:16:55 EST 1993 Ne morete ga - nikjer se ne shrani. Datoteke imajo podatke o èasu zadnje spremembe (poka¾e ga ,,ls -l``), èasu zadnjega dostopa (poka¾e ga ,, ls -lu``) in èasu zadnje spremembe inode (poka¾e ga ,,ls -lc``). Zadnji se pogosto imenuje ,,èas ustvarjenja`` - celo v nekaterih straneh referenènega priroènika (za man) - a to je narobe; spremeni se tudi z operacijami kot so mv, ln, chmod, chown in chgrp. Pojasnila so dostopna v poglavju referenènega priroènika o stat(2). 4.2 Kako lahko uporabim rsh, ne da bi rsh poèakal konec oddaljenega ukaza? Subject: How do I use "rsh" without having the rsh hang around ... ? Date: Thu Mar 18 17:16:55 EST 1993 (Glejte odgovor na vpra¹anje ,,Zakaj dobim ob ukazu rsh gostitelj ukaz {kak¹no èudno sporoèilo o napaki}?``, o katerem ,,rsh`` govorimo.) Oèitni odgovori odpovejo: rsh stroj ukaz & ali rsh stroj 'ukaz &' Na primer, poskusite narediti rsh stroj 'sleep 60 &' in videli boste, da rsh ne bo takoj vrnil ukazne vrstice. Poèakal bo 60 sekund, dokler se ne bo oddaljeni ukaz ,,sleep`` izvedel do konca, èeprav se ukaz na oddaljenem stroju po¾ene v ozadju. Kako torej pripravite rsh do tega, da konèa z delom takoj, ko zaène teèi sleep? Re¹itev - èe uporabljate na oddaljenem stroju csh: rsh machine -n 'command >&/dev/null </dev/null &' Èe na oddaljenem stroju uporabljate sh: rsh machine -n 'command >/dev/null 2>&1 </dev/null &' Zakaj? ,,-n`` pove¾e standardni vhod ukaza rsh na /dev/null, torej lahko po¾enete celotni ukaz rsh v ozadju na lokalnem stroju. Torej ima ,,-n`` ekvivalenten pomen, kot da bi ¹e enkrat doloèili ,,< /dev/null``. ©e veè, preusmeritve vhoda in izhoda na oddaljenem stroju (znotraj enojnih narekovajev) zagotavljajo, da 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 /dev/null; katerakoli datoteka bo v redu. V veliko primerih razlièni deli tega zapletenega ukaza niso potrebni. 4.3 Kako lahko skraj¹am datoteko? Subject: How do I truncate a file? Date: Mon, 27 Mar 1995 18:09:10 -0500 Funkcija BSD-ja ftruncate() 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 ftruncate v sistemih, ki jo podpirajo: * BSD 4.2 + Ultrix, SGI, LynxOS + kraj¹anje ne poveèa datoteke + kraj¹anje ne premika datoteènega kazalca * BSD 4.3 + SunOS, Solaris, OSF/1, HP/UX, Amiga + kraj¹anje lahko poveèa datoteko + kraj¹anje ne premika datoteènega kazalca * Cray + UniCOS 7, UniCOS 8 + kraj¹anje ne poveèa datoteke + kraj¹anje spremeni datoteèni kazalec Ostali sistemi pridejo v ¹tirih mo¾nostih: * F_CHSIZE + le SCO + nekateri sistemi definirajo izraz F_CHSIZE, a ga ne podpirajo + obna¹a se kot BSD 4.3 * F_FREESP + le Interative Unix + nekateri sistemi (npr. Interative Unix) definirajo izraz F_FREESP, a ga ne podpirajo + obna¹a se kot BSD 4.3 * chsize() + QNX in SCO + nekateri sistemi (npr. Interative Unix) imajo funkcijo chsize(), a je ne podpirajo + obna¹a se kot BSD 4.3 * niè + ni znanih sistemov + tukaj bodo sistemi, ki sploh ne podpirajo truncate Moderatorjevo sporoèilo: Spodnje funkcije sem posnel nekaj let nazaj. Ne morem veè ugotoviti prvotnega pisca. S. Spencer Sun <spencer@ncd.com> je tudi prispeval verzijo za F_FREESP. Sledijo funkcije za neavtohtono funkcijo ftruncate. _________________________________________________________________ /* 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, &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, &fl) < 0) return -1; } return 0; } #else int ftruncate (fd, length) int fd; off_t length; { return chsize (fd, length); } #endif #endif _________________________________________________________________ 4.4 Zakaj simbol ,,{}`` ukaza find ne naredi to, kar ¾elim? Subject: Why doesn't find's "{}" symbol do what I want? Date: Thu Mar 18 17:16:55 EST 1993 Ukaz find ima izbiro -exec, ki izvede podani ukaz na vseh izbranih datotekah. Ukaz find zamenja vse nize ,,{}``, ki jih vidi v ukazni vrstici, z imenom datoteke, ki jo trenutno obdeluje. Tako lahko lepega dne poskusiti uporabiti find, da bi pognali ukaz na vsaki datoteki, imenik po imenik. Poskusite lahko tole: find /pot -type d -exec ukaz {}/\* \; upajoè, da bo find izvajal ukaze takole: ukaz imenik1/* ukaz imenik2/* ... ®al find razvije simbol ,,{}`` le, ko nastopa sam. Vse drugo, kot na primer ,,{}/*`` bo find pustil pri miru, torej bo namesto ¾elenega dejanja izvedel ukaz {}/* ukaz {}/* ... 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 ,,./naredi``, ki vsebuje le ukaz "$1"/* Potem lahko uporabljate find /pot -type d -exec ./naredi {} \; Ali, èe se ¾elite izogniti skriptu ,,./naredi``, lahko uporabite find /pot -type d -exec sh -c 'ukaz $0/*' {} \; (To deluje, ker se znotraj ,ukaza` ,,sh -c 'ukaz' A B C ...``, $0 razvije v A, $1 v B, in tako naprej.) Ali pa uporabite trik sestavljanja ukaza s pripomoèkom sed: find /pot -type d -print | sed 's:.*:ukaz &/*:' | sh Èe na vsak naèin ¾elite zmanj¹ati ¹tevilo klicev ukaza ,,ukaz``, lahko pogledate, èe ima va¹ sistem ukaz xargs. Ukaz xargs prebere argumente po vrsticah s standardnega vhoda in jih zbere, kolikor le lahko, v eno samo ukazno vrstico. Uporabite lahko torej find /pot -print | xargs ukaz kar bo pognalo enkrat ali veèkrat ukaz datoteka1 datoteka2 datoteka3 imenik1/datoteka1 imenik1/datoteka2 ®al to ni popolnoma robustna ali varna re¹itev. 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. 4.5 Kako lahko za¹èitim simboliène povezave? Subject: How do I set the permissions on a symbolic link? Date: Thu Mar 18 17:16:55 EST 1993 Za¹èite (angl. permissions, dovolilnice tipa -rw-r--r-) pri simboliènih povezavah pravzaprav ne pomenijo nièesar. Edina dovoljenja, ki ¹tejejo, so za¹èite datotek, na katere ka¾ejo povezave. 4.6 Kako lahko ,,obnovim`` pobrisano datoteko? Subject: How do I "undelete" a file? Date: Thu Mar 18 17:16:55 EST 1993 Nekoè boste po pomoti napisali nekaj kot ,,rm * .foo`` in ugotovili, da ste pravkar pobrisali ,,*`` namesto ,,*.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 ,,rm``, te ni veè. Ko na datoteki uporabite ukaz ,,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, èe takoj po ukazu 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 rm, bo prvi nasvet, da naredite vzdevek v ukazni lupini ali pa proceduro, ki bo spremenila ukaz ,,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 slaba ideja. Na novo lastnost ukaza se boste vselej zana¹ali in ko se boste zna¹li na obièajnem sistemu, kjer ukaz ,,rm`` zares izvede ,,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 ,,rm``. Za zaèetnike zado¹èa, da si v va¹em priroèniku ogledate izbiro ,,-i`` ukaza ,,rm``. Èe ste ¹e vedno pogumni, potem je tukaj mo¾en preprost odgovor. Naredite si ukaz ,,can``, ki bo premikal datoteke v imenik-smetnjak trashcan. V csh(1) lahko postavite naslednje ukaze v datoteko ,,.login`` v va¹em domaèem imeniku: 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 Morda boste tudi ¾eleli postaviti: rm -f ~/.trashcan/* v datoteko ,,.logout`` v va¹em domaèem imeniku, da boste samodejno izpraznili ko¹ vselej, ko se odjavite. (Razlièici za ukazni lupini sh in 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 rm, vendar dopu¹èa obnovitev datotek. Ta paket je bil objavljen v comp.sources.misc (volume 17, issue 023-026) 4.7 Kako lahko proces ugotovi, ali teèe v ozadju? Subject: How can a process detect if it's running in the background? Date: Thu Mar 18 17:16:55 EST 1993 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: sh: if [ -t 0 ]; then ... fi C: if(isatty(0)) { ... } 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 SIGINT in SIGQUIT ter preusmerijo standardni vhod na ,,/dev/null``; 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 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. 4.8 Zakaj preusmerjanje v zanki ne dela, kot bi moralo? (Bournova lupina) Subject: Why doesn't redirecting a loop work as intended? (Bourne shell) Date: Thu Mar 18 17:16:55 EST 1993 Oglejte si naslednji primer: foo=bar while read line do # naredi nekaj z $line foo=bletch done < /etc/passwd echo "foo je zdaj: $foo" Kljub prireditvi ,,foo=bletch`` bo to izpisalo ,,foo je zdaj: bar`` v mnogih izvedbah Bournove ukazne lupine. Zakaj? Zaradi naslednje, pogosto nedokumentirane lastnosti zgodovinskih Bournovih ukaznih lupin: preusmerjanje kontrolne strukture (kot je zanka ali stavek ,,if``) naredi ukazno podlupino, v kateri se struktura izvede; spremenljivke, nastavljene v podlupini (kot priredba ,,foo=bletch``), 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 ,,foo je zdaj: bletch``. V zgodovinskih (in s P1003.2 usklajenih) izvedbah uporabite naslednji trik, da se izognete te¾avam s preusmerjanjem: 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<&0 < /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<&9 9<&- echo "foo je zdaj: $foo" To bi moralo vselej izpisati ,,foo je zdaj; bletch``. Prav, vzemite naslednji primer: foo=bar echo bletch | read foo echo "foo je zdaj: $foo" To bo izpisalo ,,foo je zdaj: bar`` v veliko izvedbah in ,,foo je zdaj: bletch`` 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 ,,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. 4.9 Kako po¾enem passwd, ftp, telnet, tip in druge interaktivne programe v skriptu ukazne lupine v ozadju? Subject: How do I run ... interactive programs from a shell script ... ? Date: Thu Mar 18 17:16:55 EST 1993 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 ,,expect`` poskrbi za programabilen terminalski vmesnik za avtomatsko interakcijo s takimi programi. Naslednji skript za expect je primer neinteraktivne razlièice ukaza passwd(1). # 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 Program expect lahko delno avtomatizira interakcijo, kar je posebej uporabno za telnet, rlogin, razhro¹èevalnike in druge programe, ki nimajo vgrajenega ukaznega jezika. Distribucija priskrbi tudi poskusni skript za nenehen zagon igre 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 expect dobite tako, da po¹ljete ,,send pub/expect/expect.shar.Z`` na naslov library@cme.nist.gov ali uporabite anonimni FTP za prenos imenovane datoteke s stre¾nika ftp.cme.nist.gov. ©e ena mo¾nost re¹itve je z uporabo programa pty 4.0, ki deluje kot program pod sejo psevdo-tty, in ga dobite na comp.sources.unix, volume 25. Postopek, ki to naredi prek pty z uporabo poimenovanih cevi, je videti takole: #!/bin/sh /etc/mknod out.$$ p; exec 2>&1 ( exec 4<out.$$; rm -f out.$$ <&4 waitfor 'password:' echo "$2" <&4 waitfor 'password:' echo "$2" <&4 cat >/dev/null ) | ( pty passwd "$1" >out.$$ ) Tukaj je ,,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 pty (ki ima to napako, da se ne sinhronizira pravilno s programom passwd) je #!/bin/sh ( sleep 5; echo "$2"; sleep 5; echo "$2") | pty passwd "$1" 4.10 Kako lahko v skriptu ali programu ugotovim ID procesa, ki pripada programu z doloèenim imenom? Subject: How do I find the process ID of a program with a particular name ... ? Date: Thu Mar 18 17:16:55 EST 1993 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: ps ux | awk '/ime/ && !/awk/ {print $2}' Pri tem zamenjajte ,,ime`` z imenom procesa, ki ga i¹èete. Splo¹ni postopek prestre¾e izhod ukaza ps in z orodji awk ali grep in podobnimi poi¹èe vrstice z doloèenim nizom znakov ter izpi¹e polje PID v teh vrsticah. Opazili boste, da zgornji ukaz ,,!/awk/`` iz izpisa izloèi soèasni proces awk. Morda boste morali v odvisnosti od vrste Unixa, ki ga uporabljate, spremeniti argumente za 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 ,,kvm_`` in Data General funkcije ,,dg_``. Mo¾no je, da jih sme uporabljati vsak uporabnik, a morebiti so dostopne le super-uporabniku (ali uporabniku v skupini ,,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 ,,/proc``, 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 /proc 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 ,,ofiles``, dostopno v arhivih novièarske skupine comp.sources.unix. (Paket, imenovan ,,kstuff``, ki pomaga pri brskanju po jedru, je bil poslan na alt.sources v maju 1991 in je tudi dostopen po anonimnem FTP-ju kot {329{6,7,8,9},330{0,1}} v imeniku usenet/alt.sources/articles/ na wuarchive.wustl.edu. 4.11 Kako preverim izhodni status oddaljenega ukaza, pognanega z rsh? Subject: How do I check the exit status of a remote command executed via "rsh"? Date: Thu Mar 18 17:16:55 EST 1993 Tole ne deluje: rsh nek-stroj nek-zoprn-ukaz || echo "Ukazu je spodletelo" Izhodno stanje ,,rsh`` je 0 (uspeh), èe se sam program rsh konèa uspe¹no, kar verjetno ni to, kar ¾elite. Èe ¾elite preveriti izhodni status oddaljenega programa, lahko uporabite skript ,,ersh`` Maartena Litmaatha, ki je bil poslan na alt.sources v oktobru 1994. Skript ersh je lupinski skript, ki poklièe rsh, uredi, da oddaljen stroj na koncu izpi¹e status zadnjega izvedenega ukaza, in konèa v tem izhodnem stanju. 4.12 Je mogoèe programu awk podati tudi spremenljivke ukazne lupine? Subject: Is it possible to pass shell variable settings into an awk program? Date: Thu Mar 18 17:16:55 EST 1993 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: who | awk '/^'"$USER"'/ { print $2 }' Enojni narekovaji se uporabljajo za oznaèevanje programa v awk-u, saj se v njem pogosto uporablja znak ,$`, ki je lahko interpretiran v ukazni lupini, èe zaprete program v dvojne narekovaje, ne pa tudi, èe ga zaprete v enojne. V tem primeru hoèemo, da ukazna lupina interpretura ,$` v ,,$USER``, zato zapremo enojne narekovaje in potem vstavimo ,,$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 who | awk '/^'$USER'/ { print $2 }' a jih moramo vseeno vkljuèiti, saj bi lahko lupinska spremenljivka $USER vsebovala posebne znake, kot so presledku. Drugi naèin za podajanje spremenljivih nastavitev programu awk je uporaba pogosto nedokumentirane lastnosti awk-a, ki dovoljuje, da se spremenljivke podajajo v ukazni vrstici kot ,,la¾na imena datotek``. Na primer: who | awk '$1 == uporabnik { print $2 }' uporabnik="$USER" - Spremenljivke se uporabijo, ko se zasledijo v ukazni vrstici, torej, na primer, lahko s to tehniko naroèite programu awk, kako naj se obna¹a za razliène datoteke. Na primer: awk '{ program, ki je odvisen od s }' s=1 datoteka1 s=0 datoteka2 Opazite, da nekatere verzije programa awk povzroèijo, da se pred izvedbo bloka BEGIN zasledijo spremenljivke pred vsemi pravimi imeni datotek, toda nekatere ne, zato se na to ne gre zana¹ati. Opazite tudi, da awk ob navedbi spremenljivk namesto pravih datotek sam od sebe ne bo bral s stdin, zato morate dodati argument ,,-`` na konec va¹ega ukaza, kot je to v predprej¹njem primeru. Tretja mo¾nost je uporaba novej¹e verzije programa awk (nawk), ki dopu¹èa neposreden dostop do spremenljivk okolja. Na primer: nawk 'END { print "Va¹a pot je " ENVIRON["PATH"] }' /dev/null 4.13 Kako se znebim procesov-zombijev, ki vztrajajo? 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 ®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 wait() za podproces na 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 ,,signal(SIGCHLD, SIG_IGN)`` (no, pravzaprav je lahko SIGCLD namesto SIGCHLD, toda veèina novej¹ih sistemov SysV ima ,,#define SIGCHLD SIGCLD`` 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 SIGCHLD na 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 wait. V POSIX-u so upravljalniki signalov name¹èeni s funkcijo sigaction. Ker vas ne zanimajo ,,zaustavljeni`` podprocesi, paè pa prekinjeni, dodajte zastavicam sa_flags vrednost SA_NOCLDSTOP. Èakanje brez blokiranja se izvede z waitpid(). Prvi argument funkciji waitpid naj bo -1 (èakaj na katerikoli PID), tretji naj bo 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 signal(SIGCHLD, SIG_IGN), èe to deluje. Èe samodejnega èi¹èenja ne morete doseèi s 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 SIGCHLD poklièe, èe se konèa eden ali veè podprocesov. Èe va¹ upravljalnik signalov le enkrat poklièe wait(), 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 wait3() ali waitpid(), ki z izbiro WNOHANG preverita, ali morata poèistiti ¹e kaj podprocesov. Va¹ upravljalnik signalov na sistemih, ki poznajo funkciji wait3()/waitpid(), toliko èasa klièe eno od teh funkcij z izbiro WNOHANG, dokler ni veè nobenih otrok za poèi¹èenje. Bolj¹a izbira je waitpid(), ker je vkljuèena v POSIX. Na sistemih, izpeljanih iz SysV, se signali SIGCHLD regenerirajo, èe po izhodu upravljalnika signala 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 SIG_DFL. Na takih sistemih morate kot zadnjo stvar upravljalnika signalov postaviti ,,signal(SIGCHILD, catcher_func)`` (kjer je ,,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 SIG_DFL, ko se po¾ene upravljalni¹ka funkcija. Temu problemu se na sistemih, ki nimajo wait3()/waitpid(), a imajo SIGCLD, izognete tako, da morate resetirati upravljalnik signalov s klicem signal(), ko ste izvedli v upravljalniku vsaj en wait(), vsakiè, ko se klièe. Zaradi zgodovinskih zdru¾ljivostnih razlogov bo System V obdr¾al staro pomenoslovje (resetiral upravljalnik ob klicu) funkcije signal(). Upravljalniki signalov, ki se prilepijo, se lahko namestijo s sigaction() ali sigset(). Povzetek vsega tega je, da morate funkcijo waitpid() (POSIX) ali 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 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 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 init, ki bo opravil vse potrebno èakanje. Ta metoda je neuèinkovita, ker potrebuje dodatno razvejanje, a je popolnoma prenosljiva. 4.14 Kako dobim vrstice iz cevovoda tako, kot se pi¹ejo, namesto le v veèjih blokih? 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 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 setbuf() ali 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 ,,pty``, omenjen v vpra¹anju ,,Kako po¾enem passwd, ftp, telnet, tip in druge interaktivne programe v skriptu ukazne lupine v ozadju?``. 4.15 Kako lahko vstavim datum v ime datoteke? 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 To ni te¾ko, a je na prvi pogled malce kriptièno. Zaènimo najprej s samim ukazom date: 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 date. Poskusite tole: date '+%d%m%y' Morali bi dobiti nekaj kot 130994. Èe ¾elite imeti vmes loèila, preprosto postavite znake, ki bi jih radi uporabljali, v niz za formatiranje (brez nagibnic ,/`): date '+%d.%m.%y' Obstaja veliko simbolov, ki jih lahko uporabite v nizu za formatiranje: o njih izveste v strani referenènega priroènika (man date). Zdaj pa ¹e to spravimo v ime datoteke. Denimo, da bi radi ustvarili datoteke imenovane report.130994 (ali katerikoli datum ¾e je danes): FILENAME=report.`date '+%d%m%y'` 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). 4.16 Zakaj se nekateri skripti zaènejo z ,,#!...``? Subject: Why do some scripts start with #! ... ? From: chip@@chinacat.unicom.com (Chip Rosenthal) Date: Tue, 14 Jul 1992 21:31:54 GMT Chip Rosenthal je v preteklosti v novièarski skupini 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 ,#`. 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 exec()), najprej pogleda prvih 16 bitov datoteke. Teh 16 bitov se imenuje magièna ¹tevilka. 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 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 ali naj izvede datoteko, paè pa tudi 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 ,,moj.skript`` in ne dobim napake ENOEXEC. Odgovor: skripti se ne izvajajo v jedru, paè pa v ukazni lupini. Koda v ukazni lupini lahko izgleda podobno: _________________________________________________________________ /* 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; _________________________________________________________________ (Ta primer je moèno poenostavljen. Vpletenih je veliko veè zadev, a to ponazarja bistvo, ki ga posku¹am opisati.) Èe je klic execl() uspe¹en in se program za¾ene, se koda za execl() nikoli ne po¾ene. V zgornjem primeru uspe¹en execl() programa ,program` pomeni, da se spodnje vrstice primera ne izvedejo. Namesto tega sistem izvaja binarno datoteko ,program`. Èe, po drugi strani, prvi klic execl() spodleti, ta hipotetièna ukazna lupina pogleda, zakaj ji je spodletelo. Èe klic execl() ni uspel, ker ,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 ,#!` (magiène ¹tevilke so velike 16 bitov in dva 8-bitna znaka tvorita 16 bitov, prav?). Ko je jedro prepoznalo magièno ¹tevilko ,#!`, 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: #! /bin/sh #! /bin/csh #! /bin/awk -F: 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 ,,/bin/sh je zaniè kot interaktivni uporabni¹ki vmesnik! Hoèem csh!``. Nekateri proizvajalci so dodali csh v njihove distribucije, èeprav csh ni bil del distribucije USG UNIX. To pa je predstavljalo problem. Denimo, da spremenite svojo prijavno ukazno lupino na /bin/csh. Denimo, nadalje, da ste bebec in vztrajate na programiranju skriptov csh. Vsekakor bi radi bili sposobni napisati ,moj.skript` in ga s tem pognati, èeprav je to skript za csh. Namesto, da bi ga pognali skozi /bin/sh, ¾elite, da se skript po¾ene takole: execl ("/bin/csh", "csh", "-c", "moj.skript", (char *)0); Kaj pa vsi tisti obstojeèi skripti -- nekateri od njih so deli sistemske distribucije? Èe se po¾enejo skozi csh, se bodo stvari kvarile. Potrebujete torej naèin, da po¾enete nekatere skripte skozi csh, in nekatere druge skozi sh. Vpeljana re¹itev je bila, da se popravi csh tako, da pogleda prvi znak skripta, ki ga ¾elite pognati. Èe je ta ,#`, bo csh zagnal skript skozi /bin/csh, sicer bo pognal skript skozi /bin/sh. Primer zgornje kode bi zdaj izgledal takole: _________________________________________________________________ /* 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; _________________________________________________________________ Dve pomembni stvari, Prviè, to je popravek lupine ,csh`. V jedru se ni niè spremenilo in drugim ukaznim lupinam ni bilo niè dodano. Èe posku¹ate pognati skript s klicem execl(), boste ¹e vedno dobili napako ENOEXEC, pa naj se skript zaène z znakom ,#` ali pa ne. Èe posku¹ate pognati skript, ki se zaène z znakom ,#` v èem drugem kot csh (na primer v /bin/sh), ga bo obravnavala lupina sh, ne csh. Drugiè, èarovnija je v tem, da se bodisi skript zaène z ,#`, ali pa se ne zaène z ,#`. Stvari kot so ,:` in ,: /bin/sh` na zaèetku skriptov dela èarobne preprosto dejstvo, da niso ,#`. Torej je vse to identièno, èe je na zaèetku skripta: : : /bin/sh <--- prazna vrstica : /usr/games/rogue echo "Hm ... spra¹ujem se, pod katero ukazno lupino teèem???" V vseh teh primerih bodo vse ukazne lupine posku¹ale izvesti skript z /bin/sh. Podobno, tudi vse naslednje je identièno, èe je na zaèetku skripta: # # /bin/csh #! /bin/csh #! /bin/sh # Hm ... spra¹ujem se, pod katero ukazno lupino teèem??? Vse te vrstice se zaènejo z znakom ,#`. To pomeni, da se bo skript pognal le, èe ga boste posku¹ali pognati iz csh, sicer se bo pognal z /bin/sh. (Opomba: èe poganjate ksh, zamenjajte v zgornjem besedilu ,,sh`` s ,,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 zsh, bash, itd.) Oèitno postane popravek za ,#` nepotreben, èe imate v jedru podporo za ,#!`. Pravzaprav je lahko nevaren, saj ustvarja zmedo pri ugotovitvi, kaj naj bi se zgodilo v primeru ,,#! /bin/sh``. Uporaba ,#!` 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 ,#!`. Ukazna lupina /bin/csh na Xenixu nima popravka za ,#`. Podpora za ,#!` v Xenixu bi bila fina, a sam ne bi zadr¾eval diha med èakanjem nanjo. _________________________________________________________________ 5. Napredna vpra¹anja; radi jih vpra¹ujejo ljudje, ki mislijo, da ¾e poznajo vse odgovore 5.1 Kako berem znake s terminala, ne da bi bilo uporabniku treba pritisniti RETURN? Subject: How do I read characters ... without requiring the user to hit RETURN? Date: Thu Mar 18 17:16:55 EST 1993 Preverite naèin cbreak v BSD ali naèin ~ICANON v SysV. Èe se sami ne ¾elite spoprijeti s terminalskimi parametri (z uporabo sistemskega klica ioctl(2)), lahko prepustite delo programu stty - a to je poèasno in neuèinkovito, in vèasih boste morali spremeniti kodo, da bo delala pravilno: _________________________________________________________________ #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); } _________________________________________________________________ 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 ,,curses``. Èe vas zanima V/I enega samega znaka, vas pogosto zanima tudi neka vrsta kontrole prikaza na zaslonu, in knji¾nica curses priskrbi razliène prenosljive rutine za obe funkciji. 5.2 Kako preverim, èe je treba prebrati znak, ne da bi ga zares prebral? Subject: How do I check to see if there are characters to be read ... ? Date: Thu Mar 18 17:16:55 EST 1993 V nekaterih razlièicah Unixa je mogoèe preveriti, ali je v danem datoteènem deskriptorju kaj neprebranih znakov. V BSD-ju lahko uporabite select(2). Uporabite lahko tudi FIONREAD ioctl, 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 poll(2), a to deluje le na tokovih. V Xenixu - in torej na Unixu SysV r3.2 in poznej¹ih - sistemski klic rdchk() poroèa o tem ali se bo klic read() na danem datoteènem deskriptorju blokiral. Ni naèina, da bi preverili, ali so znaki dostopni za branje s kazalca 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 if (znaki dostopni iz fd) read(fd, buf, sizeof buf); in dobili uèinek neblokovnega branja z 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 read. Namesto tega pri¾gite zastavico O_NDELAY (ki se pod BSD imenuje tudi FNDELAY) z izbiro F_SETFL funkcije fcntl(2). Starej¹i sistemi (Version 7, 4.1 BSD) nimajo O_NDELAY; na teh sistemih lahko najbli¾je neblokovnemu branju pridete z uporabo alarm(2), da branju poteèe èas. 5.3 Kako ugotovim ime odprte datoteke? Subject: How do I find the name of an open file? Date: Thu Mar 18 17:16:55 EST 1993 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 find z izbiro -inum in morda ¹e -xdev, ali uporabite 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. 5.4 Kako lahko tekoèi program ugotovi svojo lastno pot? Subject: How can an executing program determine its own pathname? Date: Thu Mar 18 17:16:55 EST 1993 Va¹ program lahko pogleda argv[0]; èe se zaèenja z ,,/``, je to verjetno ime absolutne poti do va¹ega programa, sicer lahko va¹ program pogleda v vsak imenik, imenovan v okoljski spremenljivki PATH in posku¹a najti prvi imenik, ki vsebuje izvedljivo datoteko, katere ime se ujema s programovim argv[0] (ki je po dogovoru ime programa, ki se izvaja). Èe zdru¾ite ta imenik in vrednost argv[0], imate verjetno pravo ime. Ne morete pa biti preprièani, saj je povsem legalno, da en program izvede drugega z exec() s katerokoli vrednostjo argv[0], ki si jo za¾eli. Da exec izvaja nove programe z imenom izvedljive datoteke v argv[0], je le dogovor. Na primer, povsem hipotetièni primer: #include <stdio.h> main() { execl("/usr/games/rogue", "vi Disertacija", (char *)NULL); } Izvedeni program misli, da je njegovo ime (njegova vrednost argv[0]) ,,vi Disertacija``. (Tudi nekateri drugi programi lahko mislijo, da je ime programa, ki ga trenutno poganjate ,,vi Disertacija``, a seveda je to le hipotetièni primer, zato tega ne posku¹ajte sami :-) 5.5 Kako uporabim popen() za odprtje procesa za branje in pisanje? Subject: How do I use popen() to open a process for reading AND writing? Date: Thu Mar 18 17:16:55 EST 1993 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 obe strani upo¹tevata strog protokol brez mrtvih zank, toda, ker to zahteva sodelovanje med procesi, je neprimerno za knji¾nièno funkcijo, podobno popen(). Distribucija ,,expect`` vkljuèuje knji¾nico funkcij, ki jih lahko C-jevski programer klièe neposredno. Ena izmed funkcij dela isto stvar kot popen za hkratno branje in pisanje. Uporablja ptys namesto cevi, in nima problemov z zaciklanjem. Prenosljiva je na BSD in SV. Glejte vpra¹anje ,,Kako po¾enem passwd, ftp, telnet, tip in druge interaktivne programe v skriptu ukazne lupine v ozadju?`` za veè podatkov o distribuciji expect. 5.6 Kako izvedem v C-ju sleep() za manj kot sekundo? Subject: How do I sleep() in a C program for less than one second? Date: Thu Mar 18 17:16:55 EST 1993 Najprej se zavedajte, da je vse, kar lahko doloèite 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 ,,usleep(n)``, ki zadr¾i izvajanje za n mikrosekund. Èe va¹e okolje ne podpira 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 select() na 4BSD-ju. Doug jo je prvotno imenoval ,,nap()``; vi jo boste verjetno ¾eleli klicati ,,usleep()``: _________________________________________________________________ /* 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, &delay ); } _________________________________________________________________ Na Unixih System V bi lahko to storili takole: _________________________________________________________________ /* 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(&foo,(unsigned long)0,msec); } _________________________________________________________________ ©e ena mo¾nost za dremanje na System V in verjetno tudi drugih ne-BSD Unixih je paket s5nap Jona Zeeffa, objavljen v comp.sources.misc, volume 4. Ne potrebuje namestitve gonilnika naprave, a deluje brez napak, ko se namesti, (Njegova loèljivost je omejena z vrednostjo HZ v jedru, saj uporablja rutino delay() jedra.) Mnogo novej¹ih Unixov ima funkcijo nanosleep. 5.7 Kako pripravim skripte ,setuid` ukazne lupine do delovanja? Subject: How can I get setuid shell scripts to work? Date: Thu Mar 18 17:16:55 EST 1993 [ Ta odgovor je dolg, a to je zapleteno in pogosto zastavljeno vpra¹anje. Hvala Maartenu Litmaathu za ta odgovor in za spodaj omenjeni program ,,indir``. ] 1. 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: #!/bin/sh 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 ,,Zakaj se nekateri skripti zaènejo z ,,#!...``?``. V na¹em primeru je ta ¹tevilka enaka ,,#!`` in OS vzame ostanek prve vrstice kot interpreter za skript, ki mu morda sledi 1 uvodna izbira kot je: #!/bin/sed -f Denimo, da se ta skript imenuje ,foo` in se nahaja v imeniku /bin. Èe potem napi¹ete: foo arg1 arg2 arg3 bo OS preuredil zadeve tako, kot bi napisali: /bin/sed -f /bin/foo arg1 arg2 arg3 Vendar je tukaj neka razlika: èe je pri¾gan bit setuid za ,foo`, bo spo¹tovan v prvi obliki ukaza; èe zares vpi¹ete drugo obliko, bo OS spo¹toval bite z dovoljenji programa /bin/sed, ki seveda ni setuid. 2. Prav, toda kaj, èe se moj skript ukazne lupine ne zaène s tak¹no vrstico ,#!`, ali, èe moj OS o tem niè ne ve? 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 predpostavila, da gre za skript ukazne lupine in mu dala ¹e eno prilo¾nost: /bin/sh lupinski_skript argumenti A zdaj smo ¾e videli, da se v tem primeru bit setuid datoteke ,lupinski_skript` ne bo spo¹toval! 3. Prav, kaj pa varnostna tveganja pri lupinskih skriptih setuid? Dobro, denimo, da se skript imenuje ,/etc/skript_setuid` in se zaèenja z vrstico: #!/bin/sh Zdaj pa poglejmo kaj se zgodi, èe izvedemo naslednje ukaze: $ cd /tmp $ ln /etc/skript_setuid -i $ PATH=. $ -i Vemo, da bo zadnji ukaz preurejen v: /bin/sh -i Toda ta ukaz nam bo dal interaktivno ukazno lupino, ki bo z bitom setuid tekla, kot da bi jo pognal lastnik skripta! Na sreèo lahko to varnostno luknjo zlahka zapremo, èe napi¹emo v prvo vrstico: #!/bin/sh - Znak ,-` oznaèuje konec seznama izbir: naslednji argument ,-i` bo vzet kot ime datoteke, iz katere naj se berejo ukazi, kot bi tudi moral biti! 4. Vendar pa obstajajo veliko resnej¹i problemi: $ cd /tmp $ ln /etc/skript_setuid temp $ nice -20 temp & $ mv moj_skript temp Tretji ukaz bo preurejen v: nice -20 /bin/sh - temp Ker se ta ukaz izvaja poèasi, bo morda lahko èetrti ukaz zamenjal originalno datoteko ,temp` s trojanskim konjem ,moj_skript` preden ukazna lupina sploh odpre ,temp`! Obstajajo 4 naèini za krpanje te varnostne luknje: 1. naj OS za¾ene skript setuid na drugaèen, varen naèin - System V R4 in 4.4BSD uporabljata gonilnik /dev/fd, s katerim podata interpreterju datoteèni deskriptor skripta; 2. naj bo skript interpretiran posredno, skozi vmesnik, ki se preprièa, da je vse v redu, preden po¾ene pravi interpreter - èe uporabljate program ,indir` iz arhiva comp.sources.unix bodo skripti setuid izgledali takole: #!/bin/indir -u #?/bin/sh /etc/skript_setuid 3. napravite ,,binarni ovoj``: pravo izvedljivo datoteko, ki je setuid in katere edina naloga je pognati interpreter z imenom skripta kot argumentom; 4. 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. 5. Zdaj, ko smo se preprièali, da se interpretira pravilna datoteka, ali so prisotna ¹e kak¹na tveganja? Seveda! Za skripte ukazne lupine ne smete pozabiti eksplicitno nastavitev spremenljivke PATH na varno pot. Lahko ugotovite zakaj? Tukaj je ¹e spremenljivka IFS, ki lahko povzroèa te¾ave, èe ni pravilno nastavljena. Tudi druge okoljske spremenljivke lahko ogrozijo varnost sistema, npr. 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 ... Et cetera. Zavedati se morate, da skript setuid ,,podeduje`` vse hro¹èe in varnostna tveganja ukazov, ki jih klièe! Po vsem tem dobimo vtis, da so lupinski skripti setuid precej tvegan posel! Morda bo za vas bolje programirati v C-ju! 5.8 Kako lahko ugotovim, kateri uporabnik ali proces ima odprto datoteko ali uporablja doloèen datoteèni sistem (da ga lahko odklopim)? Subject: How can I find out which user or process has a file open ... ? Date: Thu Mar 18 17:16:55 EST 1993 Uporabite fuser (system V), fstat (BSD), ofiles (v javni lasti) ali pff (v javni lasti). Ti programi vam bodo povedali razliène stvari o procesih, ki uporabljajo doloèene datoteke. V arhivih comp.sources.unix, volume 18, najdete prenos fstat z 4.3 BSD na Dynix, SunOS in Ultrix. pff je del paketa kstuff in deluje na kar nekaj sistemih. Navodila za nabavo kstuff najdete v vpra¹anju ,,Kako lahko v skriptu ali programu ugotovim ID procesa programa z doloèenim imenom?``. Obve¹èen sem bil, da obstaja tudi program, imenovan lsof, a ne vem, kje se ga dobi. Michael Fink <Michael.Fink@uibk.ac.at> dodaja: Èe ne morete odmestiti datoteènega sistema (z 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 df(1)). 5.9 Kako izsledim ljudi, ki me tipajo (s finger)? 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 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 .plan za ,,imenovano cev`` (angl. named pipe) namesto obièajno datoteko. (Za to uporabite ,mknod`.) Potem lahko po¾enete program, ki bo odprl va¹o datoteko .plan za pisanje; odpiranje bo blokirano dokler nek drugi proces (namreè fingerd) ne odpre .plan za branje. Zdaj lahko skozi to pipo po¹ljete, kar paè ¾elite, kar vam omogoèa, da prika¾ete razlièno informacijo .plan vsakiè, ko vas nekdo potipa. Eden od programov za to je paket ,,planner``, objavljen v volume 41 arhivov comp.sources.misc. Seveda to sploh ne bo delovalo, èe va¹ sistem ne podpira imenovanih cevi ali, èe va¹ lokalni fingerd vztraja, da imate navadne datoteke .plan. Va¹ program lahko tudi izkoristi prilo¾nost in pogleda v izhod programa ,,netstat``, ter s tem ugotovi, odkod prihaja zahteva za 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 ftpd z wuarchive), ki podpirajo ta stre¾nik. Za veè informacij se prikljuèite elektronskemu spisku rfc931-users z obièajno zahtevo ,,subscribe`` na 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 fingerd preveri, ali datoteka .plan vsebuje podatke (in je bralna), preden jo posku¹a brati. V tem primeru bodo oddaljeni klici finger popolnoma zgre¹ili va¹o datoteko .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 FIFOCNT. Èe ¹tevilo cevi na sistemu prekoraèi vrednost 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). 5.10 Je mogoèe ponovno prikljuèiti proces na terminal, ko je bil ta odklopljen, tj. po zagonu programa v ozadju in odjavi? Subject: Is it possible to reconnect a process to a terminal ... ? Date: Thu Mar 18 17:16:55 EST 1993 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. * Prvi tak paket je ,,screen``, ki je opisan v arhivih comp.sources.unix kot ,,Screen, multiple windows on a CRT`` (slov. ,,Zaslon, veè oken na CRT`` - glejte paket screen-3.2 v comp.sources.misc, volume 28). Ta paket bo tekel vsaj na sistemih BSD, System V r3.2 in SCO UNIX. * Drugi je ,,pty``, ki je v arhivih comp.sources.unix opisan kot ,,Run a program under a pty session`` (slov. ,,Po¾enite program v seji pty`` - glejte pty v volume 23). Naèrtovan je le za uporabo v sistemih, podobnih BSD. * Tretji je ,,dislocate``, ki je skript, prilo¾en distribuciji expect. Za razliko od prej¹njih dveh bi moral ta teèi na vseh razlièicah Unixa. Podrobnosti o tem, kako dobite expect najdete v vpra¹anju ,,Kako po¾enem passwd, ftp, telnet, tip in druge interaktivne programe v skriptu ukazne lupine v ozadju?``. Nobeden od teh paketov ne deluje retroaktivno, se pravi, da morate pognati proces pod pripomoèkom screen ali pty, èe ga ¾elite odklopiti in priklopiti. 5.11 Je mogoèe ,,vohuniti`` na terminalu, gledajoè izhod, ki se prikazuje na drugem terminalu? Subject: Is it possible to "spy" on a terminal ... ? Date: Wed, 28 Dec 1994 18:35:00 -0500 Za to obstaja veè razliènih poti, èeprav nobena od njih ni popolna: * Pripomoèek kibitz dovoljuje dvema (ali veè) èlovekoma, da sta v stiku prek ukazne lupine (ali poljubnega programa). Uporaba vkljuèuje: + opazovanje ali pomoè pri terminalski seji druge osebe; + bele¾enje pogovora z mo¾nostjo pomika nazaj, shranjevanje pogovora, in celo spreminjanje med tekom; + mo¹tveno igranje iger, urejanje dokumentov ali druga opravila, pri katerih ima vsaka oseba doloèene kvalitete in doloèene pomanjkljivosti, ki se komplementirajo. kibitz pride kot del distribucije expect. Glejte ,,Kako po¾enem passwd, ftp, telnet, tip in druge interaktivne programe v skriptu ukazne lupine v ozadju?``. Za uporabo pripomoèka kibitz potrebujete dovoljenje osebe, ki jo ¾elite vohuniti. Vohunjenje brez privolitve zahteva manj prijetne pristope: * 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. * È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 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->terminal, to ni problem. To ni nekaj, kar bi lahko poèel nekdo, ki ni domaè z napeljavo terminalskih ¾ic in podobno. * Zadnja razlièica paketa screen vkljuèuje veèuporabni¹ki naèin. Nekaj podatkov o paketu screen najdete v vpra¹anju ,,Je mogoèe ponovno prikljuèiti proces na terminal, ko je bil ta odklopljen, tj. po zagonu programa v ozadju in odjavi?``. * Èe ima sistem, ki ga uporabljate, tokove (SunOS, SVR4), vam kot nasvet priporoèamo program, objavljen v volume 28 arhiva skupine comp.sources.misc. In ni ga treba najprej zagnati (vnaprej morate nastaviti va¹ sistem, da samodejno potisne modul advise na tok vsakiè, ko se odpre tty ali pty). _________________________________________________________________ 6. Vpra¹anja, povezana z razliènimi ukaznimi lupinami in njihovimi razlikami 6.1 Se lahko ukazne lupine klasificirajo v kategorije? Subject: Can shells be classified into categories? From: wicks@dcdmjw.fnal.gov (Matthew Wicks) Date: Wed, 7 Oct 92 14:28:18 -0500 V splo¹nem obstajata dva glavna razreda ukaznih lupin. Prvi razred sestavljajo lupine, izpeljane iz Bournove ukazne lupine, in vkljuèuje sh, ksh, bash in zsh. Drugi razred sestavljajo ukazne lupine, izpeljane iz C-jevske in vkljuèuje csh in tcsh. Kot dodatek je tukaj ¹e rc, za katero veèina ljudi meni, da je ,,razred zase``, èeprav nekateri lahko ugovarjajo, da 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. 6.2 Kako ,,vkljuèim`` en skript ukazne lupine iz drugega lupinskega skripta? 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 Vse ukazne lupine Bournove kategorije (vkljuèno z rc) uporabljajo ukaz ,,.``. Vse ukazne lupine C-jevske kategorije uporabljajo ,,source``. 6.3 Ali vse ukazne lupine podpirajo vzdevke (angl. aliases)? Lahko uporabimo tudi kaj drugega? 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 Vse pomembnej¹e ukazne lupine, razen 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 unalias za odstranitev vzdevkov (nastalih z alias) in unset za odstranitev funkcij. 6.4 Kako se prirejajo spremenljivke ukaznih lupin? Subject: How are shell variables assigned? From: wicks@dcdmjw.fnal.gov (Matthew Wicks) Date: Wed, 7 Oct 92 14:28:18 -0500 Ukazne lupine C-jevske kategorije uporabljajo set spremenljivka=vrednost za spremenljivke, lokalne ukazni lupini, in setenv spremenljivka vrednost za okoljske spremenljivke. Spremenljivk se v teh ukaznih lupinah znebite z uporabo ukazov unset in unsetenv. Ukazne lupine Bournove kategorije uporabljajo spremenljivka=vrednost in morda potrebujejo tudi export IME_SPREMENLJIVKE da postavijo spremenljivko v okolje. Spremenljivk se znebite z unset. 6.5 Kako ugotovim, ali poganjam interaktivno ukazno lupino? 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 V ukaznih lupinah C-jevske kategorije, poglejte spremenljivko $prompt. V Bournovi kategoriji ukaznih lupin lahko pogledate spremenljivko $PS1, vendar je bolj pogledati spremenljivko $-. Èe $- vsebuje ,-i`, je ukazna lupina interaktivna. Preverite takole: case $- in *i*) # izvedi stvari za interaktivno ukazno lupino ;; *) # izvedi stvari za neinteraktivno ukazno lupino ;; esac 6.6 Katere datoteke ,,s piko`` uporabljajo razliène ukazne lupine? 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 Èeprav ta seznam morda ni popoln, ponuja veèino informacij. csh Nekatere razlièice imajo sistemski datoteki .cshrc in .login. Vsaka razlièica jih postavlja na razlièna mesta. Ob nastopu (v tem vrstnem redu): + .cshrc - vedno; razen ob uporabi izbire -f. + .login - prijavne ukazne lupine. Ob prekinitvi: + .logout - prijavne ukazne lupine. Ostalo: + .history - shranjuje zgodovino (temelji na $savehist). tcsh Ob nastopu (v tem vrstnem redu): + /etc/csh.cshrc - vedno. + /etc/csh.login - prijavne ukazne lupine. + .tcshrc - vedno. + .cshrc - èe manjka .tcshrc. + .login - prijavne ukazne lupine. Ob prekinitvi: + .logout - prijavne ukazne lupine. Ostalo: + .history - shranjuje zgodovino (temelji na $savehist). + .cshdirs - shranjuje sklad imenikov. sh Ob nastopu (v tem vrstnem redu): + /etc/profile - prijavne ukazne lupine. + .profile - prijavne ukazne lupine. Ob prekinitvi: + katerikoli ukaz (ali skript), doloèen z ukazom: trap "ukaz" 0 ksh Ob nastopu (v tem vrstnem redu): + /etc/profile - prijavne ukazne lupine. + .profile - prijavne ukazne lupine; razen ob uporabi izbire -p. + $ENV - vedno, èe je nastavljena; razen ob uporabi izbire -p. + /etc/suid_profile - ob uporabi izbire -p. Ob prekinitvi: + katerikoli ukaz (ali skript), doloèen z ukazom: trap "ukaz" 0 bash Ob nastopu (v tem vrstnem redu): + /etc/profile - prijavne ukazne lupine. + .bash_profile - prijavne ukazne lupine. + .profile - prijavne ukazne lupine, èe ni datoteke .bash_profile. + .bashrc - interaktivne neprijavne ukazne lupine. + $ENV - vedno, èe je nastavljena. Ob prekinitvi: + .bash_logout - prijavne ukazne lupine. Drugo: + .inputrc - inicializacija branja vrstic. zsh Ob nastopu (v tem vrstnem redu): + .zshenv - vedno, razen ob doloèitvi izbire -f. + .zprofile - prijavne ukazne lupine. + .zshrc - interaktivne ukazne lupine, razen ob doloèitvi izbire -f. + .zlogin - prijavne ukazne lupine. Ob prekinitvi: + .zlogout - prijavne ukazne lupine. rc Ob nastopu: + .rcrc - prijavne ukazne lupine. 6.7 Zanima me veè o razlikah med razliènimi ukaznimi lupinami. 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 Zelo podrobna primerjava ukaznih lupin sh, csh, tcsh, ksh, bash, zsh, in rc je v datoteki dostopna po anonimnem FTP-ju z veè naslovov: * ftp://ftp.uwp.edu/pub/vi/docs/shell-100.BetaA.Z * ftp://utsun.s.u-tokyo.ac.jp/misc/vi-archive/docs/shell-100.BetaA.Z 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. _________________________________________________________________ 7. Pregled razlièic Unixa 7.1 Opozorilo in uvod From: "Pierre (P.) Lewis" <lew@bnr.ca> Date: Tue Aug 15 15:14:00 EDT 1995 X-Version: 2.9 Opozorilo bralcem: 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: 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: 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 fork(), pipe(), in katerega uporabni¹ki vmesnik vkljuèuje orodja kot so cc, troff, grep, awk, in izbiro ukazne ¹koljke. Opazite, da je ,,UNIX`` registrirana blagovna znamka podjetja USL (AT&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&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&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): pat@bnr.ca, guy@auspex.com, pen@lysator.liu.se, mikes@ingres.com, mjd@saul.cis.upenn.edu, root%candle.uucp@ls.com, ee@atbull.bull.co.at, Aaron_Dailey@stortek.com, ralph@dci.pinetree.org, sbdah@mcshh.hanse.de, macmach@andrew.cmu.edu, jwa@alw.nih.gov [4.4BSD], roeber@axpvms.cern.ch, bob@pta.pyramid.com.au, bad@flatlin.ka.sub.org, m5@vail.tivoli.com, dan@fch.wimsey.bc.ca, jlbrand@uswnvg.com, jpazer@usl.com, ym@satelnet.org, merritt@gendev.slc.paramax.com, quinlan@yggdrasil.com, steve@rudolph.ssd.csd.harris.com, bud@heinous.isca.uiowa.edu, pcu@umich.edu, Dan_Menchaca@quickmail.apple.com, D.Lamptey@sheffield.ac.uk, derekn@vw.ece.cmu.edu, gordon@PowerOpen.org, romain@pyramid.com, rzm@dain.oso.chalmers.se, chen@adi.com, tbm@tci002.uibk.ac.at, sllewis@nando.net, edwin@modcomp.demon.co.uk, veliko ljudem, ki sem jih ¹e pozabil na¹teti, in vsem drugim ljudem, katerih sporoèila berem. Najlep¹a hvala! 7.2 Zelo kratek pogled na zgodovino Unixa 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&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: * V1 (1971): Prva razlièica Unixa, v zbirniku na PDP-11/20. Vkljuèevala je datoteèni sistem, fork(), roff, ed. Uporabljana je bila kot urejevalnik besedila za pripravo patentov. Klic pipe() se je pojavil prviè v V2! * 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. * 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. * V7 (1979): Za veliko ljudi je to ,,zadnji pravi Unix``, ali ,,izbolj¹anje glede na vse prej¹nje in prihodnje Unixe`` [Bourne]. Vkljuèeval je popoln K&R C, uucp, Bournovo ukazno lupino. V7 je bil prenesen na VAX kot 32V. Jedro V7 je bilo veliko borih 40 Kbytov! Tukaj so (za referenco) sistemski klici V7: _exit, access, acct, alarm, brk, chdir, chmod, chown, chroot, close, creat, dup, dup2, exec*, exit, fork, fstat, ftime, getegid, geteuid, getgid, getpid, getuid, gtty, indir, ioctl, kill, link, lock, lseek, mknod, mount, mpxcall, nice, open, pause, phys, pipe, pkoff, pkon, profil, ptrace, read, sbrk, setgid, setuid, signal, stat, stime, stty, sync, tell, time, times, umask, umount, unlink, utime, wait, write. Omenjene razlièice Vn je razvila skupina Computer Research Group (CRG) ustanove Bell Labs. Druga skupina, Unix System Group (USG), je odgovorna za podporo. Tretja skupina pri Bell Labs je bila tudi vpletena v razvijanje Unixa, Programmer's WorkBench (PWB), kateri se moramo zahvaliti, na primer, za sccs, poimenske cevi (angl. named pipes) in druge pomembne zamisli. Obe skupini sta se leta 1983 zdru¾ili v Unix System Development Lab. 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&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&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. 7.3 Glavne vrste Unixa From: "Pierre (P.) Lewis" <lew@bnr.ca> Date: Mon Jan 9 16:59:14 EST 1995 X-Version: 2.7 Naslednje je bolj ali manj pogled zgodnjih 90-ih. Do nedavnega sta obstajali dve glavni vrsti Unixa: System V (pet) podjetja AT&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&T. Tipièno na strojni opremi Intela. Najbolj prena¹ani Unix, tipièno z raz¹iritvami BSD (csh, nadzor opravil, termcap, curses, vi, simboliène povezave). Evolucijo Systema V zdaj nadzoruje Unix International (UI). Èlanstvo UI vkljuèuje AT&T, Sun, ... Novièarski skupini: comp.unix.sysv286 in comp.unix.sysv386. Glavne izdaje: * System III (1982): prvi komercialni Unix podjetja AT&T + vrste FIFO (imenovane cevi) (pozneje?) * System V (1983): + paket IPC (shm, msg, sem) * SVR2 (1984): + funkcije ukazne lupine (sh) + SVID (definicija vmesnika System V, angl. System V Interface Definition) * SVR3 (1986) za platforme ?: + tokovi (STREAMS, navdih pri V8), poll(), TLI (omre¾no programje) + RFS + deljene programske knji¾nice + SVID 2 + prenos pomnilni¹kih strani na zahtevo (angl. demand paging), èe strojna oprema to podpira * SVR3.2: + zdru¾itev s Xenixom (Intel 80386) + omre¾enost * SVR4 (1988), glavni tok implementacij Unixa, me¹anica sistemov System V, BSD, in SunOS. + S SVR3: sistemska administracija, terminal I/F, tiskalnik (z BSD-ja?), RFS, STREAMS, uucp + Z BSD-ja: FFS, TCP/IP, vtièi (angl. sockets), select(), csh + S SunOS: NFS, grafièni vmesnik OpenLook, X11/NeWS, podsistem navideznega pomnilnika z datotekami, ki ustrezajo pomnilniku, deljene knji¾nice (!= od SVR3?) + ksh + ANSI C + internacionalizacija (8-bitno èist) + ABI (Application Binary Interface - rutine namesto trapov (? angl. routines instead of traps)) + POSIX, X/Open, SVID3 * SVR4.1 + asinhron V/I (s SunOS?) * SVR4.2 (temelji na SVR4.1ES) + datoteèni sistem Veritas, ACL-ji + dinamièno nalaganje modulov jedra * Prihodnost: + SVR4 MP (veèprocesorski) + uporaba mikrojedra Chorus 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 Computer System Research Group (CSRG). Ukinili so jo leta 1992. Novièarska skupina: comp.unix.bsd. Glavne izdaje: * 2.xBSD (1978) za PDP-11, ¹e vedno pomemben? (2.11BSD je bil izdan 1992!). + csh * 3BSD (1978): + navidezni pomnilnik * 4.?BSD: + termcap, curses + vi * 4.0BSD (1980). * 4.1BSD (?): osnova za poznej¹e razlièice AT&T CRG + nadzor opravil + samodejna nastavitev jedra + vfork() * 4.2BSD (1983): + TCP/IP, vtièi, ethernet + datoteèni sistem UFS: dolga imena datotek, simboliène povezave + novi zanesljivi signali (v SVR3 zdaj zanesljivi signali 4.1) + select() * 4.3BSD (1986) za VAX, ?: + TCP/IP, vtièi, ethernet + datoteèni sistem UFS: dolga imena datotek, simboliène povezave + novi zanesljivi signali (v SVR3 zdaj zanesljivi signali 4.1) + select() * 4.3 Tahoe (1988): 4.3BSD z izvorno kodo, podpora za Tahoe (32-bitni supermini) + Fat FFS + novi algoritmi za TCP * 4.3 Reno (1990) za VAX, Tahoe, HP 9000/300: + veèina standarda POSIX 1003.1 + novi algoritmi za TCP + omre¾ni datoteèni sistem NFS (od Suna) + pomnilni¹ki datoteèni sistem MFS + OSI: TP4, CLNP, ISODE-ov FTAM, VT in X.500; SLIP + Kerberos * Trakova Net1 (?) in Net2 (junij 1991): del BSD, za katerega ni potrebna pravna za¹èita raz¹irjanja USL * 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): + nov navidezni pomnilni¹ki sistem (VMS), ki temelji na Mach 2.5 + 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) + 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. + veèina POSIX.1 (posebej nov terminalski gonilnik a la SV), veliko od POSIX.2, izbolj¹an nadzor opravil; glave ANSI C + Kerberos integriran z veèino sistema (vkljuèno z NFS) + izbolj¹ave TCP/IP (vkljuèno s predvidevanjem glave (angl. header prediction), SLIP) + pomembne spremembe jedra (nov dogovor o sistemskih klicih, ...) + druge izbolj¹ave: vrste FIFO, zaklepanje datoteke v doloèenem obmoèju bytov (angl. byte-range file locking) Ustanova Open Software Foundation (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, ... * OSF/1 (1991): + poèiva na jedru Mach 2.5 + simetrièno multiprocesiranje, paralelizirano jedro, niti + logièni diski, zrcaljenje diska (angl. disk mirroring), UFS (domoroden), S5 FS, NFS + izbolj¹ana varnost (B1 z nekaterimi lastnostmi B2, B3; ali C2), 4.3BSD admin + STREAMS, TLI/XTI, vtièi (angl. sockets) + deljene knji¾nice, dinamièni nalagalnik (vkljuèno z jedrom) + grafièni vmesnik Motif * izdaja 1.3 (junij 1994) + OSF/1 MK (mikro-jedro) temelji na Mach 3.0 + zado¹èa trenutnemu osnutku specifikacije Specification 1170 (mi¹ljeno za standardizacijo v procesu Fast Track konzorcija X/Open) + Data Capture I/F, Common Data Link I/F, + podpora ISO 10646 (Unicode) in 64-bitna podpora 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: * System V: ,,Design of the Unix Operating System``, M. J. Bach. * BSD: ,,Design and Implementation of the 4.3BSD Unix Operating System``, Leffler, McKusick, Karels, Quaterman Za dober uvod v OSF/1 (ne tako tehnièen kot prej¹nji dve knjigi), glejte: ,,Guide to OSF/1, A Technical Synopsis``, izdano pri zalo¾bi O'Reilly. Na SunOS, ,,Virtual Memory Architecture in SunOS`` in ,,Shared Libraries in SunOS`` v spisih ,,USENIX Proceedings``, poletje 1989. Dober nabor èlankov o prihodnosti Unixa je ,,Unix Variants`` v izdaji revije Unix Review, april 1992. Drugi dobri viri informacij vkljuèujejo datoteko bsd-faq in mnoge novièarske skupine, omenjene v besedilu. 7.4 Glavni igralci in standardi Unixa From: "Pierre (P.) Lewis" <lew@bnr.ca> Date: Mon Jan 21 16:59:14 EST 1995 X-Version: 2.8 Najpomembnej¹i igralci na odru Unixa so trenutno (zgodnje leto 1995, popravki so zelo dobrodo¹li, to so novi byti): * Novell, ki je kupil USL (zgodaj 1993) in ima zdaj izvorno kodo. * X/Open, ki ima tr¾ne pravice do uporabe blagovne znamke ,,UNIX``. * 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. * IEEE s standardi POSIX, LAN. * PowerOpen (IBM, Apple, Motorola, Bull, drugi), ki promovira PowerPC. Ne zame¹ajte ga z grafiènim okoljem z istim imenom. Naslednje kratko opisuje najpomembnej¹e standarde, ki se nana¹ajo na Unix. * IEEE: + standardi 802.x (LAN) (LLC, ethernet, token ring, token bus) + 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) o 1003.1: knji¾niène procedure (veèinoma sistemski klici) - pribli¾no V7 razen za signale in terminalski vmesnik (1990) o 1003.2: ukazna lupina in pripomoèki o 1003.3: testne metode in ustreznost o 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 o 1003.5: povezave jezika Ada o 1003.6: varnost o 1003.7: sistemsko upravljanje (vkljuèuje tiskanje) o 1003.8: transparenten dostop do datotek o 1003.9: povezave jezika FORTRAN o 1003.10: super-raèunalni¹tvo o 1003.12: vmesniki, neodvisni od protokola o 1003.13: profili v realnem èasu (angl. real-time profiles) o 1003.15: vmesniki za super-raèunalni¹ki batch (?) o 1003.16: povezave jezika C (?) o 1003.17: storitve z imeniki o 1003.18: standardiziran profil po POSIX (?) o 1003.19: povezave jezika FORTRAN 90 * X/Open (konzorcij proizvajalcev, ustanovljen 1984): + X/Open Portability Guides (XPGn) - vodniki po zdru¾ljivosti z X/Open: o XPG2 (1987), moèan vpliv SV # Vol 1: ukazi in pripomoèki # Vol 2: sistemski klici in knji¾nice # Vol 3: terminalski vmesnik (curses, termio), IPC (SV), internacionalizacija # Vol 4: programski jeziki (C, COBOL!) # Vol 5: upravljanje s podatki (ISAM, SQL) o XPG3 (1989) dodaja: X11 API (sistemski klici za X11) o XPG4 (1992) dodaja: XTI? 22 komponent + zaporedja vmesnikov XOM: o XOM (X/Open Object Management) splo¹ni mehanizmi vmesnikov za naslednje o XDS (X/Open Directory Service) o XMH (X/Open Mail ??) o XMP (X/Open Management Protocols) - ne Bullov CM API? + X/Open ima zdaj pravice za uporabo blagovne znamke ,,UNIX`` (pozno 1993); + ,,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. * AT&T - (je to ¹e relevantno leta 1994? Kdo je zdaj odgovoren za SVID, TLI, APLI?) + System V Interface Definition (SVID) - definicija vmesnika Systema V o SVID1 (1985, SVR2) # Vol 1: sistemski klici in knji¾nice (podobno XPG2.1) o SVID2 (1986, SVR3) # Vol 1: sistemski klici in knji¾nice (osnova, raz¹iritve jedra) # Vol 2: ukazi in pripomoèki (osnovni, napredni, upravni¹ki, razvoj programja), terminalski vmesnik # Vol 3: terminalski vmesnik (spet), STREAMS in TLI, RFS o SVID3 (19??, SVR4) dodaja # Vol 4: ?? &c + vmesniki API (programski vmesnik za aplikacije) o Transport Library Interface (TLI) o ACSE/Presentation Library Interface (APLI) * COSE (COmmon Open Software Environment - skupno okolje odprtega programja) [IBM, HP, SunSoft in drugi]: cilj je zbli¾ati razliène platforme Unixa. Iniciative v naslednjih podroèjih: + namizna okolja + 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. + porazdeljene raèunske storitve (OSF-jev DCE in SunSoftov ONC) + objektne tehnologije (OMG-jeva CORBA) + grafika + veèpredstavnost + upravljanje sistemov * PowerOpen Environment (POE, okolje PowerOpen), ki ga promovira zdru¾enje PowerOpen (POA). Standard za Unixu podobne OS, ki teèejo na èipu PowerPC. Definira: + API (programski vmesnik za aplikacije, izpeljan iz AIX, ustreza POSIX, XPG4, Motif, &c) in + ABI (binarni aplikacijski vmesnik), razloèljiv faktor med drugimi standardi kot so POSIX, XPG4, &c.. Katerikoli sistem, ki bo ustrezal POE, bo lahko poganjal katerokoli programje za POE. Kljuène odlike: + zasnova na arhitekturi PowerPC + neodvisnost od strojnega vodila + implementacije sistema se lahko raztezajo od prenosnikov do super-raèunalnikov + potrebuje veèuporabni¹ki, veèopravilni operacijski sistem + omre¾na podpora + raz¹iritve X windows, Motif + ustreznost preizku¹ena in potrjena od neodvisne stranke (POA) AIX 4.1.1 bo ustrezal PowerOpen. MacOS ne ustreza in tudi ne bo. (Zgornje je prirejeno iz powerpc-faq novièarske skupine comp.sys.powerpc.) IBM je vpleten v projekt COSE in v projekt POE. Kako neki bosta tadva sodelovala? 7.5 Ugotovitev vrste va¹ega Unixa From: "Pierre (P.) Lewis" <lew@bnr.ca> Date: Mon May 30 15:44:28 EDT 1994 X-Version: 2.6 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 poll(2), ne pa tudi select(2), 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 ,,uname -a``. 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. 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) Ko se pomikamo v pozna 90-ta leta, je to verjetno vedno manj in manj relevantno. 7.6 Kratki opisi nekaterih znanih (komercialnih/prostih) Unixov From: "Pierre (P.) Lewis" <lew@bnr.ca> Date: Tue Aug 15 15:14:00 EDT 1995 X-Version: 2.9 (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: comp.unix.aix. * 1.x (za 386 PS/2) * 2.x (za PC RT) * 3.x (za RS/6000), paging kernel, logical volume manager, i18n; * 3.2 dodaja TLI/STREAMS. Bazira na SV z veliko izbolj¹avami. * 4.1 je zadnji (vkljuèuje podporo za PowerPC?) * AIX/ESA, teèe na raèunalnikih mainframe 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. :-) 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: comp.unix.aux. * 2.0: SVR2 z 4.2BSD, aplikacije za Mac System 6. * 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. * 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). 3B1 (680x0): Osnovan na SV, naredil Convergent za AT&T. Novièarska skupina: comp.sys.3b1. BNR/2: pomeni BSD Net/2 Release? Vkljuèuje NetBSD/1, FreeBSD. BOS za Bullov DPX/2 (680x0) * V1 (1990): SVR3 z raz¹iritvami BSD (FFS, select, vtièi), simetrièno MP, X11R3 * V2 (1991): dodaja nadzor opravil, zrcaljenje diska, varnost C2, raz¹iritve DCE * 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. 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: 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: 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: comp.sys.pyramid. DELL UNIX [DELL Computer Corp.]: 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: 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`` Free Software Foundation (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). * 6.5: SVR2 * 7.0: SVR3.2, symlinks * 7.5 * 8.0: osnova BSD? za HP-9000 CISC (300/400) in RISC (800/700), delitev knji¾nic * 9.0: vkljuèuje DCE 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: 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: comp.os.linux.{ admin, announce, development, help, 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: 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&T, nobene nizkonivojske kode. Glejte 386BSD in BSD/386 zgoraj. NetBSD 0.8: je pravzaprav 386bsd v novi obleki. Prenesen na raèunalnike [34]86, MIPS, Amiga, Sun, Mac. Kak¹no je razmerje z Net/2? * 1.0 je pri¹la ven v 1994 NEXTSTEP (Intel Pentium in 86486, Hewlett-Packard PA-RISC, NeXT 68040): BSD4.3 na jedru Mach, lastni grafièni vmesnik. * 1.x, 2.0, 2.1, 2.2, 3.0, 3.1 (stare) * 3.2 (trenutna razlièica, Intel Pentium in 86486, Hewlett-Packard PA-RISC, NeXT 68040) * 3.3 (prihaja; na voljo razlièica za SPARC) * 4.0 (bo napovedana, vkljuèevala bo razlièico za Sun SPARC in bo upo¹tevala OpenStep) * NEXTSTEP za PowerPC ali DEC Alpha ¹e ni napovedan (ali ga naèrtujejo?) NEWS-OS (Sony) * 3.2 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: comp.sys.pyramid. PC-IX (IBM 8086): SV Plan 9 (AT&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 [Siemens]: osnova System V. Solaris (Sparc, x86): * 1.0: pravzaprav isti kot SunOS 4.1.1, z OpenWindows 2.0 in pripomoèki DeskSet. * 1.0.1: SunOS 4.1.2 z multiprocesiranjem (jedro ni veènitno); ni za 386 * 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! * Solaris zado¹èa OpenStep (ne-NeXT, toda z NEXTSTEP API) z zadnjo razlièico (1994?). * 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. UHC (80x86): èisti SVR4, X11, Motif Ultrix (DEC): temelji na 4.2BSD z veliko 4.3. Novièarska skupina: comp.unix.ultrix. * 4.4 je zadnja UNICOS (Cray): osnova System V. Novièarska skupina: comp.unix.cray. * 5.x, 6,x, 7.0 UnixWare Release 4.2 [Univel]: SVR4.2; èez NetWare. Univel ne obstaja veè. UTEK (Tektronix) * 4.0 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: comp.unix.xenix. 7.7 Unixi, delujoèi v realnem èasu From: "Pierre (P.) Lewis" <lew@bnr.ca> Date: Tue Aug 15 15:14:00 EDT 1995 X-Version: 2.9 Pozor! 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 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, &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 [RTMX Incorporated]: 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: 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) 7.8 Slovarèek Unixa From: "Pierre (P.) Lewis" <lew@bnr.ca> Date: Tue Aug 15 15:14:00 EDT 1995 X-Version: 2.9 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) [Sun, HP, IBM]: skupni videz in obèutek (Motif - Sun bo pustil OpenLook odmreti), skupni API. Reakcija proti Windows NT. Glejte zgornji razdelek ,,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 [Enterprise]): ???. 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, ...): * 2.5: monolitno jedro z 4.2BSD * 3.0: mikrojedro s stre¾nikom BSD Unix v uporabni¹kem prostoru (in drugi OS, npr. MS-DOS) Novièarska skupina: 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 [NeXT, Sun]: ??? PowerOpen: standard in organizacija za promocijo PowerPC. Vkljuèuje IBM, Apple in Motorolo; drugi? Glejte zgornji razdelek ,,Glavni igralci in standardi Unixa``. PowerPC (PPC): procesorski èip RISC [IBM, Motorola]. 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. * ONC: Èez TCP ali UDP (pozneje OSI), uporablja XDR za ¹ifriranje podatkov. * DCE: ima drugaèen mehanizem RPC (temelji na NCS Apolla) 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 _________________________________________________________________ Naprej Nazaj Vsebina #previous contents Naprej Nazaj Vsebina _________________________________________________________________ 8. Primerjava sistemov za upravljanje konfiguracij (RCS, SCCS). 8.1 RCS vs. SCCS: Uvod Subject: RCS vs SCCS: Introduction Date: Sat, 10 Oct 92 19:34:39 +0200 From: Bill Wohler <wohler@newt.com> 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 ... 8.2 RCS vs. SCCS: Kako sta primerljiva vmesnika? Subject: RCS vs SCCS: How do the interfaces compare? Date: Sat, 10 Oct 92 19:34:39 +0200 From: Bill Wohler <wohler@newt.com> 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. 8.3 RCS vs. SCCS: Kaj je v datoteki popravkov? 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> RCS shranjuje zgodovino v datotekah s podalj¹kom ,,,v``. SCCS shranjuje zgodovino v datotekah s predpono ,,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 sccs programa SCCS vedno uporablja imenik za SCCS. Èe ne uporabljate uporabni¹kega vmesnika 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 admin. 8.4 RCS vs. SCCS: Katere so kljuène besede? Subject: RCS vs SCCS: What are the keywords? Date: Sat, 10 Oct 92 19:34:39 +0200 From: Bill Wohler <wohler@newt.com> 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 ,,%I%`` 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. 8.5 Kaj je simbolièno ime v RCS? Subject: What's an RCS symbolic name? Date: Sat, 10 Oct 92 19:34:39 +0200 From: Bill Wohler <wohler@newt.com> 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 rcs -n 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. 8.6 RCS vs. SCCS: Kaj pa hitrost? 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> 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. 8.7 RCS vs. SCCS: Identifikacija razlièic Subject: RCS vs SCCS: Version Identification. Date: Sat, 10 Oct 92 19:34:39 +0200 From: Bill Wohler <wohler@newt.com> SCCS zna ugotoviti, kdaj se je v sistem dodala doloèena vrstica kode. 8.8 RCS vs. SCCS: Kako se obna¹ata v te¾avah? Subject: RCS vs SCCS: How do they handle problems? Date: Sat, 10 Oct 92 19:34:39 +0200 From: Bill Wohler <wohler@newt.com> È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. 8.9 RCS vs. SCCS: Kako se razumeta z ukazom make(1)? 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> Dejstvo, da SCCS uporablja predpone za imena datotek (s.datoteka.c) pomeni, da jih make(1) ne more obravnavati na obièajen naèin, in morate uporabiti posebna pravila (z uporabo znakov ,~`), da ga pripravite k sodelovanju s SCCS; kljub temu make(1) na nekaterih platformah Unixa ne bo uporabil privzetih pravil za datoteke, ki jih upravlja SCCS. Zapis s podalj¹kom (datoteka.c,v), ki ga uporablja RCS, pomeni, da lahko v vseh izvedbah programa make uporabljate obièajna podalj¹kovna pravila, tudi, èe izvedba ni naèrtovana posebej za obvladovanje datotek RCS. 8.10 RCS vs. SCCS: Pretvorba Subject: RCS vs SCCS: Conversion. Date: Tue, 10 Jan 1995 21:01:41 -0500 From: Ed Ravin <elr@wp.prodigy.com> Za pretvorbo iz SCCS v RCS je na voljo nepodprti skript za ukazno lupino csh. Najdete ga lahko na naslovu ftp://ftp.std.com/src/gnu/cvs-1.3/contrib/sccs2rcs. Za pretvorbo iz RCS v SCCS morate napisati svoj skript ali program. 8.11 RCS vs. SCCS: Podpora Subject: RCS vs SCCS: Support Date: Sat, 10 Oct 92 19:34:39 +0200 From: Bill Wohler <wohler@newt.com> SCCS podpira podjetje AT&T. RCS podpira ustanova Free Software Foundation. Torej RCS teèe na veliko veè platformah, vkljuèno z osebnimi raèunalniki. Veèina programov make prepozna SCCS-jevo predpono ,,s.``, medtem, ko je GNU-jev make eden redkih, ki obravnavajo RCS-jev podalj¹ek ,,,v``. Nekateri programi tar imajo izbiro -F, ki ignorira imenike za RCS, za SCCS, ali oboje. 8.12 RCS vs. SCCS: Primerjava ukazov Subject: RCS vs SCCS: Command Comparison Date: Sat, 10 Oct 92 19:34:39 +0200 From: Bill Wohler <wohler@newt.com> 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. 8.13 RCS vs. SCCS: Priznanja Subject: RCS vs SCCS: Acknowledgements Date: Sat, 10 Oct 92 19:34:39 +0200 From: Bill Wohler <wohler@newt.com> ®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 <wohler@newt.com>. * Karl Vogel <vogel@c-17igp.wpafb.af.mil> * Mark Runyan <runyan@hpcuhc.cup.hp.com> * Paul Eggert <eggert@twinsun.com> * Greg Henderson <henders@infonode.ingr.com> * Dave Goldberg <dsg@mbunix.mitre.org> * Rob Kurver <rob@pact.nl> * Raymond Chen <rjc@math.princeton.edu> * Dwight <dwight@s1.gov> 8.14 Ali lahko dobim veè podatkov o sistemih za upravljanje konfiguracij? 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> Bill Wohler, ki je zbral vse podatke v tem delu teh PZV, je zbral ¹e dosti veè podatkov. Dobite jih na naslovu ftp://ftp.wg.omron.co.jp/pub/unix-faq/docs/rev-ctl-sys. _________________________________________________________________