next previous contents naprej nazaj vsebina vmesna vprasanja kako lahko izvem cas ustvarjenja datoteke date thu mar est ne morete ga nikjer se ne shrani datoteke imajo podatke o casu zadnje spremembe pokaze ga ls l`` casu zadnjega dostopa pokaze ga ls lu`` in casu spremembe inode pokaze ga ls lc`` zadnji se pogosto imenuje cas ustvarjenja`` celo v nekaterih straneh referencnega prirocnika za man a to je narobe spremeni se tudi z operacijami kot so mv ln chmod chown in chgrp to razlaga stran o stat kako lahko uporabim rsh ne da bi rsh cakal konec oddaljenega ukaza subject how do i use rsh without having the rsh hang around date thu mar est glejte zapis v vprasanju o katerem rsh`` govorimo ocitni odgovori odpovejo rsh stroj ukaz ali rsh stroj 'ukaz ' na primer poskusite narediti rsh stroj 'sleep ' in videli boste da rsh ne bo takoj padel v ukazno vrstico pocakal bo sekund dokler se ne bo oddaljeni ukaz sleep`` izvedel ceprav se ukaz na oddaljenem stroju pozene v ozadju kako torej pripravite rsh do tega da konca z delom takoj ko se zacne izvrsevati sleep resitev ce uporabljate na oddaljenem stroju csh rsh machine n 'command dev null dev null ' ce na oddaljenem stroju uporabljate sh rsh machine n 'command dev null dev null ' zakaj n`` poveze standardni vhod ukaza rsh na dev null torej lahko pozenete celoten ukaz rsh v ozadju na lokalnem stroju torej ima n`` ekvivalenten pomen kot da bi se enkrat dolocili dev null`` se vec preusmeritve vhoda izhoda na oddaljenem stroju znotraj enojnih narekovajev zagotavljajo da rsh misli da se seansa lahko prekine ker ni vec toka podatkov opomba datoteko na katero s katere preusmerjate na oddaljenem racunalniku ni nujno dev null katerakoli datoteka bo v redu v veliko primerih razlicni deli tega zapletenega ukaza niso potrebni kako lahko skrajsam datoteko subject how do i truncate a file date mon mar funkcija bsd ja ftruncate nastavi dolzino datoteke toda vse razlicice se ne obnasajo enako izgleda da tudi druge razlicice unixa podpirajo neke vrste krajsanje obstajajo tri znana obnasanja funkcije ftruncate v sistemih ki jo podpirajo bsd ultrix sgi lynxos krajsanje ne poveca datoteke krajsanje ne premika datotecnega kazalca bsd sunos solaris osf hp ux amiga krajsanje lahko poveca datoteko krajsanje ne premika datotecnega kazalca cray unicos unicos krajsanje ne poveca datoteke krajsanje spremeni datotecni kazalec ostali sistemi pridejo v stirih moznostih f chsize le sco nekateri sistemi definirajo izraz f chsize a ga ne podpirajo obnasa se kot bsd f freesp le interative unix nekateri sistemi npr interative unix definirajo izraz f freesp a ga ne podpirajo obnasa se kot bsd chsize qnx in sco nekateri sistemi npr interative unix imajo funkcijo chsize a je ne podpirajo obnasa se kot bsd nic ni znanih sistemov tukaj bodo sistemi ki sploh ne podpirajo truncate moderatorjevo sporocilo spodnje funkcije sem posnel nekaj let nazaj ne morem vec ugotoviti prvotnega pisca s spencer sun spencer ncd com je tudi prispeval verzijo za f freesp sledijo funkcije za ne domorodno 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 return if filebuf st size length extend file length if lseek fd length seek set return write a byte if write fd return else truncate length fl l whence fl l len fl l start length fl l type f wrlck zapisi kljucavnico na prostor datoteke to se zanasa na nedokumentiran argument f freesp funkcije fcntl ki skrajsa datoteko tako da se konca na polozaju ki ga doloca fl l start se manjsa cudesa nikoli ne bodo koncala if fcntl fd f freesp fl return return else int ftruncate fd length int fd off t length return chsize fd length endif endif zakaj simbol `` ukaza find ne naredi to kar zelim subject why doesn't find's symbol do what i want date thu mar est ukaz find ima izbiro exec ki izvrsi dolocen ukaz na vseh izbranih datotekah ukaz find zamenja vse `` ki jih vidi z imenom datoteke ki jo trenutno preucuje 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 \ \ upajoc da bo find izvrseval ukaze takole ukaz imenik ukaz imenik zal find razvije simbol `` le ko nastopa sam vse drugo kot na primer `` bo find pustil pri miru torej bo namesto zelenega dejanja izvrsil ukaz ukaz enkrat za vsak imenik to je lahko hrosc lahko je odlika a obticali smo s trenutnim obnasanjem kako torej to obidemo en nacin bi bil da napisete trivialno majhno skripto v ukazni lupini denimo naredi`` ki vsebuje le ukaz potem lahko uporabljate find pot type d exec naredi \ ali ce se zelite izogniti skripti naredi`` lahko uporabite find pot type d exec sh c 'ukaz ' \ to deluje ker se znotraj ukaza` sh c 'ukaz' a b c `` razvije v a v b in tako naprej ali pa lahko uporabite trik konstruiranja ukaza s pripomockom sed find pot type d print sed 's ukaz ' sh ce na vsak nacin zelite zmanjsati stevilo klicev ukaza ukaz`` lahko pogledate ce ima vas 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 izvedlo eno ali vec izvajanj ukaz datoteka datoteka datoteka imenik datoteka imenik datoteka zal to ni popolnoma robustna ali varna resitev xargs pricakuje da se vhodne vrstice koncajo z znakom za novo vrsto angl newline zato se bo zmedel ob datotekah s cudnimi znaki kot znaki za novo vrsto v njihovih imenih kako lahko nastavim dovoljenja simbolicne povezave subject how do i set the permissions on a symbolic link date thu mar est dovoljenja simbolicne povezave pravzaprav ne pomenijo nicesar edina dovoljenja ki stejejo so dovoljenja datoteke na katero kaze povezava kako lahko obnovim`` pobrisano datoteko subject how do i undelete a file date thu mar est nekoc 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 rezervne kopije preverite pri svojem upravitelju ce je na voljo nedavna rezervna kopija vase datoteke a ce ni berite naprej pri vseh namenih in razlogih ko enkrat pobrisete datoteko z ukazom rm`` je ni vec ko uporabite rm`` na datoteki sistem popolnoma pozavi kateri bloku razsejani po disku so bili del vase datoteke se huje bloki pravkar pobrisane datoteke bodo prvi vzeti in prepisani ko bo sistem potreboval vec diskovnega prostora vendar nikoli ne recite nikoli teoreticno je mogoce vrniti delcke podatke ce takoj po ukazu rm zaustavite sistem angl shut down a raje imejte pri roki zelo carovniski tip osebe z urami ali dnevi casa da vam vse obnovi vas prvi odziv ko po pomoti pobrisete datoteko z rm je zakaj ne bi naredili vzdevka ukazne lupine ali procedure ki bi spremenila ukaz rm`` tako da bi namesto pobrisal raje prestavil datoteke v kos za smeti tako lahko datoteke obnovite ce napravite napako in obcasno izpraznite kos za smeti dve tocki prvic to je splosno sprejeto kot slaba ideja postali boste odvisni od tega obnasanja ukaza rm in nekoc se boste znasli na normalnem sistemu kjer je rm`` zares rm`` in se boste spravili v tezave drugic verjetno boste ugotovili da je ob vsej zmesnjavi z diskovnim prostorom in casom porabljenim za vzdrzevanje kosa za smeti lazje malo bolj paziti pri uporabi ukaza rm`` za zacetnike poglejte izbiro i`` ukaza rm`` v vasem prirocniku ce ste se vedno pogumni potem je tukaj mozni preprosti odgovor naredite si lahko ukaz can`` ki bo premikal datoteke v imenik smetnjak trashcan v csh lahko postavite naslednje ukaze v datoteko login`` v vasem domacem imeniku alias can 'mv \ ~ trashcan' vrzi datoteko e v kos alias mtcan 'rm f ~ trashcan ' nepovratno izprazni kos if d ~ trashcan mkdir ~ trashcan zagotovi obstoj kosa morda boste tudi zeleli postaviti rm f ~ trashcan v datoteko logout`` v vasem domacem imeniku da boste samodejno izpraznili kos ko se odjavite razlicici za ukazni lupini sh in ksh sta prepusceni bralcu kot vaja projekt athena na mit u je dal obsezen paket za brisanje vrnitev izbris ciscenje ki lahko sluzi kot popolno nadomestilo za rm ki dopusca obnovitev datotek ta paket je bil poslan na comp sources misc volume issue kako lahko proces ugotovi ali tece v ozadju subject how can a process detect if it's running in the background date thu mar est najprej ali zelite vedeti ce tecete v ozadju ali ce tecete interaktivno ce se odlocate ali naj izpisujete pozivnike in podobno je to verjetno boljsi kriterij poglejte ce je standardni vhod terminal sh if then fi c if isatty v splosnem ne morete reci ali tecete v ozadju osnovni problem je da imajo razlicne ukazne lupine in razlicne razlicice unixa razlicne predstave o tem kaj pomeni ospredje`` in ozadje`` in v najbolj pogostem tipu sistema z dobro razciscenima pojmoma se lahko programi poljubno premikajo med ospredjem in ozadjem sistemi unix brez nadzora opravil tipicno postavijo proces v ozadju tako da ignorirajo sigint in sigquit in 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 dajo identifikacijsko stevilko id razlicno od skupine procesov ki pripadajo terminalu premikajo ga nazaj v ospredje tako da nastavijo skupinsko stevilko procesov id terminala angl terminal's process group id enako procesovi ukazne lupine ki ne podpirajo nadzora opravil na sistemih unix ki podpirajo nadzor opravil tipicno naredijo isto kot ukazne lupine na sistemih ki ne podpirajo nadzora opravil zakaj preusmerjanje v zanki ne dela kot bi moralo bourneova ukazna lupina subject why doesn't redirecting a loop work as intended bourne shell date thu mar est vzemite 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 bourneove ukazne lupine zakaj zaradi naslednje pogosto nedokumentirane lastnosti zgodovinskih bourneovih ukaznih lupin preusmerjanje kontrolne strukture kot je zanka ali stavek if`` povzroci nastanek ukazne podlupine 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 prepoveduje zgornje ravnanje se pravi v sistemu podrejenemu p v bourneovih ukaznih lupinah zgornji primer izpise foo je zdaj bletch`` v zgodovinskih in podrejenih p izvedbah lahko uporabite naslednji trik da se izognete tezavam s preusmerjanjem foo bar naredi datotecni deskriptor duplikat datotecnega deskriptorja stdin potem povezi stdin na etc passwd originalni stdin smo si zdaj zapomnili` v datotecnem deskriptorju glejte dup in sh exec etc passwd while read line do naredi nekaj z line foo bletch done naj bo stdin duplikat datotecnega deskriptorja se pravi spet ga povezemo z originalnim stdin potem zapremo deskriptor exec echo foo je zdaj foo to bi moralo vedno 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 splosnem se vsak del cevovoda izvede v drugi ukazni podlupini v nekaterih izvedbah pa je zadnji ukaz v cevovodu izjema ce je to vgrajeni ukaz kot read`` ga bo izvrsila trenutna lupina sicer bo narejena druga podlupina posix dovoljuje obe obnasanji torej se prenosljive skripte ne morejo zanasati na nobenega od njiju kako pozenem passwd ftp telnet tip in druge interaktivne programe v skripti ukazne lupine v ozadju subject how do i run interactive programs from a shell script date thu mar est ti programi pricakujejo terminalski vmesnik ukazne lupine jim ga posebej ne priskrbijo torej ti programi ne morejo biti avtomatizirani v skriptah ukaznih lupin program expect`` poskrbi za programabilen terminalski vmesnik za avtomatsko interakcijo s takimi programi naslednja skripta za expect je primer ne interaktivne razlicice ukaza passwd uporabnisko ime je dano kot argument geslo kot set geslo spawn passwd 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 razhroscevalnike in druge programe ki nimajo vgrajenega ukaznega jezika distribucija priskrbi tudi poskusno skripto za nenehen zagon igre rogue dokler se ne pojavi dobra zacetna postavitev potem se nadzor vrne uporabniku ki lahko uziva v igri na sreco so bili napisani nekateri programi za obdelavo povezave na terminalu pseudo tty tako da lahko poganjate te vrste programov v skripti za nabavo programa expect posljite send pub expect expect shar z`` na naslov library cme nist gov ali uporabite anonimni ftp iste datoteke s streznika ftp cme nist gov se ena resitev je z uporabo programa pty ki deluje kot program pod seanso psevdo tty in je bil poslan na comp sources unix volume resitev s pty in z uporabo imenovanih cevi bo naredila isto kot zgoraj in lahko izgleda takole bin sh etc mknod out p exec exec out rm f out waitfor 'password ' echo waitfor 'password ' echo cat dev null pty passwd out tukaj je waitfor`` preprost c jevski program ki preiskuje vhod znak po znak za morebitno pojavitev svojega argumenta preprostejsa resitev s pty ki ima slabost da se ne sinhronizira pravilno s programom passwd je bin sh sleep echo sleep echo pty passwd kako lahko v skripti ali programu ugotovim id procesa programa z dolocenim imenom subject how do i find the process id of a program with a particular name date thu mar est v skripti ukazne lupine ni pripomocka posebej nacrtovanega za preslikavo med imeni programov in procesnimi id ji se vec taksne preslikave so pogosto nezanesljive saj ima lahko vec kot en proces isto ime in ker je mozno da proces spremeni svoje ime ko zacne teci toda pogosto lahko uporabimo podoben cevovod za seznam procesov v vasi lasti z dolocenim imenom ps ux awk ' ime awk print ' zamenjajte ime`` z imenom procesa ki ga iscete splosna zamisel je razcleniti izhod ukaza ps in z uporabo pripomockov awk ali grep ali podobnih iskati vrstice z dolocenim imenom ter izpisati pid e teh vrstic opazili boste da zgornji awk `` preprecuje procesu awk da bi se izpisal morda boste morali spremeniti argumente za ps odvisno od vrste unixa ki jo uporabljate v kodi programa v c ju prav tako kot ni nobenega pripomocka posebej nacrtovanega za preslikavo med imeni programov in procesnimi id ji tudi ni prenosljive c jevske knjiznice funkcij za ta opravek vendar nekateri proizvajalci priskrbijo funkcije za branje pomnilnika jedra na primer sun priskrbi funkcije kvm `` in data general priskrbi funkcije dg `` mozno je da jih lahko uporablja vsak uporabnik lahko pa so dostopne le super uporabniku ali uporabniku v skupini kmem`` ce je bralni dostop do pomnilnika jedra na vasem sistemu omejen nadalje so te funkcije pogosto nedokumentirane ali slabo dokumentirane in se lahko spreminjajo od izdaje do izdaje nekateri proizvajalci priskrbijo datotecni sistem proc`` ki se prikaze kot imenik s kupom datotek v njem vsaka datoteka je stevilka ki ustreza id procesa in to datoteko lahko odprete in preberete da dobite podatke o procesu spet dostop do tega je lahko omejen vmesnik pa se lahko spreminja od sistema do sistema ce ne morete uporabiti posebnih proizvajalcevih knjiznicnih funkcij in ce nimate sistema proc in bi radi vse postorili v c ju boste morali sami brskati po pomnilniku jedra za dober primer kako se to pocne na vecih sistemih poglejte izvorno kodo ofiles`` dostopno v arhivih novicarske skupine comp sources unix paket imanovan kstuff`` ki pomaga z brskanjem po jedru je bil poslan na alt sources v maju in je tudi dostopen po anonimnem ftp ju kot v imeniku usenet alt sources articles na wuarchive wustl edu kako preverim izhodni status oddaljenega ukaza izvrsenega z rsh subject how do i check the exit status of a remote command executed via rsh date thu mar est tole ne deluje rsh nek stroj nek zoprn ukaz echo ukazu je spodletelo izhodni status rsh`` je uspeh ce se sam program rsh konca uspesno kar verjetno ni to kar zelite ce zelite preveriti izhodni status oddaljenega programa lahko poskusite uporabite skripto ersh`` maartena litmaatha ki je bila poslana na alt sources v oktobru skripta ersh je ukazno lupinska skripta ki poklice rsh uredi da oddaljen stroj po koncu teka izpise status izvrsenega ukaza in konca s tem statusom je mogoce programu awk podati tudi spremenljivke ukazne lupine subject is it possible to pass shell variable settings into an awk program date thu mar est za to obstajata dva razlicna nacina prvi vkljucuje preprosto razvijanje spremenljivke kjer je to potrebno v programu na primer da dobite seznam vseh terminalov tty ki jih uporabljate who awk ' ' user ' print ' enojni narekovaji se navadno uporabljajo za objem programa v awk u saj se v njih pogosto uporablja znak ` ki je lahko interpretiran v ukazni lupini ce zaprete program v dvojne narekovaje ne pa tudi ce ga zaprete v enojne v tem primeru hocemo 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 ' a jih moramo vseeno vkljuciti saj bi lahko lupinska spremenljivka user vsebovala posebne znake kot so presledku drugi nacin za podajanje spremenljivih nastavitev programu awk je uporaba pogosto nedokumentirane lastnosti awk a ki dovoljuje da se spremenljivke podajajo v ukazni vrstici kot lazna imena datotek`` na primer who awk ' uporabnik print ' uporabnik user spremenljivke se uporabijo ko se zasledijo v ukazni vrstici torej na primer lahko s to tehniko narocite programu awk kako naj se obnasa za razlicne datoteke na primer awk ' program ki je odvisen od s ' s datoteka s datoteka opazite da nekatere verzije programa awk povzrocijo da se pred izvedbo bloka begin zasledijo spremenljivke pred vsemi pravimi imeni datotek toda nekatere ne zato se na to ne gre zanasati opazite tudi da awk ob navedbi spremenljivk namesto pravih datotek sam od sebe ne bo bral s stdin zato morate dodati argument `` na konec vasega ukaza kot je to v predprejsnjem primeru tretja moznost je uporaba novejse verzije programa awk nawk ki dopusca neposreden dostop do okoljskih spremenljivk na primer nawk 'end print vasa pot je environ ' dev null 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 sep zal je nemogoce posplositi kako naj se obnasa zakljucek otroskega procesa saj se natancen mehanizem razlikuje na razlicnih vrstah unixa najprej kot privzeto boste morali narediti wait za otroski proces na vseh vrstah unixa se pravi ne poznam vrste unixa ki bi avtomaticno pospravila otroski proces ki se je koncal tudi ce mu niste tako narocili drugic ce na nekaterih iz sysv izpeljanih sistemih naredite signal sigchld sig ign `` no pravzaprav je lahko sigcld namesto sigchld toda vecina novejsih sistemov sysv ima define sigchld sigcld`` v datotekah z glavami se otroski procesi samodejno pocistijo brez nadaljnega truda na vasi strani najboljsi nacin da vidite ce to deluje tudi na vasem stroju je da poskusite ceprav se je v vsakem primeru slabo zanasati na to ce poskusate pisati prenosljivo kodo zal posix tega ne dopusca nastavitev sigchld na sig ign je v posix u nedefinirana torej tega ne morete narediti v vasem programu ce naj zadosca standardu posix kaksen je torej nacin posix a kot je bilo ze omenjeno morate namestiti upravljalnik signalov angl signal handler in cakati z wait v posix u so upravljalniki signalov namesceni s funkcijo sigaction ker vas ne zanimajo zaustavljeni`` otroci le prekinjeni otroci dodajte zastavicam sa flags vrednost sa nocldstop cakanje brez blokiranja se izvede z waitpid prvi argument funkciji waitpid naj bo cakaj na katerikoli pid tretji naj bo wnohang to je najbolj prenosljiv nacin in bo verjetno v prihodnosti postal se bolj prenosljiv ce vas sistem ne zadosca zahtevam posix obstaja vrsta nacinov najpreprostejsi nacin je signal sigchld sig ign ce deluje ce ne morete uporabiti sig ign za zagotovitev samodejnega ciscenja morate napisati upravljalnik signalov ki bo to storil sploh ni preprosto napisati upravljalnik signalov ki bi naredil pravo stvar na vseh vrstah unixa zaradi naslednjih nekonsistentnosti na nekaterih vrstah unixa se upravljalnik signalov sigchld poklice ce se konca eden ali vec otrok ce vas uprabljalnik signalov naredi le en klic wait to pomeni da ne bo pocistil za vsemi otroki na sreco verjamem da ima programer na vseh vrstah unixov na katerih je to res na voljo klic wait ali waitpid ki dovoljuje izbiri wnohang preverbo ali se kaj otrok caka na pociscenje torej naj bi vas upravljalnik signalov na vseh sistemih ki imajo wait waitpid klical eno od teh funkcij znova in znova z izbiro wnohang dokler ni vec nobenih otrok za pociscenje boljsa izbira je waitpid ker je vkljucena v posix na sistemih izpeljanih iz sysv se signali sigchld regenerirajo ce po izhodu upravljalnika signala sigchld se vedno ostane kaksen otroski proces za pocistiti torej je na vecini sistemov sysv ob klicu upravljalnika signalov varno predpostaviti da morate pocistiti le en signal in pricakovati da se bo upravljalnik poklical ponovno ce je po izhodu iz njega ostalo se kaj nepociscenih signalov na starejsih sistemih ni nobenega nacina da bi preprecili 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 upravljalniske funkcije da se resetirajo na sreco novejse izvedbe dovoljujejo upravljalnikom signalov da se namestijo ne da bi bili resetirani na sig dfl ko se pozene upravljalniska funkcija temu problemu se na sistemih ki nimajo wait waitpid a imajo sigcld izognete tako da morate resetirati upravljalnik signalov s klicem signal ko ste izvedli v upravljalniku vsaj en wait vsakic ko se klice zaradi zgodovinskih zdruzljivostnih razlogov bo system v obdrzal 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 wait na sistemih ki jo imajo tudi uporabljati in da mora teci vas upravljalnik signalov v zanki na sistemih ki pa teh funkcij nimajo morate imeti ob vsaki zahtevi po upravljalniku signalov po en klic wait se ena stvar ce ne zelite iti skozi vse te tezave obstaja prenosljiv nacin da se izognete temu problemu ceprav je malce manj ucinkovit vas starsevski proces naj se razveji s fork in potem caka na mestu da se konca otroski proces otroski proces se potem spet razveji in vam da otroka in vnuka otrok se takoj prekine in torej stars ki ga caka izve za njegov konec in nadaljuje z delom vnuk pa pocne kar bi moral prvotno narediti otrok ker je njegov stars koncan ga nasledi proces init ki bo opravil vse potrebno cakanje ta metoda je neucinkovita ker potrebuje dodatno razvejanje a je popolnoma prenosljiva kako dobim vrstice iz cevovoda tako kot se pisejo namesto le v vecjih blokih subject how do i get lines from a pipe instead of only in larger blocks from jonathan i kamens date sun feb knjiznica stdio trenutno dela vmesno pomnenje angl buffering razlicno odvisno od tega ali misli da tece na tty ali ne ce misli da je na tty dela vmesno pomnenje po posameznih vrsticah sicer uporablja vecji vmesni pomnilnik kot je ena vrstica ce imate izvorno kodo odjemalca za katerega bi radi onemogocili vmesno pomnenje lahko za to uporabite setbuf ali setvbuf ce ne je najboljsi nacin da prepricate program da tece na tty tako da ga pozenete pod pty se pravi da uporabite program pty`` omenjen v vprasanju kako pozenem passwd ftp telnet tip in druge interaktivne programe v skripti ukazne lupine v ozadju `` 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 oct to ni tezko a je na prvi pogled malce kripticno zacnimo najprej s samim ukazom date date lahko vzame niz s formatom izpisa in ga uposteva niz za formatiranje mora biti objet z narekovaji da preprecimo ukazni lupini poskus njegove interpretacije preden ga dobi sam ukaz date poskusite tole date ' d m y' morali bi dobiti nekaj kot ce zelite imeti vmes locila 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 referencnega prirocnika man date zdaj pa se to spravimo v ime datoteke denimo da bi radi ustvarili datoteke imenovane report ali katerikoli datum ze je danes filename report `date ' d m y'` opazite da tukaj uporabljamo dva nabora narekovajev notranji nabor preprecuje formatirnemu nizu prezgodnjo interpretacijo zunanji nabor pove ukazni lupini naj izvrsi objeti ukaz in zamenja rezultat v izraz zamenjava ukazov angl command substitution zakaj se nekatere skripte zacnejo z `` subject why do some scripts start with from chip chinacat unicom com chip rosenthal date tue jul gmt chip rosenthal je v preteklosti v novicarski skupini comp unix xenix odgovoril na zelo podobno vprasanje mislim da ljudi bega da obstajata dva razlicna mehanizma ki se oba zacneta z znakom ` oba resujeta isti problem na zelo omejenem naboru primerov a nista nic manj razlicna nekaj ozadja ko se jedro sistema unix odloci pognati program eden sistemskih klicev druzine exec najprej pogleda prvih bitov datoteke teh bitov se imenuje magicna stevilka prvic magicna stevilka preprecuje jedru da bi naredilo kaj naumnega kot na primer poskusalo izvesti datoteko z bazami podatkov o vasih strankah ce jedro ne prepozna magicne stevilke se pritozi z napako enoexec program pozene le ce je magicna stevilka prepoznavna drugic scasoma so se uvajali razlicni formati izvrsilnih datotek in magicna stevilka ni le povedala jedru ali naj izvrsi datoteko pac pa tudi kako naj jo izvrsi na primer ce prevedete program na sitemu sco xenix in nesete binarno datoteko na sistem sysv bo jedro prepoznalo magicno stevilko in reklo aha to je binarna datoteka tipa x out `` in se nastavilo tako da bo uporabljalo klice zdruzljive s sistemom xenix pomnite da jedro lahko poganja le binarne izvrsilne slike pomnilnika kako torej se vprasujete tecejo skripte konec koncev lahko napisem v pozivniku ukazne lupine moja skripta`` in ne dobim napake enoexec odgovor skripte se ne izvrsujejo v jedru pac pa v ukazni lupini koda v ukazni lupini lahko izgleda podobno poskusi pognati program execl program basename program char klic exec je spodletel morda gre za skripto ukazne lupine if errno enoexec execl bin sh sh c program char oh ne g bill perror program return ta primer je mocno poenostavljen vpletenih je veliko vec zadev a to ponazarja bistvo ki ga poskusam opisati ce je klic execl uspesen in se program zazene se koda za execl nikoli ne pozene v zgornjem primeru uspesen execl programa program` pomeni da se spodnje vrstice primera ne izvrsijo namesto tega sistem izvaja binarno datoteko program` ce po drugi strani prvi klic execl spodleti ta hipoteticna ukazna lupina pogleda zakaj ji je spodletelo ce klic execl ni uspel ker program` ni bil prepoznan kot binarna izvrsilna datoteka ga ukazna lupina poskusa naloziti kot skripto ukazne lupine ljudje iz berkeleya so imeli cedno idejo kako razsiriti nacin na katerega jedro zaganja programe popravili so jedro da prepozna magicno stevilko ` magicne stevilke so velike bitov in dva bitna znaka tvorita bitov prav ko je jedro prepoznalo magicno stevilko ` je prebralo tudi ostanek vrstice in ga obravnavalo kot ukaz ki ga naj pozene na vsebini datoteke s tem popravkom lahko zdaj pocnete podobne stvari bin sh bin csh bin awk f ta popravek je obstajal le v svetu berkeleya in je presel na jedra usg kot del sistema system v release pred v jedro ni imelo moznosti nicesar drugega kot nalaganje in zaganjanje binarnih izvrsljivih slik pomnilnika razen v primerih proizvajalceve dodane vrednosti vrnimo se se nekaj let v preteklost v cas ko je vec in vec ljudi ki so poganjali unixe na jedrih usg govorilo bin sh je zanic kot interaktivni uporabniski vmesnik hocem csh `` nekateri proizvajalci so dodali csh v njihove distribucije ceprav 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 skript csh vsekakor bi radi bili sposobni napisati moja skripta` in jo s tem pognati ceprav je to skripta za csh namesto da bi jo pognali skozi bin sh zelite da se skripta pozene takole execl bin csh csh c moja skripta char kaj pa vse tiste obstojece skripte nekatere od njih so deli sistemske distribucije ce se pozenejo skozi csh se bodo stvari kvarile potrebujete torej nacin da pozenete nekatere skripte skozi csh in nekatere druge skozi sh vpeljana resitev je bila da se popravi csh tako da pogleda prvi znak skripte ki jo zelite pognati ce je ta ` bo csh zagnal skripto skozi bin csh sicer bo pognal skripto skozi bin sh primer zgornje kode bi zdaj izgledal takole poskusi pognati program execl program basename program char klic exec je spodletel morda gre za skripto 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 else execl bin sh sh c program char oh ne g bill perror program return dve pomembni stvari prvic to je popravek lupine csh` v jedru se ni nic spremenilo in drugim ukaznim lupinam ni bilo nic dodano ce poskusate pognati skripto s klicem execl boste se vedno dobili napako enoexec pa naj se skripta zacne z znakom ` ali pa ne ce poskusate pognati skripto ki se zacne z znakom ` v cem drugem kot csh na primer v bin sh jo bo obravnaval sh ne csh drugic carovnija je v tem da se bodisi skripta zacne z ` ali pa se ne zacne z ` stvari kot so ` in bin sh` na zacetku skript dela carobne preprosto dejstvo da niso ` torej je vse to identicno ce je na zacetku skripte bin sh prazna vrstica usr games rogue echo hm sprasujem se pod katero ukazno lupino tecem v vseh teh primerih bodo vse ukazne lupine poskusale izvesti skripto z bin sh podobno tudi vse naslednje je identicno ce je na zacetku skripte bin csh bin csh bin sh hm sprasujem se pod katero ukazno lupino tecem vse te vrstice se zacnejo z znakom ` to pomeni da se bo skripta pognala le ce jo boste poskusali pognati iz csh sicer se bo pognala z bin sh opomba ce poganjate ksh zamenjajte v zgornjem besedilu sh`` s ksh`` kornova ukazna lupina je teoreticno zdruzljiva z bournovo torej poskusa sama pognati te skripte vase izkusnje so lahko drugacne z nekaterimi drugimi dostopnimi ukaznimi lupinami kot so zsh bash itd ocitno postane popravek za ` nepotreben ce 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 pobira stevilne lastnosti z berkeleya vkljucno s to nekateri proizvajalci sistemov system v release nadgrajujejo na nekatere bolj vidne dobrote v in vam poskusajo prepricati da je to dovolj in da ne potrebujete stvari kot so pravi delujoci tokovi ali dinamicno 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 zadrzeval diha med cakanjem nanjo naprej nazaj vsebina