el' chto-libo nedavno za svoim terminalom? Vremya modifikacii izmenyaetsya vyzovom write(2). Poetomu predstavlyaetsya razumnym, chto za- pis' na terminal budet imet' mesto, kogda drajver chitaet simvol, a za- tem posylaet ego obratno na ekran. Po mere togo, kak kto-to nazhimaet na klavishi, vremya modifikacii postoyanno obnovlyaetsya pri eho-otobrazhe- nii simvolov. Kogda simvoly perestayut postupat' s klaviatury, priosta- navlivaetsya zapis' v fajl terminala. Formula dlya opredeleniya posledne- go vremeni raboty za terminalom (last_activity) takova: last_activity = time(NULL) - mod_time, gde mod_time - vremya modifikacii. |ta formula zakodirovana vnutri ko- mandy who(1). Otmetim, chto vyzov komandy time so znacheniem NULL vozv- rashchaet istinnoe tekushchee vremya. Komanda activ ne imeet opcij. Esli vy ispol'zuete opcii, napecha- taetsya soobshchenie ob oshibke. POYASNENIYA V strokah 4-8 vypolnyaetsya proverka na nalichie oshibok. Esli chislo argumentov komandnoj stroki bol'she nulya, na standartnoe ustrojstvo re- gistracii oshibok vyvoditsya soobshchenie i programma zavershaetsya s neudach- nym statusom. Stroka 10 - eto komanda, vypolnyayushchaya vyvod. Komanda who vyzvana s opciej -u dlya polucheniya osnovnyh dannyh. Zatem ee vyhod po konvejeru peredaetsya komande cut, kotoraya otobrazhaet kolonki 1-17 i 38-42. Tem samym pechataetsya tol'ko tri polya, kak pokazano v nashem predydushchem pri- mere. ------------------------------------------------------------ IMYA: info ------------------------------------------------------------ info Vyvod na ekran informacii o parole pol'zovatelya NAZNACHENIE Pechataet informaciyu polya kommentariya iz fajla /etc/ passwd dlya ukazannogo pol'zovatelya. FORMAT VYZOVA info login_name [ login_name ... ] PRIMER VYZOVA info russ Pechataet informaciyu, kotoraya hranitsya o pol'zovatele russ TEKST PROGRAMMY 1 : 2 # @(#) info v1.0 Display password info on a user Author: Russ Sage 2a Otobrazit' parol'nuyu informaciyu pol'zovatelya 4 for NAME in $@ 5 do 6 USER=`grep "^${NAME}:" /etc/passwd` 7 echo "$NAME:\t`echo ${USER}|cut -d: -f6`\t` echo ${USER}|cut -d: -f5`" 8 done PEREMENNYE SREDY VYPOLNENIYA NAME Kazhdoe imya, ukazannoe v komandnoj stroke USER Polnaya zapis' v fajle /etc/passwd dlya dannogo imeni OPISANIE ZACHEM NAM NUZHEN KOMANDNYJ FAJL info? Sistema UNIX ispol'zuet konfiguracionnye fajly dlya hraneniya osnovnoj informacii o pol'zovatelyah i drugoj sistemnoj informacii. Od- nimi iz naibolee populyarnyh konfiguracionnyh fajlov yavlyayutsya /etc/group, /etc/passwd i /etc/inittab. Dlya polucheniya informacii o pol'zovatelyah nam neobhodimo zaglyanut' v eti fajly. V sisteme Berkeley imeetsya komanda finger, kotoraya poluchaet in- formaciyu o pol'zovatelyah iz ih registracionnyh katalogov i iz fajla parolej. V System V ne tak mnogo programm, vypolnyayushchih takogo roda ra- botu, poetomu nam neobhodimo razrabotat' ih. CHTO DELAET info? Info - eto komandnyj fajl, kotoryj poluchaet informaciyu iz regist- racionnogo kataloga i kommentarij o pol'zovatele iz fajla /etc/passwd. Rezul'tat vyglyadit tak: ------------------- | | name: home dir comments | imya: registracionnyj katalog kommentarii | Esli v vashej sisteme ispol'zuetsya eto pole kommentariev, to eta informaciya mozhet byt' poleznoj. "Vruchnuyu" vypolnit' prosmotr pol'zova- telej v fajle parolej mozhno sleduyushchim obrazom: grep login_name /etc/passwd Pri etom raspechatyvaetsya vsya stroka so vsemi polyami dannyh. Info beret eti neobrabotannye dannye i vydelyaet iz nih katalog registracii pol'zovatelya i pole kommentariya. V komandnoj stroke mozhno ukazat' neskol'ko registracionnyh imen. Kazhdoe imya beretsya po poryadku iz komandnoj stroki. PRIMER $ for NAME in `cat /etc/passwd | cut -d: -f1` > do > NAMELIST="$NAMELIST $NAME" > done; info $NAMELIST Imya kazhdogo pol'zovatelya v fajle parolej dobavlyaetsya k spisku imen. Zatem etot spisok peredaetsya v komandnuyu stroku info, kotoraya pechataet vse dannye. Smysl komandy: "Daj mne informaciyu obo vseh pol'- zovatelyah sistemy". POYASNENIYA Stroki 4-8 - eto cikl for, kotoryj obrabatyvaet vse imena, pere- dannye v komandnoj stroke. Dlya kazhdogo peredannogo imeni vypolnyayutsya stroki 6 i 7. V stroke 6 v peremennuyu USER zanositsya rezul'tat komandy grep, zaklyuchennoj mezhdu simvolami udareniya (`). Nachinaya s nachala stroki (oboznacheno simvolom ^), grep ishchet imya, za kotorym sleduet simvol dvo- etochiya (:). Takoe ukazanie zastavlyaet vypolnyat' poisk obrazca tol'ko v pervom pole fajla parolej. V stroke 7 my otobrazhaem nashu vyhodnuyu stroku komandoj echo, vnutri kotoroj vlozheny drugie komandy echo. My mogli by poluchat' ele- menty informacii otdel'no, prisvaivaya ih znacheniya otdel'nym peremen- nym, i zatem sozdavat' neobhodimyj format vyvoda, ispol'zuya znacheniya etih peremennyh. Odnako pomeshchenie vsej informacii v komandnuyu stroku rabotaet bystree, i tekst programmy bolee kompaktnyj, hotya i ne ochen' chitabel'nyj. My mozhem takzhe ispol'zovat' simvoly formatirovaniya v ko- mande echo dlya formatirovaniya nashej raspechatki. Snachala otobrazhaetsya imya v tom zhe vide, kak ono polucheno iz ko- mandnoj stroki. Zatem vyvoditsya tabulyaciya (\t). Za pervoj tabulyaciej sleduet pole nomer shest' iz fajla parolej. Poskol'ku my eshche ne imeem etih dannyh, my dolzhny vydelit' ih iz znacheniya peremennoj USER, koto- ruyu my uzhe imeem iz predydushchej stroki. CHtoby sdelat' eto, my komandoj echo vyvodim vsyu stroku i vydelyaem shestoe pole, ispol'zuya razdelyayushchie dvoetochiya. Posle etogo polya my vyvodim eshche odnu tabulyaciyu i zatem pya- toe pole fajla parolej. My poluchili eto pole takim zhe obrazom, kak i shestoe pole - eho-otobrazheniem i vydeleniem. Takaya tehnika polucheniya dannyh medlennaya, poskol'ku vovlecheny vse processy, no eto samyj bystryj put' sdelat' eto na yazyke shell. Koman- da awk byla by ponyatnee i, vozmozhno, bystree, no nasha realizaciya de- monstriruet gibkost' yazyka shell. YAzyk shell mozhet vypolnyat' pochti vse, no ne vsegda luchshim obrazom. Vot pochemu v nekotoryh sluchayah my ispol'zuem yazyk Si, v chem vy ubedites' po mere prodvizheniya po nashej knige. ----------------------------------------------------------- IMYA: uchk ----------------------------------------------------------- uchk Proverka processov, zapushchennyh drugim pol'zovatelem NAZNACHENIE Otobrazit' vse processy kazhdogo pol'zovatelya, ukazannogo v ko- mandnoj stroke FORMAT VYZOVA uchk [-a] login_name [...] PRIMER VYZOVA uchk -a Vyvod vseh processov, zapushchennyh administratorami TEKST PROGRAMMY 1 : 2 # @(#) uchk v1.0 Check processes of another user Author: Russ Sage 2a Proverka processov drugogo pol'zovatelya 4 trap "rm /tmp/ps$$ 2> /dev/null" 0 1 2 3 15 6 if [ $# -eq 0 ] 7 then echo "uchk: argument error" >&2 8 echo "usage: uchk [-a] login_name [ ... ]" >&2 9 exit 1 10 fi 12 if [ "`echo $1 | cut -c1`" = "-" -a "$1" != "-a" ] 13 then echo "uchk: invalid argument $1" >&2 14 echo "usage: uchk [-a] login_name [ ... ]" >&2 15 exit 1 16 fi 18 ADMIN="administrators names go here" 19 if [ "$1" = "-a" ] 20 then shift 21 set $ADMIN $@ 22 fi 24 ps -ef > /tmp/ps$$ 25 for NAME 26 do 27 echo 28 fgrep "$NAME" /tmp/ps$$ 29 done PEREMENNYE SREDY VYPOLNENIYA ADMIN Stroka s imenami pol'zovatelej, yavlyayushchihsya administratorami v vashej sisteme NAME Soderzhit kazhdoe imya, schityvaemoe iz komandnoj stroki OPISANIE ZACHEM NAM NUZHEN KOMANDNYJ FAJL uchk? Poskol'ku UNIX yavlyaetsya mnogopol'zovatel'skoj sistemoj, mnozhestvo zadach vypolnyayutsya odnovremenno. Edinstvennyj sposob sledit' za takimi zadachami - s pomoshch'yu komandy ps. Ps - eto dovol'no specifichnaya komanda v tom smysle, chto ona dolzhna obrashchat'sya k pamyati (/dev/mem) i proho- dit' po svyazannomu spisku struktur processa. |to tyazhelaya veshch', poetomu nelegko sdelat' svoyu sobstvennuyu komandu dlya vyvoda takogo roda infor- macii. Vdobavok pamyat' zashchishchena, i dostup k nej imeet tol'ko pol'zova- tel' root. Tak chto my dolzhny ili udovletvorit'sya opciyami, kotorye daet ko- manda ps, ili modificirovat' vyvod etoj komandy. Uchk skoree otnositsya k poslednej kategorii. Mne hotelos' poluchit' spisok sostoyanij pro- cessov po imeni pol'zovatelya, a ne smes' informacii, otnosyashchejsya k raznym pol'zovatelyam. Hotya to, chto ya hotel, ne sootvetstvuet ni odnoj iz standartnyh opcij komandy ps, ya smog modificirovat' ee vyhod dlya polucheniya togo, chto mne nado. CHTO DELAET uchk? Uchk - eto sredstvo, kotoroe generiruet, analiziruet i soobshchaet o processah, zapushchennyh kazhdym ukazannym pol'zovatelem. Za odin raz vy mozhete proverit' stol'ko pol'zovatelej, skol'ko vam nuzhno. Vse pro- cessy dlya kazhdogo pol'zovatelya pechatayutsya vmeste. CHtoby delat' eto, uchk dolzhen rabotat' s vremennymi fajlami. Sistema UNIX ves'ma elegantno upravlyaet vremennymi fajlami. Shell poz- volyaet ispol'zovat' identifikator processa dlya sozdaniya unikal'nyh imen fajlov dlya kazhdogo zapuska. Posle togo kak utilita zapushchena, vre- mennye fajly ochishchayutsya putem ispol'zovaniya komandy trap v shell'e. Ko- manda trap udalyaet fajl, esli chto-libo prervalo vypolnenie komandnogo fajla ili kogda programma zavershaetsya. |to prekrasnaya osobennost', ko- toraya isklyuchaet nakoplenie sluchajnyh fajlov v sisteme. Esli uchk byla vyzvana bez argumentov ili byla ispol'zovana nedo- pustimaya opciya, to pechataetsya soobshchenie ob oshibke i vypolnenie zaver- shaetsya. Uchk imeet peremennuyu ADMIN, kotoraya opredelyaet vseh administra- torov vashej sistemy. Otredaktirujte simvol'nuyu stroku, prisvaivaemuyu peremennoj ADMIN, ukazav imena administratorov, kotoryh vy hotite pro- verit'. Imena dolzhny byt' razdeleny probelami. |to pozvolit vam prove- ryat' processy vashih administratorov, ukazyvaya opciyu -a v komandnoj stroke. Vse ostal'nye imena dolzhny byt' ukazany v komandnoj stroke. Estestvenno, vy takim zhe obrazom mogli by ustanovit' drugie gruppy pol'zovatelej. Slezhenie za administratorami pomozhet vam ocenit', kak oni upravlyayut sohrannost'yu informacii, a takzhe raspoznat' administra- tivnye zadachi, kotorye imeyut sklonnost' zagruzhat' processor. PRIMER $ uchk -a russ uucp Pokazyvaet processy vseh administratorov, moi sobstvennye, i pro- cessy uucp po poryadku. Vse soobshcheniya ob oshibkah vyvodyatsya na standart- noe ustrojstvo registracii oshibok, a spiski processov vyvodyatsya na standartnoe ustrojstvo vyvoda. POYASNENIYA Stroka 4 - eto operator trap. Simvol'naya stroka mezhdu dvojnymi kavychkami soderzhit komandy, kotorye dolzhny byt' vypolneny, kogda pro- ishodit preryvanie. V etom sluchae my udalyaem vremennyj fajl i peread- resovyvaem vse vyhodnye dannye na nulevoe ustrojstvo. Kogda komanda rm pytaetsya udalit' nesushchestvuyushchij fajl, vyvodyatsya soobshcheniya ob oshibkah. Poskol'ku my ne znaem, kakie fajly mogut byt' v nalichii v tot moment, kogda vozniknet preryvanie, to my hotim izbavit'sya ot soobshchenij ob oshibkah. Operator trap aktiviziruetsya po vyhodu iz programmy (program exit, signal 0), razryvu linii (hangup, signal 1), preryvaniyu (interrupt, signal 2), vyhodu (quit, signal 3) ili programmnomu zaver- sheniyu (software termination, signal 15). V strokah 6-10 proveryaetsya, peredany li kakie-libo argumenty. Esli vy vyzvali uchk bez argumentov, vyvoditsya soobshchenie ob oshibke i uchk zavershaetsya. V strokah 12-16 proveryaetsya, ukazana li kakaya-to opciya so znakom minus i yavlyaetsya li ona opciej -a - edinstvenno dopustimoj opciej. Ko- mandnyj fajl delaet eto, primenyaya komandy proverki dlya sravneniya dvuh razlichnyh sluchaev. Pervaya proverka vyrezaet pervyj simvol pervogo po- zicionnogo parametra i smotrit, yavlyaetsya li on simvolom "-". Sleduyushchaya proverka delaetsya dlya togo, chtoby uvidet', chto pervyj pozicionnyj pa- rametr ne yavlyaetsya opciej -a. Poskol'ku obe proverki soedineny opera- ciej AND, to dlya polucheniya znacheniya "istina" oni obe dolzhny byt' istinnymi. Esli oni obe istinny, vyvoditsya soobshchenie ob oshibke i uchk zavershaetsya. Pochemu my dolzhny vypolnyat' takuyu slozhnuyu proverku? Problema v tom, chto u nas net inogo sposoba opredelit', yavlyaetsya pervyj pozicion- nyj parametr opciej ili net. On mozhet byt' opciej, a mozhet byt' ime- nem, kotoroe nuzhno iskat'. Takim obrazom, my dolzhny zadat' vopros: "YAvlyaetsya li eto opciej, i esli da, to dopustima li eta opciya?" V stroke 18 peremennaya ADMIN inicializiruetsya simvol'noj strokoj, sleduyushchej za nej. |to stroka, kotoruyu vy dolzhny modificirovat' v soot- vetstvii s vashej sistemoj. Vse, chto vy dolzhny sdelat' - eto ispol'zo- vat' redaktor vi i vstavit' v etu stroku imena administratorov, razde- lennye probelami. Nizhe my ispol'zuem peremennuyu ADMIN dlya obrabotki argumentov komandnoj stroki. V strokah 19-22 proveryaetsya, byla li ukazana v komandnoj stroke opciya -a. Esli da, eta opciya udalyaetsya iz komandnoj stroki s cel'yu iz- bavleniya ot nee. Stroka 21 ispol'zuet komandu set dlya togo, chtoby po- mestit' simvol'nuyu stroku ADMIN v pozicionnye parametry. Komanda set vstavlyaet znachenie peremennoj ADMIN, nachinaya s pervogo pozicionnogo parametra, i sdvigaet vse nastoyashchie parametry vpravo. Tem samym v cikl for peredaetsya mnozhestvo imen, kotorye dolzhny byt' obrabotany. V stroke 24 vypolnyaetsya komanda ps dlya vseh pol'zovatelej. |ta komanda ispol'zuet opciyu f dlya vyvoda bol'shogo kolichestva dannyh. Re- zul'tat pomeshchaetsya vo vremennyj fajl, v imeni kotorogo primenyaetsya identifikacionnyj nomer processa. |tot odin bol'shoj fajl predstavlyaet soboj istochnik dlya ostal'nyh raspechatok. Vozmozhno, vse eto nemnogo otstaet ot real'nogo vremeni, no programma vypolnyaetsya gorazdo byst- ree, chem pri mnogokratnom vyzove komandy ps. Stroki 25-29 predstavlyayut soboj cikl for, kotoryj vypolnyaetsya ot $1 do $x, gde x - poslednij pozicionnyj parametr. Dlya kazhdogo imeni vypolnyaetsya sleduyushchee: pechataetsya pustaya stroka dlya razdeleniya listin- ga (stroka 27), zatem komandoj fgreps (dlya uskoreniya) vybirayutsya iz vremennogo fajla vse processy, prinadlezhashchie dannomu pol'zovatelyu. Blagodarya primeneniyu komandy fgrep dlya kazhdogo imeni pol'zovatelya, vse processy dannogo pol'zovatelya pechatayutsya za odin raz. Kogda zakonchitsya proverka vseh imen, ukazannyh v komandnoj stroke, cikl zavershitsya, za- vershitsya komandnyj fajl i srabotaet operator trap, kotoryj udalyaet vre- mennyj fajl. ------------------------------------------------------------- IMYA: watch ------------------------------------------------------------- watch Nablyudenie za registraciej ukazannyh pol'zovatelej NAZNACHENIE Sledit za tem, kto rabotaet v sisteme, i soobshchaet o registracii ukazannyh pol'zovatelej. FORMAT VYZOVA watch [-k] [login_name ...] PRIMER VYZOVA watch Nablyudenie za registraciej vseh pol'zovatelej, ukazannyh vo vnutrennej peremennoj LIST TEKST PROGRAMMY 1 : 2 # @(#) watch v1.0 Watch for specific logins Author: Russ Sage 2a Nablyudenie za registraciej pol'zovatelej 4 if [ "`echo $1 | cut -c1`" = "=" -a "$1" != "-k" ] 5 then echo "watch: invalid argument $1" >&2 6 echo "usage: watch [-k] [login_name ...]" >&2 7 echo " -k kill background process" 8 exit 1 9 fi 11 if [ "$1" = "-k" ] 12 then if [ -s $HOME/.watch ] 13 then echo "killed `cat $HOME/.watch`" 14 kill `cat $HOME/.watch` 15 rm $HOME/.watch 16 exit 0 17 fi 18 fi 20 echo $$ > $HOME/.watch 22 LIST="root sys bin administrator1 administrator2 $*" 24 while : 25 do 26 for NAME in `who | cut -d" " -f1` 27 do 28 for PERSON in $LIST 29 do 30 if [ "$NAME" = $PERSON" ] 31 then echo ONLINE: $NAME 32 fi 33 done 34 done 35 sleep 10 36 done & PEREMENNYE SREDY VYPOLNENIYA HOME Polnyj marshrut k vashemu registracionnomu katalogu LIST Spisok imen pol'zovatelej sistemy, razdelennyh probelami NAME Soderzhit imena zaregistrirovannyh v nastoyashchij moment pol'zovatelej PERSON Otdel'noe imya iz spiska imen v peremennoj LIST OPISANIE ZACHEM NAM NUZHEN KOMANDNYJ FAJL watch? V techenie rabochego dnya mnozhestvo lyudej vhodyat v sistemu i vyhodyat iz nee. Inogda edinstvennyj sposob svyazat'sya s chelovekom - cherez mashi- nu. Nam nuzhno sredstvo, kotoroe avtomaticheski soobshchit nam, chto nuzhnoe lico na svyazi. CHTO DELAET watch? Podrazumevaetsya, chto watch yavlyaetsya fonovoj zadachej, kotoraya postoyanno sledit za tem, kto zaregistrirovalsya. Kogda lico ili lica, predvaritel'no vami otmechennye, registriruyutsya v sisteme, na vash ekran vyvoditsya soobshchenie o tom, chto oni na svyazi. Kolichestvo imen, za kotorymi vy mozhete sledit', ne ogranicheno. Obshchij perechen' imen - eto ob®edinenie imen, ukazannyh v komandnoj stroke, i spiska sistemnyh pol'zovatelej, t.e. pol'zovatelya root i vseh soprovozhdayushchih ego administratorov. V komandnom fajle watch spisok sistemnyh imen VSEGDA vklyuchen. |to vyzvano tem, chto eto vazhnye pol'zovateli i vy hotite vsegda znat' ob ih vhode v sistemu i vyhode iz nee. |to otlichaet watch ot uchk, poskol'ku poslednij trebuet ukaza- niya opcii -a dlya vklyucheniya spiska s sistemnymi imenami. Hotya my ustanavlivaem watch s tochki zreniya pol'zovatelya, kotoryj zhelaet sledit' za administratorami i drugimi pol'zovatelyami, administ- ratory tozhe mogut imet' spisok "kriticheskih pol'zovatelej" ili predpo- lagaemyh narushitelej zashchity informacii i ispol'zovat' watch dlya polu- cheniya signala o registracii takih pol'zovatelej. Za kem by my ni sledili, my stalkivaemsya s odnoj problemoj. Posle registracii v sisteme ukazannogo lica soobshchenie ob etom postupaet na vash ekran, ne obrashchaya vnimaniya na to, chem vy v dannoe vremya zanima- lis', chto ne ochen' priyatno. Edinstvennyj sposob ostanovit' vyvod soob- shcheniya - avarijno zavershit' watch komandoj kill. |to legko sdelat' pu- tem pomeshcheniya identifikatora etogo processa v fajl $HOME/.watch. Zatem etot nomer mozhet byt' ispol'zovan v operatore kill dlya ostanovki vy- polneniya komandnogo fajla. Dlya togo chtoby poproshche izbavit'sya ot watch, vozmozhnost' avarijnogo zaversheniya oformlena v vide opcii -k dannogo komandnogo fajla. PRIMERY 1. $ LIST="root bin" watch daemon Esli peremennaya LIST ne byla inicializirovana vnutri samogo ko- mandnogo fajla watch, to my mozhem inicializirovat' ee na komandnom urovne shell'a, a zatem vyzvat' watch. Spisok pol'zovatelej dlya watch budet takoj: root, bin i daemon po poryadku, poskol'ku watch dobavlyaet imena, ukazannye v ee komandnoj stroke k imenam, imeyushchimsya v peremen- noj LIST. Takoj sposob ukazaniya imen bolee gibok, chem zhestkoe program- mirovanie chasti spiska v tekste komandnogo fajla watch, no on trebuet pomnit' bol'she informacii i bol'she nuzhno nabirat' na klaviature. 2. echo "Watch (y/n): \c" read ANS if [ "$ANS" = "y" ] then watch fi |to fragment, kotoryj vy mozhete vstavit' v vash .profile. Kogda vy registriruetes', vam avtomaticheski predlagaetsya zapustit' watch. Esli vy otvetite "y", watch stanet fonovoj zadachej i zapustitsya po umolcha- niyu (prosmatrivaya pol'zovatelej soglasno spisku v peremennoj LIST). Esli budet vveden lyuboj simvol, otlichnyj ot y, watch ne zapustitsya. POYASNENIYA Stroki 4-9 vypolnyayut proverku na nalichie oshibok v opciyah komand- noj stroki. Dlya pervogo pozicionnogo parametra proveryaetsya, chto on imeet tire i ne yavlyaetsya edinstvennoj dopustimoj opciej "-k". Esli re- zul'tatom proverki yavlyaetsya istina, pechataetsya soobshchenie ob oshibke i komandnyj fajl zavershaetsya. Stroki 11-16 proveryayut, chto pervyj pozicionnyj parametr - eto -k. Esli eto tak, znachit pol'zovatel' hochet unichtozhit' uzhe zapushchennyj pro- cess watch. V etom sluchae vyvoditsya soobshchenie, ukazyvayushchee identifika- tor processa, kotoryj budet unichtozhen, i vypolnenie prodolzhaetsya. V stroke 12 my smotrim, sushchestvuet li v nashem registracionnom kataloge fajl s imenem .watch. Esli net, to eto oznachaet, chto predydushchij ek- zemplyar watch predpolozhitel'no uzhe unichtozhen i net neobhodimosti py- tat'sya sdelat' eto snova, poetomu proishodit perehod k ostavshejsya chasti programmy i vypolnenie watch proishodit tak, kak budto opciya "-k" ne byla ukazana. Esli zhe fajl .watch imeetsya, to v stroke 14 ispol'zuetsya komanda kill dlya unichtozheniya fonovogo processa watch. Napomnim, chto pri ispol'zovanii opcii -k my podrazumevaem, chto watch byl vyzvan ranee, poetomu fajl $HOME/.watch imeet identifikacionnyj nomer samogo pro- cessa watch. V stroke 15 udalyaetsya vremennyj fajl watch i v stroke 16 proishodit vyhod iz programmy. Teper' komandnyj fajl watch bolee ne vypolnyaetsya kak fonovyj. Stroka 20 vypolnyaetsya, esli opciya -k ne byla ukazana ili esli net fajla .watch. (Poslednee mozhet proizojti, esli pol'zovatel' pytaetsya unichtozhit' process, zabyv, chto on uzhe byl unichtozhen.) Esli opciya -k ne byla ukazana, my mozhem schitat', chto watch byl vyzvan, chtoby stat' fo- novym processom i vypolnyat' svoyu rabotu. Dlya togo chtoby sdelat' eto, tekushchij process otobrazhaet svoj identifikator processa v fajl .watch. |tot fajl ostaetsya v vashem registracionnom kataloge do teh por, poka on ne budet udalen vruchnuyu ili zhe izmenen putem povtornogo zapuska watch. V stroke 22 inicializiruetsya peremennaya LIST. Ee znacheniem yavlya- etsya simvol'naya stroka s imenami, razdelennymi probelami. Vam nuzhno vruchnuyu otredaktirovat' peremennuyu LIST pered zapuskom v vashej siste- me. Prosto uberite ee nyneshnee soderzhimoe i vstav'te tuda imena admi- nistratorov vashej sistemy. Esli v komandnoj stroke budut ukazany do- polnitel'nye imena pol'zovatelej, oni budut dobavleny v peremennuyu LIST posredstvom simvolov rasshireniya parametrov $*. Tem samym peremen- naya LIST stanet osnovnym spiskom vseh imen pol'zovatelej, za kotorymi budet vestis' nablyudenie. Stroki 24-36 vypolnyayut cikl postoyannogo nablyudeniya. V nachale kazh- doj iteracii s pomoshch'yu komandy who sozdaetsya spisok imen pol'zovate- lej, kotoryj peredaetsya ciklu for v stroke 26. Cikl for ispol'zuet ko- mandnuyu podstanovku dlya polucheniya spiska slov, obrazovannogo iz pervo- go polya komandy who. Kazhdoe zaregistrirovannoe imya sravnivaetsya so spiskom predvaritel'no opredelennyh imen, za kotorymi my nablyudaem. Obratite vnimanie, chto vneshnij cikl while sam sebya pomeshchaet na vypol- nenie v fonovom rezhime. |to oznachaet, chto vam net neobhodimosti vvo- dit' eto s klaviatury. Stroki 29-33 upravlyayut vnutrennim ciklom, kotoryj prohodit po imenam, soderzhashchimsya v nashem osnovnom spiske, i sravnivaet ih s imena- mi, poluchennymi ot komandy who. Kogda imya, poluchennoe ot komandy who (imya zaregistrirovannogo pol'zovatelya) sovpadaet s imenem v nashem spiske, na ekran vyvoditsya soobshchenie o tom, chto dannoe lico zaregist- rirovalos'. Posle togo kak vse imena provereny, komandnyj fajl watch priosta- navlivaetsya na 10 sekund (stroka 35). Kogda on snova probuzhdaetsya, vy- polnyaetsya sleduyushchaya iteraciya vechnogo cikla while. Vse zaregistrirovan- nye imena vnov' sravnivayutsya so spiskom. |to budet prodolzhat'sya do teh por, poka vy ne prekratite vypolnenie watch. Kak otmechalos' ranee, watch mozhno legko unichtozhit' s pomoshch'yu opcii -k ili zhe vruchnuyu putem vvoda komandy "kill `cat $HOME/.watch`". MODIFIKACII Watch vypolnyaet dovol'no malo raboty i ispol'zuet kakuyu-to chast' vremeni central'nogo processora. Vy mozhete poeksperimentirovat' s uve- licheniem intervala pauzy (sleep), chtoby watch zapuskalsya ne tak chasto. Bol'shinstvo pol'zovatelej nahodyatsya v sisteme po krajnej mere minutu, poetomu vy mozhete poprobovat' znachenie sleep(60). Vy po-prezhnemu mozhe- te obnaruzhit' registraciyu vseh interesuyushchih vas pol'zovatelej? --------------------------------------------------------------- IMYA: whox --------------------------------------------------------------- whox Komanda who s dopolnitel'nymi vozmozhnostyami NAZNACHENIE Predostavlyaet mnogo dopolnenij k vyhodu komandy who i pozvolyaet primenyat' dannye who dlya drugih prilozhenij. FORMAT VYZOVA whox [-f] [-n] [-m] [-p] [-t] [-w] [-x] gde -f ukazyvaet kazhdogo zaregistrirovannogo pol'zovatelya -n sortiruet vyhod komandy who po imenam -m peredaet pochtu kazhdomu pol'zovatelyu -p vyvodit informaciyu o parolyah pol'zovatelej -t sortiruet vyhod komandy who po vremeni (umolchanie) -w pokazyvaet vozmozhnost' zapisi na zaregistrirovannye terminal'nye ustrojstva -x dopolnitel'naya informaciya o registracionnom kataloge i parolyah PRIMER VYZOVA whox -w Pokazyvaet prava dostupa k fajlu (vozmozhnost' chteniya i zapisi) dlya kazhdogo zaregistrirovannogo terminal'nogo ustrojstva TEKST PROGRAMMY 1 : 2 # @(#) whox v1.0 Who with expanded options Author: Russ Sage 2a Komanda who s dopolnitel'nymi opciyami 4 XTRA="no" 5 SORT="sort -b +2" 6 DISPLAY="norm" 8 CUT1="cut -d' ' -f1" 9 CUT5="cut -d: -f5" 10 CUT6="cut -d: -f6" 12 for ARG in $@ 13 do 14 case $ARG in 15 -f) DISPLAY="finger" 16 COMMAND="finger \$NAME; echo";; 17 -n) SORT="sort";; 18 -m) DISPLAY="mail";; 19 -p) DISPLAY="pass" 20 COMMAND="grep \"^\$NAME:\" /etc/passwd";; 21 -t) SORT="sort -b +2";; 22 -w) DISPLAY="write";; 23 -x) XTRA="yes";; 24 *) echo "whox: invalid option $ARG" 25 echo "usage: whox [-f] [-n] [-m] [-p] [-t] [-w] [-x]" 26 echo " -f finger users" 27 echo " -n sort by name" 28 echo " -m mail to each user" 29 echo " -p password info on users" 30 echo " -t sort by time (default)" 31 echo " -w show writeability of devices" 32 echo " -x extra home dir and gcos info" 33 exit 1;; 34 esac 35 done 37 if [ "$XTRA" = "yes" ] 38 then EXTRA="| while read LINE; do \ 39 NAME=\`echo \$LINE | cut -d' ' -f1\`;\ 40 ENTRY=\`grep \"^\$NAME:\" /etc/passwd\`;\ 41 echo \"\$LINE\t\`echo \$ENTRY|\$CUT6\`\t\`echo \$ENTRY|\$CUT5\` \";done" 42 else EXTRA="" 43 fi 45 case $DISPLAY in 46 norm) eval "who | $SORT $EXTRA";; 47 finger|pass) for NAME in `who | $SORT | cut -d' ' -f1` 48 do 49 eval $COMMAND 50 done;; 51 mail) who | cut -d' ' -f1 | while read NAME 52 do 53 echo "mail to $NAME (y/n): \c" 54 KB=`line < /dev/tty` 55 if [ "$KB" = "y" ] 56 then mail $NAME < /dev/tty 57 fi 58 done;; 59 write) ls -il `who | sed "s/...........\(.......\).* /\/dev\/\1/"`;; 60 esac PEREMENNYE SREDY VYPOLNENIYA ARG Argumenty komandnoj stroki COMMAND Komanda, kotoruyu sleduet vypolnit' pri ispol'zovanii komandy who so spiskom imen CUT1 Soderzhit sintaksis dlya vydeleniya pervogo polya stroki CUT5 Soderzhit sintaksis dlya vydeleniya pyatogo polya stroki CUT6 Soderzhit sintaksis dlya vydeleniya shestogo polya stroki DISPLAY Opredelyaet, kakoj rezhim otobrazheniya ispol'zovat' ENTRY Zapis' v fajle parolej dlya ukazannogo pol'zovatelya EXTRA Dannaya peremennaya soderzhit polnyj cikl shell-komand, hranimyh v vide odnoj stroki KB Vhodnye dannye ot klaviatury, poluchennye v cikle NAME Soderzhit v kazhdyj dannyj moment vremeni odno imya iz spiska vseh registracionnyh imen SORT Soderzhit vypolnyaemyj tip sortirovki XTRA Flag, opredelyayushchij, dolzhny li byt' aktivizirovany dopolnitel'nye opcii OPISANIE ZACHEM NAM NUZHEN KOMANDNYJ FAJL whox? Kak uzhe ranee obsuzhdalos' v drugih mestah etoj knigi, sistema UNIX stremitsya obespechit' minimum vozmozhnostej v lyuboj zadannoj ob- lasti interesov. |to ne znachit, chto UNIX plohaya sistema. Naoborot, ona delaet gorazdo bol'she, chem bol'shinstvo drugih operacionnyh sistem. No ochen' chasto my hotim sdelat' nemnogo bol'she togo, chto nam predostavlya- et bazovaya sistema. Poluchenie informacii o tom, kto ispol'zuet mashinu, mozhet byt' primeneno dlya mnogih celej. Osnovnaya informaciya predostavlyaetsya koman- doj who, no ona mozhet byt' ne v tom vide, kotoryj vam nuzhen dlya konk- retnoj celi. V lyubom sluchae, vse, chto delaet komanda who - daet vam momental'nuyu informaciyu o tom, kto zaregistrirovalsya. Nam neobhodim nekotoryj sposob avtomaticheskogo dostupa k etomu spisku zaregistriro- vannyh imen i ispol'zovaniya ego dlya nablyudeniya, obshcheniya ili drugih ce- lej. CHTO DELAET whox? Whox - eto instrumental'noe sredstvo, rasshiryayushchee vozmozhnosti ko- mandy who. Ono ne tol'ko mozhet pereuporyadochit' v sootvetstvii s vashimi trebovaniyami spisok, poluchennyj ot komandy who, no takzhe mozhet ukazat' kazhdogo zaregistrirovannogo pol'zovatelya, peredat' pochtovoe soobshchenie lyubomu zaregistrirovannomu pol'zovatelyu, prosmotret' parol'nuyu infor- maciyu vseh zaregistrirovannyh pol'zovatelej i pokazat' informaciyu, vzyatuyu iz indeksnogo deskriptora fajla, sootvetstvuyushchego terminal'nomu ustrojstvu kazhdogo zaregistrirovannogo pol'zovatelya. Po umolchaniyu dejstvie whox zaklyuchaetsya v pechati obychnogo vyhoda komandy who v poryadke vremeni registracii ot bolee rannego do bolee pozdnego. Opciya -x dobavlyaet k etomu spisku informaciyu iz registraci- onnogo kataloga i pole kommentariya iz fajla parolej. Esli eta opciya -x kazhetsya vam znakomoj, to tak ono i est', poskol'ku eto to zhe samoe, chto i komanda info, predstavlennaya ranee. Whox imeet chetyre razlichnyh rezhima otobrazheniya. Pervyj eto format obychnogo vyhoda komandy who. Whox pozvolyaet vam sortirovat' ego dvumya raznymi sposobami. Opciya -n sortiruet po imenam, a opciya -t (kotoruyu ne nuzhno ukazyvat', poskol'ku ona ispol'zuetsya po umolchaniyu) sortiruet po vremeni registracii. Vtoroj rezhim otobrazheniya sostoit iz rezhimov ukazaniya i parolej, vklyuchaemyh opciyami -f i -p. Osnovnoe otlichie ot pervogo rezhima zaklyu- chaetsya v tom, chto vyhod komandy who ne pechataetsya, a ispol'zuetsya dlya generacii spiska imen pol'zovatelej, kotoryj primenyaetsya dlya drugih celej. My ukazyvaem kazhdogo pol'zovatelya ili pechataem parol'nuyu zapis' kazhdogo pol'zovatelya. Vypolnyaemaya komanda hranitsya v peremennoj, poe- tomu my mozhem imet' obshchij cikl, ispol'zuyushchij osobym obrazom peremen- nye. (Komanda finger imeetsya v sisteme Berkeley UNIX i v nekotoryh drugih, no ne vo vseh realizaciyah. Posmotrite rukovodstvo, chtoby vy- yasnit', chto vyvoditsya na ekran po etoj komande.) Tretij rezhim - eto pochtovyj rezhim, v kotorom vy imeete vozmozh- nost' posylki pochtovogo soobshcheniya kazhdomu zaregistrirovannomu pol'zo- vatelyu. Vam zadaetsya vopros o tom, dejstvitel'no li vy hotite sdelat' eto. Bol'she ot vas nichego ne trebuetsya. |tot rezhim vybiraet opciya -m. Poslednij rezhim - eto rezhim zapisi na terminal. Rezhim zapisi (op- ciya -w) pokazyvaet informaciyu o fajle terminala dlya kazhdogo zaregist- rirovannogo terminal'nogo ustrojstva. |ta informaciya polezna, esli vy hotite ispol'zovat' komandu UNIX'a write. Posmotrev na prava dostupa k fajlu ustrojstva pol'zovatelya, vy mozhete skazat', imeetsya li u vas vozmozhnost' zapisat' tekst na ego ekran. Nekotorye pol'zovateli, koto- rye ne hotyat, chtoby ih preryvali, zakryvayut pravo zapisi na ih termi- nal, vypolnyaya komandu "mesg n". Vopros o prave zapisi kasaetsya lyubogo sposoba posylki teksta v drugoj fajl, a ne tol'ko s ispol'zovaniem ko- mandy write. Pravo zapisi takzhe zashchishchaet ot takih veshchej, kak "echo hello > /dev/tty00". Sposob obrabotki argumentov v komandnoj stroke privodit k neskol'ko strannomu obrashcheniyu s dannoj utilitoj. Kazhdyj argument pro- veryaetsya po poryadku i ustanavlivaet vnutrennie flagi. Esli vy postavi- te v konce spiska kakuyu-libo opciyu, menyayushchuyu flag, ustanovlennyj odnoj iz predydushchih opcij, to vy poluchite dejstvie poslednej opcii. (Drugimi slovami, nekotorye opcii vzaimno isklyuchayut drug druga. Luchshij sposob izuchit' eto - vnimatel'no prochitat' ishodnyj tekst komandnogo fajla i vypolnit' neskol'ko eksperimentov s razlichnymi naborami opcij.) Naprimer, my hotim ukazat' kazhdogo pol'zovatelya. My ispol'zuem opciyu -f. Opciya -f ustanavlivaet v kachestve rezhima otobrazheniya rezhim ukazaniya. Esli my pomestim opciyu -w sprava ot -f, kak v komande "whox -f -w", to ustanovitsya rezhim zapisi na terminal. Komanda whox budet schitat', chto vy voobshche ne ukazyvali opciyu -f. Na samom dele eto ne predstavlyaet bol'shuyu problemu, esli vy znaete, chto delaet kazhdaya op- ciya. Sluchajno smeshivaya ih v odnoj komande, vy mozhete poluchit' neskol'- ko strannye vyhodnye dannye. PRIMERY 1. $ sh -x whox -x Zapusk interpretatora shell v otladochnom rezhime vypolneniya, poda- cha emu komandnogo fajla whox v kachestve dannyh, peredacha opcii -x dlya whox. Otladochnyj rezhim pokazyvaet prisvoenie znachenij peremennym i vy- zovy komand. (My videli eto ranee.) 2. $ whox -n -x Pechat' vyhodnyh dannyh komandy who, otsortirovannyh po imenam i vydacha dopolnitel'nyh dannyh. POYASNENIYA V strokah 4-10 vypolnyaetsya inicializaciya peremennyh. Peremennaya XTRA ustanavlivaetsya v znachenie "no". |ta peremennaya ispol'zuetsya dlya postroeniya komandnoj stroki pri ispol'zovanii opcii -x. Ustanovka XTRA v znachenie "no" oznachaet, chto dejstvie po umolchaniyu - ne poluchat' do- polnitel'nuyu informaciyu. Umolchaniem dlya sortirovki yavlyaetsya sortirovka po vremeni regist- racii. |to ukazyvaetsya sortirovkoj po kolonke, stoyashchej posle vtoroj (+2) i ignorirovaniem vedushchih probelov (-b) v stroke 5. Takoj zhe sin- taksis primenen nizhe s opciej -t. Opciya -t zdes' lishnyaya, no ona delaet bolee ponyatnoj komandnuyu stroku. Opciya -n takzhe izmenyaet sintaksis sortirovki, chtoby prosmatrivat' pervuyu kolonku, kotoraya yavlyaetsya spiskom imen. Stroka 6 inicializiruet obychnyj rezhim otobrazheniya, kotorym yavlya- etsya pechat' standartnogo vyhoda komandy who. Esli prisutstvuyut drugie opcii, sootvetstvenno izmenyaetsya peremennaya DISPLAY. Stroki 8,9 i 10 inicializiruyut nekotorye peremennye dlya komand vyrezki, chto delaet bolee kompaktnymi posleduyushchie komandy. Esli neko- torye komandnye stroki okazyvayutsya slishkom dlinnymi, vy mozhete po- mestit' nuzhnyj tekst v peremennye i podstavit' ih pri neobhodimosti. Peremennaya CUT1 vyglyadit tak, kak budto ona dolzhna rabotat', no ona ne rabotaet v moej sisteme. Pochemu ona ne rabotaet, ob®yasnyaetsya nizhe. Prosto zapomnite, chto eta stroka nikogda ne ispol'zuetsya v dannoj programme. My poka ostavlyaem ee, chtoby pogovorit' o nej pozzhe. Vy mo- zhete ubrat' ee, esli hotite. Stroki 12-35 obrabatyvayut argumenty komandnoj stroki. Cikl for podstavlyaet v peremennuyu ARG kazhdyj parametr po poryadku i vypolnyaet operator case po znacheniyu ARG. Esli opciej yavlyaetsya -f, stroka 15 izmenyaet peremennuyu DISPLAY v rezhim ukazaniya. Ona takzhe podstavlyaet v peremennuyu COMMAND komandu finger, kotoraya vypolnitsya v sleduyushchem cikle. Prichina, po kotoroj nam nuzhno imet' peremennuyu, soderzhashchuyu komandu, zaklyuchaetsya v tom, chto dannyj cikl yavlyaetsya obshchim ciklom, primenyaemym dlya dvuh raznyh celej. Dlya togo chtoby odin i tot zhe cikl spravilsya s dvumya razlichnymi zadacha- mi, my pomeshchaem eti zadachi v peremennuyu i vypolnyaem etu peremennuyu. |to znachitel'no sokrashchaet obshchee kolichestvo teksta, hotya privnosit ne- kotoruyu dopolnitel'nuyu rabotu. Obratite vnimanie v stroke 16, chto sim- vol $ ekranirovan v operatore prisvaivaniya. |to neobhodimo, ved' my hotim, chtoby peremennaya COMMAND soderzhala simvol'nuyu stroku $NAME, a ne znachenie, kotoroe imeet peremennaya NAME posle prisvaivaniya. Znache- nie NAME rasshifrovyvaetsya v cikle vo vremya ego vypolneniya. Stroka 17 obrabatyvaet opciyu -n. Vse, chto zdes' trebuetsya - izme- nit' sposob sortirovki vyhoda komandy who, chtoby otrazit' poryadok po imenam. Poskol'ku imya nahoditsya v pervoj kolonke vyhoda komandy who, a komanda sort sortiruet po umolchaniyu po pervoj kolonke, to ispol'zuetsya komanda sort bez opcij. Stroka 18 obrabatyvaet opciyu -m dlya peredachi pochtovyh soobshchenij. Zdes' my dolzhny izmenit' rezhim otobrazheniya na pochtovyj. Vse, chto nuzhno dlya etogo, nahoditsya v cikle mail, i ne trebuetsya inicializirovat' ni- kakie peremennye. Stroki 19 i 20 spravlyayutsya s opciej -p. Opciya parolej izmenyaet rezhim otobrazheniya na parol'nyj rezhim i ustanavlivaet komandu, kotoruyu my vyzyvaem, nahodyas' v obshchem cikle. V dannom sluchae my ispol'zuem ko- mandu grep dlya polucheniya parol'noj zapisi iz fajla /etc/passwd. Obra- tite vnimanie, chto v stroke 20 my ispol'zuem vnutrennie dvojnye kavych- ki. Dlya etogo my vynuzhdeny ekranirovat' ih simvolami obratnoj kosoj cherty. Napomnim, chto obratnaya kosaya cherta ispol'zuetsya dlya otmeny spe- cial'nogo znacheniya osobyh shell-simvolov. Stroka 21 upravlyaet opciej -t. Kak uzhe upominalos' ranee, opciya -t v dejstvitel'nosti ne trebuetsya v dannoj programme. Poskol'ku ona yavlyaetsya umolchaniem, trebuemye dlya nee dejstviya uzhe byli predprinyaty v nachale programmy - byla vypolnena tochno takaya zhe inicializaciya. Sin- taksis komandy sort tochno takoj zhe, kak i v stroke 5. Stroka 22 obrabatyvaet opciyu -w dlya pokaza vozmozhnosti zapisi v fajly terminalov. Edinstvennoe, chto nuzhno zdes' sdelat' - izmenit' re- zhim raboty terminala. Stroka 23 upravlyaet opciej -x. Poskol'ku dlya polucheniya dopolni- tel'noj informacii trebuetsya dovol'no slozhnaya inicializaciya, to my tol'ko ustanavlivaem v etom meste flag XTRA, pokazyvayushchij, chto my ho- tim vypolnit' etu inicializaciyu pozzhe. Stroka 24 - eto ulavlivatel' dlya obrabotki oshibok. Simvol * soot- vetstvuet lyubomu simvolu, kotoryj ne byl raspoznan ranee. Pechataetsya soobshchenie ob oshibke i sintaksicheskaya podskazka, i whox zavershaetsya. Stroki 37-43 ustanavlivayut peremennye, ispol'zuemye v opcii do- polnitel'noj informacii. Stroka 37 proveryaet, ustanovlena li peremen- naya XTRA v sostoyanie "yes", chto imeet mesto tol'ko togda, kogda v ko- mandnoj stroke imelas' opciya -x. Esli eto tak, to v peremennuyu EXTRA zanositsya mnogo vsyakih veshchej, kotorye my rassmotrim pozzhe. V protivnom sluchae v peremennuyu EXTRA zanositsya pustaya stroka, tak chto ona nikak ne proyavlyaetsya na stadii fakticheskogo vypolneniya. Peremennaya EXTRA zdes' ochen' vazhna i na samom dele delaet nebol'- shoj fokus. My sobiraemsya pomestit' v peremennuyu nekotoryj kod, trebue- myj dlya obrabotki opcii -x. Poskol'ku dopolnitel'naya informaciya, koto- ruyu my hotim poluchit', trebuet predvaritel'no nekotoroj obrabotki, to my pomeshchaem v peremennuyu nekotoryj komandnyj tekst. Kak tol'ko eta pe- remennaya nachinaet vypolnyat'sya, vypolnyaetsya i etot komandnyj tekst. |to pohozhe na makrokomandu, tol'ko ee tekst nahoditsya fakticheski v ispol- nyaemoj programme. Stroki 38-41 vstavleny vnutr' peremennoj EXTRA. |to sdelano putem vzyatiya v dvojnye kavychki vseh chetyreh strok. Vse special'nye simvoly, kotorye dolzhny byt' chast'yu dannyh v etoj peremennoj, dolzhny byt' ekra- nirovany simvolami obratnoj kosoj cherty. V stroke 38 v peremennuyu EXTRA zanositsya simvol konvejera (|) i nachalo cikla while. V konce stroki 38 imeetsya simvol kosoj cherty, ukazyvayushchij interpretatoru shell, chto prisvaivanie prodolzhaetsya posle simvola konca stroki (vozv- rata karetki ili perevoda stroki). Stroka 39 prisvaivaet peremennoj NAME znachenie polya, vyrezannogo iz dannyh, chitaemyh v cikle while. Napomnim, chto ves' dannyj operator pomeshchaetsya vnutr' peremennoj EXTRA. Kogda ya vyshe upominal, chto v stro- ke s peremennoj CUT1 est' problemy, to kak odno iz takih problemnyh mest ya imel v vidu imenno eto. Kogda ya popytalsya ispol'zovat' peremen- nuyu CUT1 v etom operatore vmesto ukazaniya komandy cut, shell ne smog pravil'no raspoznat' etot operator. Odinarnye kavychki, otmechayushchie sim- vol-razdelitel' dlya vyrezki, ne byli raspoznany. V rezul'tate komanda cut schitala, chto simvolom-razdelitelem yavlyaetsya simv