ske ili v drugoj smontirovannoj fajlovoj sisteme. Posle togo, kak fajl sko- pirovan, vydaetsya soobshchenie, kotoroe govorit o tom, kakoj fajl i kuda byl peredan. Udobno imet' v fajle protokola etu informaciyu, poskol'ku my imeem vozmozhnost' prosledit', kuda byli pereslany vashi skopirovannye fajly. Cikl find vypolnyaetsya do teh por, poka ne skopiruyutsya vse fajly v tekushchem segmente dereva. Napomnim, chto komanda find rekursivnaya, poeto- mu ubedites', chto vy ukazyvali ne bol'she derev'ev, chem vy hoteli. Esli vy ukazali "kopirovat', nachinaya s kornya (/)", to mozhet byt' peredan kazhdyj fajl, imeyushchijsya v sisteme. Kogda cikl for vypolnilsya, vneshnij cikl while idet k sleduyushchej iteracii. Kogda vse vhodnye dannye obrabo- tany, programma zavershaetsya. Nekotorye osobennosti uucp Kogda ispol'zuetsya uucp, v marshrute priemnika dolzhen byt' ustanov- len bit razresheniya vypolneniya ("x") dlya gruppy "others" (ostal'nye) dlya vseh promezhutochnyh katalogov, vedushchih k fajlu. |to budet vyglyadet' tak: --------x Samyj poslednij katalog dolzhen imet' prava dostupa vida "wx", chto- by uucp mogla pisat' fajl v katalog. Posle etogo vladel'cem fajla schi- taetsya uucp. Esli sobstvennikom fajla hotite byt' vy, skopirujte ego (ispol'zuya cp, a ne mv) s drugim imenem i on budet vashej sobstven- nost'yu. Esli vy pereimenuete ego komandoj mv, vy tol'ko izmenite imya, svyazannoe s tem zhe indeksnym opisatelem fajla (inode). No esli vy sko- piruete ego komandoj cp, vy sozdadite novyj otmechennyj opisatel' fajla. |tot novyj opisatel' fajla (sozdannyj vami) imeet vashi identifikator pol'zovatelya (uid) i identifikator gruppy (gid), poetomu vy vladeete im. Esli vy nahodites' v korne sistemy i kopiruete fajl (ispol'zuya cp, a ne mv) poverh drugogo sushchestvuyushchego fajla, informaciya v opisatele fajla ne izmenyaetsya, a menyayutsya tol'ko dannye, dostup k kotorym ukazyvaet opisatel' fajla. Kogda uucp ustanavlivaet predshestvuyushchie prava dostupa k fajlu na vseh promezhutochnyh katalogah takimi, chto vse imeyut pravo zapisi, poslednij katalog NE budet imet' zashchity. Predostavlenie lyubomu pol'zo- vatelyu prava zapisi oznachaet, chto kto ugodno mozhet udalit' ili izmenit' fajly v etom kataloge. Ne kazhdyj hochet davat' vsem eto pravo. Esli zhe vy kopiruete fajly v obychnuyu oblast' komandy uucp obshchego dostupa (/usr/spool/uucppublic/$LOGNAME), to vy dolzhny vnimatel'no sledit' za nimi. Mnogie sistemy imeyut zapuskaemye s pomoshch'yu cron programmy, proiz- vodyashchie v dannom kataloge poisk fajlov, k kotorym ne bylo dostupa v te- chenie opredelennogo kolichestva dnej, i udalyayut takie fajly - eto vredit vashim kopiyam. Esli period hraneniya bol'she, chem promezhutok mezhdu vashim kopirovaniem, u vas mozhet byt' vse v poryadke. Kak i mnogoe drugoe, eto zavisit ot vashih obstoyatel'stv i trebovanij bezopasnosti. Usovershenstvovaniya V originale fajl so spiskom marshrutov imeet argument TYPE v konce argumenta FROM, naprimer /usr/russ/bin/*. |to predstavlyaet problemu (krome togo, chto pokazyvaet, chto vash avtor eshche ne yavlyaetsya masterom!), potomu chto kogda simvol * budet vydelen, on budet rasshiren v imena vseh fajlov vmesto togo, chtoby traktovat'sya kak literal'nyj simvol. Prostoe reshenie - ispol'zovat' otdel'nye polya, chto i bylo sdelano. Masterskim resheniem yavlyaetsya ekranirovat' metasimvol dlya sohraneniya ego kak lite- ral'nogo simvola. Kak tol'ko simvol * budet vydelen iz marshrutnogo ime- ni, simvol \ predstavit ego v vide * vmesto togo, chtoby dat' ego na rasshirenie. Naprimer, mozhno napisat' tak: TYPE=`basename \"$FROM"` Zdes' simvol * prisvaivaetsya peremennoj TYPE, vmesto togo, chtoby prisvoit' TYPE spisok vseh fajlov, kotorye sootvetstvuyut metasimvolu. Zatem, kogda budet vyzvana komanda find, peremennaya TYPE dolzhna byt' ekranirovana tak, chtoby metasimvol interpretirovalsya ne komandnym pro- cessorom, a samoj komandoj find. 3.3.2. cpiobr - kopirovanie i vosstanovlenie fajlov v vide potoka dannyh ------------------------------------------------------------------- Imya: cpiobr ____________________________________________________________________ cpiobr Kopirovanie i vosstanovlenie v vide potoka dannyh komandoj cpio NAZNACHENIE Obespechivaet interfejs v vide menyu s komandoj cpio i udobstva pri kopirovanii i vosstanovlenii fajlov. Vyhodnye dannye na nositel' kopi- ruyutsya v vide potoka dannyh. FORMAT VYZOVA cpiobr Primer vyzova cpiobr Vyzyvaet glavnoe menyu dlya kopirovaniya, vosstanovleniya ili vydachi spiska fajlov Komandnyj fajl cpiobr 1 : 2 # @(#) cpiobr v1.0 Cpio stream backup and restore Author: Russ Sage 4 if [ "$#" -gt "0" ] 5 then echo "cpiobr: too many arguments" 6 exit 7 fi 9 while : 10 do 11 c 12 set `date` 13 echo " 15 $1, $2 $3 $4 17 Cpiobr Backup & Restore 18 ----------------------- 19 Backup to removable media 20 Restore from removable media 21 List files on media 22 Long list files on media 23 to exit 25 Press b,r,f,l or : \c" 27 read CMD 28 if [ "$CMD" = "" ] 29 then break 30 fi 32 ABORT=off 34 while : 35 do 36 echo " 38 Enter media type: 39 Raw System V floppy drive (/dev/rfp021) 40 Raw XENIX floppy drive (/dev/rfd0) 41 Tape drive (/dev/rmt0) 42 Any device (/dev/???) 43 to exit 45 Press s,x,t,a, or : \c" 47 read MEDIA 48 case $MEDIA in 49 s|S) DEV=/dev/rfp021 50 break;; 51 x|X) DEV=/dev/rfd0 52 break;; 53 t|T) DEV=/dev/rmt0 54 break;; 55 a|A) echo "enter full pathname (or <> to exit): \c" 56 read DEV 57 if [ "$DEV" = "" ] 58 then continue 59 else break 60 fi;; 61 "") ABORT=on 62 break;; 63 *) echo "cpiobr: invalid command \"$MEDIA\"";; 64 esac 65 done # while get media 67 if [ "$ABORT" = "on" ] 68 then continue 69 fi 71 case $CMD in 72 b|B) echo "\nEnter the source directory name: \c" 73 read SRC 74 cd $SRC 75 echo "\nPlace floppy in drive and hit ...\c" 76 read CMD 77 find . -print | sort | cpio -ocBv > $DEV 78 echo "\nhit \c" 79 read CMD 80 ;; 81 r|R) echo "\nEnter the destination directory name: \c" 82 read DEST 83 cd $DEST 84 echo "\nPlace floppy in drive and hit ...\c" 85 read CMD 86 cpio -icBvdmu < $DEV 87 echo "\nhit \c" 88 read CMD 89 ;; 90 f|F) cpio -icBt < $DEV 91 echo "\nhit \c" 92 read CMD 93 ;; 94 l|L) cpio -icBtv < $DEV 95 echo "\nhit \c" 96 read CMD 97 ;; 98 *) echo "cpiobr: invalid command \"$CMD\"" 99 ;; 100 esac 101 done Peremennye sredy vypolneniya ABORT Flag, opredelyayushchij, delat' li avarijnoe prekrashchenie CMD Komanda, poluchaemaya ot pol'zovatelya DEST Katalog-priemnik pri vosstanovlenii DEV Marshrutnoe imya ustrojstva nositelya MEDIA Hranit tip ustrojstva, kotoroe budet ispol'zovat'sya SRC Katalog-istochnik pri kopirovanii Opisanie Zachem nam nuzhen cpiobr? My uzhe poluchili predstavlenie ob udobstve i upravlenii kopirovani- em s pomoshch'yu komandy autobkp, no my eshche ne imeli dela s nestrukturiro- vannymi ustrojstvami. |to takie ustrojstva, kotorye ne soderzhat fajlo- vuyu sistemu, a prosto imeyut dannye, kotorye zapisany na nih v vide po- toka dannyh. V takom kachestve ispol'zuyutsya magnitnye lenty i inogda gibkie diski. Kak ukazyvalos' ranee, u vas mozhet otsutstvovat' diskovoe prostranstvo ili razmeshchennaya v drugom meste sistema dlya kopirovaniya v formate fajlovoj sistemy. Vmesto etogo vam mozhet potrebovat'sya ispol'- zovat' komplekt gibkih diskov ili magnitnuyu lentu. Dazhe esli u vas ime- yutsya drugie vozmozhnosti dlya kopirovaniya, mozhet nastupit' vremya, kogda kopiya na magnitnoj lente ili gibkih diskah mozhet byt' opravdana kak do- polnitel'naya mera predostorozhnosti, poskol'ku vposledstvii vy mozhete vosstanovit' lentu ili gibkie diski v drugom meste. Problema zaklyuchaetsya v tom, chto imeetsya shirokij nabor versij sin- taksisa komandy cpio dlya takogo kopirovaniya, kotorye zavisyat ot formata i ispol'zuemogo ustrojstva. Esli vy pereklyuchaete ustrojstva, vy dolzhny zapomnit' (ili dolzhny posmotret') sootvetstvuyushchij sintaksis. Odnim iz reshenij yavlyaetsya pryamoe ukazanie razlichnyh variacij komandy cpio v tekste programmy i vyzov ih v otvet na menyu, kotoroe prosto sprashivaet pol'zovatelya, kakogo tipa nositel' dolzhen byt' ispol'zovan. |to nash podhod pri napisanii cpiobr. Drugoe preimushchestvo sistemy menyu zaklyucha- etsya v tom, chto vy mozhete prisposobit' rutinnuyu rabotu po vypolneniyu takogo roda kopirovaniya dlya neopytnogo operatora ili kancelyarskogo ra- botnika, kotorym trebuetsya znat' tol'ko lish', kak montirovat' magnitnuyu lentu ili drugoj nositel' i otvechat' na voprosy menyu. CHto delaet cpiobr? Cpiobr - eto upravlyaemaya s pomoshch'yu menyu interaktivnaya utilita ko- pirovaniya i vosstanovleniya. Na samom dele eto interfejs s komandoj cpio sistemy UNIX. Funkcii, predostavlyaemye menyu, vklyuchayut kopirovanie faj- lov s zhestkogo diska na gibkij disk, vosstanovlenie fajlov s gibkogo diska na zhestkij disk, vydachu spiska imen fajlov, hranimyh na gibkom diske i vydachu spiska fajlov s neobyazatel'noj dopolnitel'noj informaci- ej (podobno ls -l). Gibkij disk zdes' yavlyaetsya pervichnym ustrojstvom naznacheniya, no mogut ispol'zovat'sya i drugie nositeli, takie kak mag- nitnaya lenta bol'shoj emkosti ili kassetnaya magnitnaya lenta (streamer). Posle vybora tipa operacii, kotoraya dolzhna byt' vypolnena, nuzhno vybrat' tip ispol'zuemogo ustrojstva. Utilita Cpiobr mozhet byt' ispol'- zovana na ustrojstvah sistemy UNIX firmy AT&T (/dev/fp021), ustrojstvah sistemy XENIX firmy IBM (/dev/fd0), strimernoj lente (/dev/rmt0) ili lyubom drugom ustrojstve po vashemu zhelaniyu (/dev/???). Obychno imya ust- rojstva opredelyaet tip ispol'zuemogo nositelya. Poskol'ku eta utilita prednaznachena dlya vseh mashin UNIX, nekotorye iz variantov mogut otsutstvovat' v vashej mashine, poetomu vy imeete pravo vybrat' lyuboe imya ustrojstva, kotoroe vam neobhodimo. Kak tol'ko imya ustrojstva vybrano i, esli vy vypolnyaete kopirova- nie ili vosstanovlenie, vam zadaetsya vopros, chto yavlyaetsya katalo- gom-istochnikom ili katalogom-priemnikom. Ukazhite imena katalogov, nachi- naya s vashego tekushchego kataloga ili absolyutnoe polnoe imya, nachinaya s kornya (/.), posle chego cpiobr perehodit v etot katalog i zatem ispol'- zuet otnositel'nye polnye imena s etogo mesta. Tem samym isklyuchayutsya lyubye problemy, svyazannye s tem, chto absolyutnoe polnoe imya stanovitsya chast'yu samoj kopii. Esli vy daete otnositel'noe polnoe imya, ubedites' v tom, chto ono nachinaetsya ot vashego tekushchego kataloga, chtoby cpiobr nachal rabotat' s nuzhnogo mesta v dereve fajlov. Kogda fajly kopiruyutsya na zhelaemyj nositel', marshrutnoe imya, pere- dannoe cpio, nachinaetsya s "/.". |to oznachaet, chto nikakogo prefiksa imeni kataloga na gibkom diske net. Poetomu pri vosstanovlenii fajlov obyazatel'no nuzhno dat' polnoe marshrutnoe imya. Vse fajly, postupayushchie s gibkogo diska, budut pomeshcheny pryamo v katalog-priemnik, kotoryj vy uka- zali cpiobr. Primery (Zdes' privodyatsya otvety na zaprosy glavnogo menyu, podmenyu i do- polnitel'naya informaciya, poyavlyayushchiesya v takom poryadke.) 1. b x $HOME Kopiruet fajly na gibkij disk sistemy XENIX, nachinaya s kataloga $HOME. 2. r a /dev/rmt0 $HOME Vosstanavlivaet fajly s ustrojstva, vybrannogo mnoj (/dev/rmt0, magnitnaya lenta), i pomeshchaet fajly v moj registracionnyj katalog. 3. l s Vydaet v shirokom formate informaciyu obo vseh fajlah, razmeshchennyh na gibkih diskah sistemy UNIX mashiny tipa PC. Poyasneniya V strokah 4-7 proizvoditsya proverka na nalichie oshibok uslovij vy- polneniya. Edinstvennaya oshibka uslovij vypolneniya - eto kogda vy ukazali kakie-libo argumenty cpiobr. Poskol'ku eto upravlyaemaya s pomoshch'yu menyu utilita, nikakih argumentov peredavat' ne nuzhno. Dlya togo, chtoby poluchit' obshchee predstavlenie o tom, kak eta utili- ta rabotaet, davajte podumaem nad tem, chto neobhodimo sdelat'. Vo-per- vyh, my dolzhny opredelit', kakoe dejstvie dolzhno byt' vypolneno. Polu- chiv etu informaciyu, nam neobhodimo uznat', kakoe ustrojstvo dolzhno ispol'zovat'sya. CHto, esli pol'zovatel' vvedet nevernyj vybor? Nam neob- hodimo ozhidat' v cikle do teh por, poka ne budet vvedeno pravil'noe znachenie. Posle polucheniya etih dvuh porcij informacii, nam nuzhno opredelit', gde iskat' ili kuda pomeshchat' fajly. Posle etogo my mozhem vypolnyat' cpio. Dlya vypolneniya etogo scenariya nam nuzhno vsego dva cikla: po odnomu dlya kazhdoj stadii vvoda. V dannom sluchae my ispol'zuem dva cikla tipa "vechnyj cikl while". Dlya vyhoda iz ciklov my ispol'zuem komandu komand- nogo processora break, kotoraya vyvodit nas iz tekushchego cikla. Nemnogo pozzhe my uvidim nalichie problemy pri takom podhode. Osnovnoj, samyj vneshnij upravlyayushchij cikl nachinaetsya so stroki 6 i zakanchivaetsya v poslednej stroke programmy - stroke 87. Cel'yu etogo vneshnego cikla yavlyaetsya upravlenie vypolneniem programmy v celom, polu- chenie opcij menyu ot pol'zovatelya i okonchatel'nyj vyhod, kogda pol'zova- tel' soobshchaet, chto on zakonchil rabotu. Konechno, vy mozhete po-prezhnemu vyjti iz programmy pri pomoshchi obychnogo simvola preryvaniya, no samo menyu imeet klyuch vyhoda (CR). Gorazdo luchshe predstavlyat' yavnyj klyuch, osobenno dlya neopytnyh pol'zovatelej. Nachinaya so stroki 11, my ustanavlivaem ekran dlya glavnogo menyu. Komandoj zdes' yavlyaetsya "c", chto budet poyasneno pozzhe v etoj knige. Ona sootvetstvuet "ochistke ekrana" i mozhet byt' zamenena standartnoj koman- doj ochistki sistemy UNIX, kotoruyu vy mozhete ispol'zovat' v etom meste, esli hotite. Stroka 12 ustanavlivaet v pozicionnye parametry vyhodnye dannye komandy date sistemy UNIX. Takoj sintaksis dostatochno redko vstrecha- etsya, no tem ne menee ochen' polezen. Esli by my ne hoteli delat' eto takim obrazom, my by dolzhny byli perehvatit' vse vyhodnye dannye koman- dy date v odnoj peremennoj, zatem razdelit' ih na melkie porcii i po- mestit' kazhduyu porciyu v otdel'nuyu peremennuyu. |to potrebovalo by namno- go bol'she komand i peremennyh v programme. Ispol'zuya nash sintaksis, my zastavlyaem pervyj pozicionnyj parametr byt' pervym polem vyhodnyh dan- nyh komandy date, vtoroj pozicionnyj parametr byt' vtorym polem i tak dalee. Dlya polucheniya lyubogo ukazannogo polya my ispol'zuem zapis' vida $n, gde n est' nomer pozicionnogo parametra. Stroki 13-25 - eto odin ogromnyj operator echo, kotoryj pechataet glavnoe menyu. Vydacha vsego neobhodimogo odnim operatorom echo predpoch- titel'nee, poskol'ku eto minimiziruet nakladnye rashody, s kotorymi prihoditsya stalkivat'sya pri vypolnenii bol'shogo chisla operatorov. Takoj put' bystree. Esli by my ispol'zovali operator echo dlya kazhdoj stroki glavnogo menyu, to ono pechatalos' by ochen' medlenno i preryvisto. Koman- da UNIX cat takzhe mogla by byt' primenena dlya etogo sluchaya, ispol'zuya zdes' dokumenty (vstavlennyj tekst). V kachestve primera etogo mozhet sluzhit' sleduyushchee: cat <<-EOF Main Menu Information EOF Odnako glavnaya problema voznikaet, kogda vy pechataete priglashenie. Dlya togo, chtoby kursor ozhidal vvoda v konce stroki priglasheniya, neobho- dimo vydat' na terminal simvol "\c", a cat ne mozhet sdelat' etogo. Vy vyvodite na ekran menyu s pomoshch'yu cat, i echo pechataet priglashenie, ko- toroe napravlyaetsya na druguyu sdvinutuyu stroku polnost'yu zapolnennogo ekrana. Postoyanstvo i skorost' - vot chego my dobivaemsya. Obuchenie takim tryukam eshche bol'she pomozhet vam pri napisanii programm bol'shogo razmera, kotorye ispol'zuyut mnozhestvo menyu i drugie tekstovye vyvody na ekran. Ispol'zovanie operatora echo v takom vide imeet nekotorye ne- dostatki, no oni sovershenno trivial'nye. Vo-pervyh, telo operatora echo dolzhno soderzhat' vse, chto vy hotite vyvesti na ekran, i eto trebuet absolyutnogo pozicionirovaniya vnutri operatora echo dlya polucheniya simvo- lov probela v nuzhnyh mestah. Obychno pri takom pozicionirovanii imeetsya sdvig strok v tekste programmy, poetomu vizual'no v tom meste komandno- go fajla, gde vyvoditsya menyu, poyavlyaetsya etot sdvig, no posle menyu stroki snova idut rovno. |to mozhet nemnogo smushchat' pri chtenii teksta programmy. Drugoj nesushchestvennoj detal'yu yavlyaetsya to, chto operator echo ne lyubit vyvodit' simvoly tabulyacii. Esli zhe vy vstavili simvol tabulyacii vnutri kavychek operatora echo, on obychno vyvoditsya kak probel. Dlya to- go, chtoby zastavit' echo vyvodit' simvoly tabulyacii, vy dolzhny skazat' eto operatoru echo na ego sobstvennom yazyke s pomoshch'yu simvolov "\t" ili \\t, esli bez kavychek. Poetomu menyu v cpiobr zapolneno simvolami probe- la. |to takzhe pozvolyaet legko sdvigat' menyu vlevo i vpravo pri pomoshchi nebol'shogo kolichestva probelov dlya sootvetstvuyushchego pozicionirovaniya na ekrane. Odnim iz spornyh voprosov yavlyaetsya mesto, gde menyu dolzhny poya- vit'sya na ekrane. Global'noe vyravnivanie po levomu krayu vyglyadit uzhasno, no centrirovanie narushaetsya pri vydache na ekran kakogo-libo soobshcheniya (naprimer, ot cpio). V dannom sluchae sdelano vyravnivanie ne po centru, a po levomu krayu. Neplohim kompromissom mozhet byt' otstup na tri-pyat' pozicij ot levogo kraya. Kak i v bol'shinstve sluchaev, kogda de- lo idet ob estetike, vy mozhete s etim ne soglasit'sya. Vernemsya k nashemu menyu. Dlya togo, chtoby sdelat' menyu na ekrane i bolee estetichnym, i informativnym, na ekran vyvodyatsya data i vremya. (Zamet'te, chto glavnoe menyu ochishchaetsya kazhdyj raz pered ego ispol'zova- niem.) Primer vida ekrana priveden nizhe. --------------------------------------- | Sreda, maj 28 13:18:49 | | Cpio - Sohranenie/vosstanovlenie fajlov | --------------------- | Kopirovanie dannyh | Vosstanovlenie dannyh | Spisok fajlov na nositele | Polnyj spisok fajlov na nositele | dlya vyhoda | | Nazhmite b,r,f,l, ili : V levom verhnem uglu raspolozhen den' nedeli, mesyac, den' mesyaca. |to polya 1, 2 i 3 komandy date. V pravom verhnem uglu raspolozheno teku- shchee vremya. |to pole 4 komandy date. Vse eti dannye privodyatsya dlya togo, chtoby menyu na ekrane smotrelos' krasivo, bylo ravnomerno zapolneno i informativno. Posle togo, kak menyu vydano na ekran, stroka 27 chitaet komandu pol'zovatelya. Zametim, chto odin iz klyuchej vyzyvaet zavershenie program- my, esli byl nazhat tol'ko vozvrat karetki. Kakim obrazom my proveryaem eto? My zaklyuchaem v kavychki vhodnuyu peremennuyu takim obrazom, chto pro- verka raspoznaet nulevoe znachenie (sm. stroki 28-30). Esli byl vveden nol', my vyhodim iz tekushchego cikla while. Tem samym my popadaem v konec programmy, kotoraya posle etogo zavershaet vypolnenie. Esli vhodnoe zna- chenie ne bylo ravno nulyu, my prodolzhaem i vypolnyaem v sleduyushchej komande proverku na nalichie oshibki. V stroke 32 provoditsya inicializaciya peremennoj ABORT putem sbrasyvaniya ee. |to budet detal'no poyasneno pozzhe. A sejchas my tol'ko skazhem, chto eta peremennaya sushchestvuet, poskol'ku imeetsya konflikt mezhdu tem, kak vypolnyaetsya komanda break, i strukturoj dannoj programmy (t.e. polnost'yu upravlyaemoj s pomoshch'yu menyu utility). V strokah 34-65 razmestilsya vlozhennyj cikl while, kotoryj obraba- tyvaet podmenyu. Prichina, po kotoroj my ispol'zovali cikly tipa "vechnyj while" zaklyuchaetsya v tom, chto oni vypolnyayutsya, poka ne poluchat nuzhnoe vhodnoe znachenie. Kak tol'ko polucheny pravil'nye vhodnye dannye, my vy- hodim iz cikla. |to ochen' prostoj sposob obrabotki menyu. V strokah 36-45 my snova ispol'zuem operator echo dlya vydachi na ekran polnogo podmenyu. |to menyu zaprashivaet imya ustrojstva, kotoroe ispol'zuetsya v komandah kopirovaniya/vosstanovleniya. Stroka 47 chitaet vhodnye dannye ot pol'zovatelya v peremennuyu MEDIA. Znachenie peremennoj MEDIA zatem ocenivaetsya v operatore case. Obratite vnimanie, chto shablony sravneniya vklyuchayut simvoly i v verhnem, i v nizhnem registre. |to oblegchaet zhizn' pol'zovatelya i delaet nemnogo bolee logichnym programmirovanie, umen'shaya chislo proverok na oshibki, ko- toroe my dolzhny proizvesti. Takzhe zamet'te, chto kazhdyj obrazec zakanchi- vaetsya operatorom break. Kogda obnaruzheno dopustimoe vhodnoe znachenie, my zhelaem prodolzhat' vypolnenie posle konca operatora while, chto osu- shchestvlyaetsya operatorom break. Peremennaya DEV teper' ustanovlena kak marshrut k vybrannomu ustrojstvu. Klyuch "a" v strokah 55-60 trebuet dal'nejshej obrabotki. Pol'zova- tel' zaprashivaetsya ob imeni ustrojstva, kotoroe on vybral. Esli pol'zo- vatel' zabyl imya ili reshil ne ispol'zovat' etot klyuch, on mozhet vvesti vozvrat karetki, kotoryj raspoznaetsya kak nul' i privodit k vypolneniyu operatora continue. |to vyzyvaet vypolnenie sleduyushchej iteracii tekushchego cikla, kotoraya snova vyvodit podmenyu. Eshche odin vozvrat karetki posle etogo mozhet ispol'zovat'sya dlya vyhoda iz podmenyu i vozvrata v glavnoe menyu. V protivnom sluchae, esli pol'zovatel' vvel nenulevoe znachenie, vypolnyaetsya operator break, i cikl menyu zavershaetsya, imeya marshrut, uka- zannyj v peremennoj DEV. Esli pol'zovatel' vvel nevernoe znachenie, pechataetsya soobshchenie ob oshibke i podmenyu vyvoditsya snova. Zamet'te, chto vvod tol'ko vozvrata karetki v podmenyu ustanavlivaet peremennuyu ABORT v "on". Pochemu eto tak? Teper' my podoshli k toj chasti, gde yazyk komandnogo processora nep- rimenim dlya nashego sluchaya. Scenarij vyglyadit primerno tak. My nahodimsya v podmenyu. My reshaem, chto ne budem zdes' proizvodit' vybor, poetomu my hotim vyjti iz podmenyu i vernut'sya v glavnoe menyu (ili v predydushchee me- nyu). Esli my vyjdem iz cikla while podmenyu, my popadem vo vneshnij cikl while i prodolzhim obrabotku zaprosami o kataloge-istochnike i katalo- ge-priemnike. Esli my popytaemsya reshit' etu problemu putem ispol'zovaniya opera- tora "break 2", my vyjdem iz oboih ciklov while (popadaya v samyj niz programmy) i programma zavershitsya, nichego ne sdelav dlya nas. Snova ne to, chto my hotim. CHto my dejstvitel'no hotim, tak eto vyjti iz tekushchego (vnutrennego) cikla i prodolzhit' sleduyushchuyu iteraciyu vo vneshnem cikle dlya polucheniya glavnogo menyu. Net nikakoj vozmozhnosti skazat' komandnomu processoru ob etom, poetomu my sozdali peremennuyu v kachestve flaga dlya imitacii etogo dejstviya i nazvali ee ABORT. Esli my ustanavlivaem pere- mennuyu ABORT v sostoyanie "da", to my NE zhelaem prodolzhat' rabotu s ko- mandoj glavnogo menyu, a hotim prekratit' ee i vernut'sya v glavnoe menyu. Na samom dele eto oznachaet prodolzhit', poetomu v strokah 67-69 proverya- etsya imenno eto. Esli flag ABORT ustanovlen, podmenyu prinuditel'no za- vershaetsya i operator continue zastavlyaet snova pechatat' glavnoe menyu vmesto togo, chtoby pytat'sya vypolnit' kakuyu-to napolovinu opredelennuyu operaciyu kopirovaniya. V stroke 71 my poluchaem dlya proverki komandu glavnogo menyu i in- formaciyu, neobhodimuyu dlya ee obrabotki. CHetyr'mya osnovnymi komandami yavlyayutsya kopirovanie, vosstanovlenie, vydacha spiska fajlov i vydacha spiska fajlov s polnoj informaciej. Esli vvedena kakaya-to drugaya koman- da, vydaetsya soobshchenie ob oshibke i glavnoe menyu snova vyvoditsya na ek- ran. Edinstvennyj sposob vyhoda iz glavnogo menyu - eto nazhat' vozvrat karetki bez kakogo libo-teksta pered nim i stroka 28 pozvolit vyjti iz cikla. Komandy kopirovaniya i vosstanovleniya ispol'zuyut otnositel'noe ime- novanie. Snachala oni trebuyut ukazat' katalog, zatem perehodyat v etot katalog. Operator echo i "holostoe" chtenie peremennoj CMD prosyat pol'- zovatelya vstavit' disketu (ili smontirovat' magnitnuyu lentu ili eshche chto-nibud') i nazhat' vozvrat karetki, kogda vse gotovo. V sluchae kopirovaniya dlya poiska VSEH fajlov, razmeshchennyh v dereve fajlov, nachinaya s tekushchego kataloga, ispol'zuetsya komanda find. Opera- tor find vydaet otsortirovannyj spisok fajlov, poetomu fajly na nosite- le s kopiej otsortirovany. Zatem otsortirovannyj spisok fajlov pereda- etsya po kanalu komande cpio s opciyami -ocBv. |to oznachaet: "potokovyj vyvod, ispol'zovat' simvol'nye zagolovki, bloki razmerom po 5K, s vyda- chej soobshchenij". Pri etom pechatayutsya imena fajlov po mere togo, kak oni kopiruyutsya na nositel'. V sluchae operacii vosstanovleniya ispol'zuyutsya klyuchi -icBvdmu. |to znachit "potokovyj vvod, ispol'zovat' simvol'nye zagolovki, bloki po 5K, s vydachej soobshchenij dlya pechati imen fajlov po mere ih vosstanovleniya, sozdavat' katalogi pri neobhodimosti, fajly sohranyayut ishodnuyu datu mo- difikacii, i vse fajly bezuslovno kopiruyutsya". Esli dolzhen byt' vydan tol'ko spisok fajlov, to klyuchami budut ili -icBt dlya pechati tablicy skopirovannyh fajlov (eto sootvetstvuet zapisi komandy cpio "ls"), ili -icBtv dlya pechati tablicy fajlov s bolee pod- robnoj informaciej ("ls -l" v zapisi dlya cpio). V konce vypolneniya kazhdoj komandy glavnogo menyu vydaetsya soobshchenie hit (Nazhmite ) |to sdelano po toj prichine, chto kogda pechataetsya glavnoe menyu, ono ochishchaet ekran. Esli by vy hoteli poluchit' spisok fajlov, kak opisano vyshe, i ne zavershit' rabotu, to napechatalsya by spisok, vypolnenie dostiglo by vneshnego operatora "done", vneshnij cikl snova startoval by i ekran ochistilsya by pered novoj vydachej na nego glavnogo menyu. Uf, na- konec poyavilsya spisok, dazhe do togo kak |velin Vud s vysshim obrazovani- em smogla prochitat' eto! Dlya togo, chtoby zaderzhat' ochistku ekrana, my ozhidaem nazhatie na klavishu. CHto by ni bylo vvedeno, ono chitaetsya v pe- remennuyu i snova nikogda ne ispol'zuetsya. |to prosto holostaya peremen- naya. Zamechaniya po operacii kopirovaniya Vy mozhete proizvodit' kopirovanie fajlov mnogimi putyami, no davaj- te rassmotrim nekotorye otlichiya mezhdu komandami cpio i tar. Pervona- chal'no komandoj kopirovaniya v UNIX byla komanda tar. |ta utilita sozda- niya kopii na magnitnoj lente byla prednaznachena dlya vedeniya arhivov na magnitnoj lente i vypolneniya samogo kopirovaniya. Ona rabotaet, no imeet nekotorye osobennosti. Vo-pervyh, kazhdyj fajl, pomeshchaemyj na lentu (ili kakoj-libo nositel', kotoryj vy ispol'zuete), vyravnivaetsya na granicu kilobajta. |to oznachaet, chto esli vash fajl sostoit iz odnogo bajta, ko- manda tar vydelyaet minimum 1K vashemu fajlu, chto mozhet privesti k znachi- tel'noj rastrate prostranstva, esli u vas mnogo nebol'shih fajlov i vy kopiruete ih na magnitnuyu lentu. Odnako komanda tar imeet takzhe ryad neplohih aspektov. Naprimer, vy mozhete skazat' ej, kakoj mnozhitel' blokirovki vy ispol'zuete i naskol'ko velik obraz kopii, tak chto vy mozhete razbit' bol'shie kopiruemye potoki dannyh na mnogo melkih chastej (naprimer k=360 dlya gibkih diskov nizkoj plotnosti v sisteme XENIX). Odnim iz strannyh aspektov komandy tar yavlyaetsya to, chto kopiya yavlyaetsya odnim dlinnym i nepreryvnym potokom, a pri vosstanovlenii ispol'zuetsya unikal'nyj for- mat dlya kazhdogo nositelya. Naprimer, vy dolzhny, skazhem, skopirovat' 10M dannyh. Vam luchshe imet' dostatochno otformatirovannyh gibkih diskov i prigotovit' ih do togo, kak vy nachnete kopirovat' komandoj tar. Kogda disketa zapolnitsya, vy dolzhny prervat' vypolnenie komandy i zatem snova prodolzhit'. Primer takoj komandy mog by vyglyadet' tak: cd $HOME tar cvefbk /dev/fd048ds9 18 360 . Zdes' ukazano, chto trebuetsya skopirovat' VSE fajly (rekursivno ob- hodya derevo sverhu vniz) iz tekushchego kataloga (.) v fajl na ukazannom ustrojstve, so mnozhitelem blokirovki 18 K i razmerom obraza kopii 360 Kbajt. Odnim iz interesnyh aspektov zdes' yavlyaetsya to, chto kogda koman- da tar rekursivno prohodit vniz po derevu, ona poluchaet imena fajlov v poryadke raspolozheniya opisatel' fajla, chto obychno NE sovpadaet s otsor- tirovannym poryadkom. Vy NE MOZHETE poluchit' otsortirovannyj spisok faj- lov dlya kopirovaniya komandoj tar, esli tol'ko ne sdelaete eshche odnu toch- nuyu kopiyu vseh dannyh, kotorye vy hotite skopirovat' i ne razmestite opisatel' fajla v otsortirovannom poryadke. Kak eto sdelat'? Vot tak: cd $HOME find . -print | sort | cpio -pdv /bkpsort Pri etom poluchitsya novaya kopiya vseh vashih dannyh i imena fajlov razmestyatsya v otsortirovannom poryadke. Esli posle etogo vy perejdete v katalog /bkpsort i vypolnite komandu tar, fajly budut pereneseny na nositel' v otsortirovannom poryadke. Predpolozhim, chto dlya vypolneniya kopirovaniya trebuetsya 15 disket. Pri vosstanovlenii etogo polnogo nabora vy dolzhny vvodit' privedennuyu nizhe komandu 15 raz, poskol'ku na kazhdom iz gibkih diskov raspolagaetsya unikal'nyj obraz kopii. tar xvf /dev/fd048ds9 Takie povtornye vvody komandy razdrazhayut, no oni mogut oblegchit' zhizn', chto my vskore i uvidim. Komanda cpio yavlyaetsya sleduyushchim pokoleniem komand kopirovaniya. Ee obshchie funkcii podobny funkciyam komandy tar, no imeetsya neskol'ko vazhnyh otlichij. Vo-pervyh, vy dolzhny sgenerirovat' spisok fajlov dlya cpio, chto oznachaet ispol'zovanie komandy find dlya porozhdeniya spiska. Poskol'ku my mozhem konvejerom propustit' spisok, poluchennyj ot komandy find, cherez komandu sort, nam net neobhodimosti delat' eshche odnu kopiyu vseh nashih fajlov dlya polucheniya otsortirovannogo spiska. Dalee, komanda cpio ne vypolnyaet vyravnivanie granicu kilobajta. Ona pakuet vse dannye nepreryvno i imeet magicheskoe chislo v zagolovke dlya ukazaniya nachala kazhdogo novogo fajla. V komande cpio takzhe net uka- zaniya razmera obraza na nositele. Kak ona eto uznaet? Drajver ust- rojstva dolzhen opredelit' razmer i poslat' sootvetstvuyushchij signal ob- ratno komande cpio, kotoraya posle etogo priostanavlivaetsya i predlagaet vstavit' sleduyushchuyu disketu. |to vse prekrasno do teh por, poka vy ne popadaete v sistemu, v kotoroj drajvery uzhasny, kak v sisteme XENIX. Drajvery XENIX ne raspoznayut, kogda nuzhno ostanovit'sya i prodolzhayut vy- polnyat' rabotu i posle togo, kak dostignut konec gibkogo diska. Prog- ramma cpio dolzhna byla by vypolnyat'sya odinakovo na vseh sistemah, no ona ne rabotaet korrektno na mashinah s sistemoj XENIX. Odno sushchestvennoe razlichie mezhdu komandami cpio i tar zaklyuchaetsya v poluchayushchemsya obraze kopii. Poskol'ku cpio ne razlichaet granic mezhdu razlichnymi nositelyami (disketami), fajly poluchayutsya razorvannymi mezhdu dvumya gibkimi diskami. |to znachit, chto kogda vy pytaetes' kopirovat' s etih 15 disket, to oni yavlyayutsya ODNIM nepreryvnym potokom vhodnyh dan- nyh, tochno tak, kak i posledovatel'nyj potok vyhodnyh dannyh pri sozda- nii etoj kopii. CHto proizojdet, esli disketa nomer 2 povreditsya? VSE vashi fajly posle vtoroj diskety stali bespolezny. Vy prosto poteryali ves' vash obraz kopii. Poskol'ku tar kopiruet v vide otdel'nyh obrazov, kogda disketa nomer 2 poteryaetsya, vy vse ravno mozhete kopirovat' s disket 3-15 bez problem. Eshche odin prekrasnyj aspekt komandy cpio zaklyuchaetsya v tom, chto ona mozhet rabotat' kak v formate fajlovoj sistemy, tak i v potokovom forma- te. Format fajlovoj sistemy (opciya -p) obrashchaetsya k blochnym ust- rojstvam, takim kak zhestkij disk, a potokovyj format obrashchaetsya k nest- rukturirovannym ustrojstvam (opcii -i i -o), takim kak magnitnaya lenta ili gibkij disk s formatom nizkogo urovnya. Cpio - eto prekrasnaya utili- ta dlya ispol'zovaniya ee pri kopirovanii fajlovyh derev'ev sistemy na zhestkom diske. Kak zhe upravlyaetsya s etim sistema 4.2 BSD? V techenie mnogih let primenyalas' komanda tar dlya peresylki tuda i obratno, kak opisano na stranicah rukovodstva po tar(1). Ne samyj elegantnyj podhod, no rabo- tosposobnyj. Sejchas oni imeyut klyuch -r (dlya rekursivnogo obhoda dereva sverhu vniz) dlya obychnoj komandy cp. YA zhe po-prezhnemu schitayu, chto ko- manda cpio luchshe. 3.4. Sredstva proverki operacij kopirovaniya 3.4.1. dsum - kontrol'nye summy dvuh katologov ------------------------------------------------------------- Imya: dsum _____________________________________________________________ dsum Kontrol'naya summa dvuh katalogov NAZNACHENIE Vydaet na ekran vyhodnye dannye komandy sum sistemy UNIX dlya dvuh kopij fajlov iz dvuh raznyh katalogov v odnoj stroke. |to pozvolyaet bystro vizual'no ocenit', odinakovo li soderzhanie fajlov i mozhet byt' ispol'zovano dlya proverki kopii. FORMAT VYZOVA dsum [-c|-o] control_dir backup_dir Primer vyzova dsum $HOME/bin /mnt Prosmatrivaet, byli li kakie-libo fajly izmeneny pri kopirovanii iz moego registracionnogo kataloga na gibkij disk, smontirovannyj v ka- taloge /mnt. Komandnyj fajl dsum 1 : 2 # @(#) dsum v1.0 Dual directory sum Author: Russ Sage 4 if [ $# -lt 2 -o $# -gt 3 ] 5 then echo "dsum: invalid argument count" >&2 6 echo "usage: dsum [-c|-o] control_dir backup_dir" >&2 7 echo " -c = C source files, -o = object files" >&2 8 exit 1 9 fi 11 case $# in 12 2) FLIST=*;; 13 3) case $1 in 14 -c) FLIST=*.c;; 15 -o) FLIST=*.o;; 16 *) echo "dsum: invalid argument $1" >&2 17 echo "usage: dsum [-c|-o] control_dir bacup_dir" >&2 18 exit 1;; 19 esac 20 shift;; 21 esac 23 for FILE in $1/$FLIST 24 do 25 BASEF=`basename $FILE` 26 if [ `expr $BASEF : '.*'` -lt 7 ] 27 then echo "`$BASEF: \t'`sum $FILE | cut -d' ' -f1`\t\c" 28 else echo "$BASEF:\t`sum $FILE | cut -d' ' -f1`\t\c" 29 fi 30 sum $2/$BASEF | cut -d' ' -f1 31 done Peremennye sredy vypolneniya BASEF Soderzhit bazovoe imya fajla iz polnogo marshrutnogo imeni FILE Soderzhit imya kazhdogo proveryaemogo fajla FLIST Soderzhit ukazanie na tip proveryaemyh fajlov Opisanie Zachem nam nuzhen dsum? V srede razrabotki programm vsegda imeetsya massa fajlov. |ti fajly soderzhat vse: ishodnyj kod, peremeshchaemye moduli, ob®ektnyj kod, dannye, teksty. Drugim aspektom sredy razrabotki programm yavlyaetsya to, chto eti fajly obychno rassypany po mnogim razlichnym mashinam (ili gruppam mashin, mozhet byt' i takoj sluchaj). V etom sluchae vsegda kazhetsya, chto imeetsya ochen' mnogo peremeshchenij fajlov: eti fajly peredayutsya iz odnoj sistemy na druguyu, nekotorye modificiruyutsya, peresylayutsya obratno i tak dalee. Pohozhe na to, kak v armii royut yamy: vy delaete eto, potomu chto vam pri- kazano. Kogda vy peremeshchaete mnogo fajlov, to kakoj put' yavlyaetsya luchshim dlya togo, chtoby garantirovat' sebe (ili komu-libo eshche), chto vypolnennaya vami kopiya yavlyaetsya TOCHNO takoj, kak i original? Esli vy vnesli oshibku v pervonachal'nuyu kopiyu, zatem rasprostranili etu oshibku na mnogie kopii ili dazhe zapisali vmesto originala modificirovannuyu kopiyu, to vy mozhete nikogda ne vernut'sya v pervonachal'noe sostoyanie. Odnim iz sposobov slezheniya za kopiyami yavlyaetsya ispol'zovanie ko- mandy sum. |ta komanda chitaet dannye i vyvodit chislo, yavlyayushcheesya razno- vidnost'yu kontrol'noj summy. Drugimi utilitami UNIX, kotorye delayut chto-to podobnoe, yavlyayutsya cmp dlya sravneniya ob®ektnyh fajlov i diff dlya obnaruzheniya razlichij v tekstovyh fajlah. Avtor privyk dumat', chto sum budet soobshchat' ob otlichii dazhe v od- nom bite (svoego roda ciklicheskaya izbytochnaya proverka), no eto okaza- los' sovsem ne tak. Nedavno imelsya 35 Kbajtnyj fajl, soderzhashchij v vide dlinnogo formata spisok fajlov, kotorye dolzhny byli byt' skopirovany. V dejstvitel'nosti, tam byli dva fajla, odin iz kotoryh byl otsortirovan, a drugoj net. Oni byli odnogo razmera, i sum vydala odno i to zhe chislo dlya oboih fajlov. Kogda zhe cmp sravnila eti dva fajla, okazalos', chto 39-e bajty otlichayutsya. Kak my mozhem ob®yasnit' tot fakt, chto sum rassmatrivala eti dva fajla kak sovershenno odinakovye? Vozmozhno, sum svernula eti dva fajla takim obrazom, chto kontrol'naya summa okazalas' odinakova, dazhe hotya odin iz fajlov byl otsortirovan, a drugoj net. |to znachit, chto sum na samom dele ne vypolnyaet kontrol'nuyu prover- ku kazhdogo bita. Tol'ko proverka algoritma raboty programmy v ishodnom module pozvolit ubedit'sya v etom. Konechno, v bol'shinstve sluchaev, esli fajl otlichaetsya ot originala, to eto ne yavlyaetsya prostoj perestanovkoj dannyh, tak chto sum vse-taki polezna. CHto