------------------------------------------------------------ Nazvanie: otod --------------------------------------------------------------------- otod Vos'merichnye v desyatichnye Naznachenie: Perevodit vhodnye vos'merichnye chisla v vyhodnye desyatichnye. Sintaksis: OCT="octal_number"; DEC = '.otod' Primer vyzova $OCT="777" ; $DEC='.ot $echo $DECod' Prisvoit' OCT vos'merichnoe chislo, preobrazovat' ego v desyatichnoe, napechatat' rezul'tat. Ishodnyj tekst dlya otod 1 : 2 # @(#) otod v1.0 Preobrazovanie yazyka shell--vos'merichnye v desyatichnye Avtor: Russ Sage - 9 - bc < idfile Komanda ls zapuskaetsya kak dochernij shell, ispol'zuya oboznachenie (). Dochernij shell pomeshchaetsya v fonovyj rezhim, ispol'zuya simvol & . Kogda rezul'tat processa id otobrazhen, on napravlyaetsya v fajl oshibok dochernego yazyka shell, kotoryj ego vypolnyaet. My prosto perenapravlya- em standartnuyu oshibku v fajl i poluchaem chislo! Teper' my mozhem sde- lat' chto-nibud' tipa: $ kill -9 'cat idfile' gde process id, peredannyj kill, generiruetsya iz komandy cat, kotoraya pechataet process id, zahvachennyj ranee. |to mozhet dat' programmam opciyu "kill self", gde oni mogut otslezhivat' ih id, chtoby vam ne prishlos' eto delat'. Programma watch, kotoruyu my videli v glave 6 delaet nechto podobnoe. Vstroennyj vvod Redaktor vi udoben do teh por, poka Vam ne nuzhno delat' postrochnoe redaktirovanie teksta ili redaktirovanie v komandnom rezhime. Sed tozhe neplohoj redaktor, no v nem ne predusmotrena vozmozhnost' peremeshcheniya po fajlu. Sed mozhet peremeshchat'sya tol'ko vpered po fajlu do konca fajla. Vse nashi problemy mozhet reshit' skromnyj redaktor ed. S redaktorom ed Ed yavlyaetsya interaktivnym redaktorom i v nem est' vse neobhodimoe dlya obrabotki vyrazhenij. Poskol'ku on chitaet standartnyj vvod dlya svoih komand, my mozhem pomeshchat' v stdin vstroennyj tekst dlya - 12 - upravleniya sobstvenno redaktorom. Ed chitaet komandy, kak esli by oni byli dany s klaviatury. On ne znaet, chto zapushchen v komandnom rezhime. |to otkryvaet sovershenno novyj sposob ispol'zovaniya moshchi interaktivnogo redaktirovaniya v komandnom rezhime. V kachestve primera rassmotrim sleduyushchuyu programmu. Pomnite, chto vse special'nye simvoly v yazyke shell dolzhny byt' zaklyucheny v kavych- ki, naprimer $. Esli oni ne zaklyucheny v kavychki, to vvod budet nekor- rektnym. ed file << -! 1, \$s/^ *// w q ! V etom primere redaktiruetsya fajl pod nazvaniem "file" i nad nim vypolnyaetsya neskol'ko komand. Pervaya komanda govorit "Ot pervoj stroki do poslednej, dlya kazhdoj stroki, imeyushchej pustye simvoly v nachale stroki, za kotorymi sleduet lyuboe kolichestvo takih zhe simvolov, zamenit' eti simvoly "nichem". Zapishite fajl i vyjdite." |ta procedura udalyaet probely iz nachala stroki. S fajlom a.out Vozmozhnost' vstroennogo teksta takzhe mozhno ispol'zovat', chtoby avtomatizirovat' zapusk programm. Vam nuzhno zapisat' vhodnye dannye, neobhodimye, chtoby programma vypolnyala zhelaemuyu zadachu, i pomestit' ih v tekst programmy. (|to nechto vrode postroeniya makrosov klaviatury dlya prikladnyh programm dlya PC). V sleduyushchem primere ispolnyaemyj fajl a.out zapuskaetsya kak dochernij shell. Ego vvod beretsya iz samogo fajla, a vyvod peredaetsya komande more, tak chto my mozhem sdelat' postranichnyj vyvod. $ (a.out < text > input > lines > ! ) | more |to mozhno napechatat' neposredstvenno s klaviatury. My ispol'zuem simvoly skobok, poskol'ku, esli neposredstvenno pechatat' etot kod, shell budet vydavat' podskazku PS2 vplot' do znaka !, zatem vypolnit komandu. Edinstvennoe, chto my mozhem sdelat', chtoby on ne vyshel avtomaticheski - eto prodolzhat' zaprashivat' vvod, opuskaya ego na uroven' nizhe. C arhivami yazyka shell Arhivy yazyka shell - eto odin iz samyh prostyh sposobov upako- vat' tekst v samoustanavlivayushchuyusya programmu. Ideya sostoit v tom, chto my ispol'zuem komandnyj fajl yazyka shell, chtoby upakovat' nekotoryj tekst. |tot tekst mozhet byt' dokumentom, komandnym fajlom ili dazhe ishodnym tekstom programmy. My ispol'zuem konstrukciyu vstroennogo teksta, chtoby peredat' tekst v shell, kotoryj potom peresylaet ego v predopredelennye fajly. Nizhe priveden primer arhiva, kotoryj mozhet byt' v fajle. $ cat archive - 13 - # # |to arhivnyj fajl tekstovyh fajlov 1, 2 i 3 # echo "izvlekaem tekstovyj fajl 1" cat > text1.sh << ! # # |to primer tekstovogo fajla 1 # who | sort ! echo "izvlekaem tekstovyj fajl 2" cat > text2 << ! |to soderzhimoe vtorogo fajla. |to ne programma, a prosto tekst. Zamet'te, chto emu ne nuzhno strok kommentariya, potomu chto zapushchennyj shell znaet, chto eto vvod. No ne pytajtes' zapuskat' text2, t.k. u Vas vse ravno nichego ne poluchitsya. ! echo "izvlekaem tekstovyj fajl 1" cat > text3.c << ! /* |to soderzhimoe fajla 3, Si programma */ main() { printf("hello world"); } ! # # konec arhivnogo fajla # Pri vypolnenii arhiv prohodit cherez tri komandy cat. Pervaya ko- manda cat sozdaet fajl text1.sh (komandnyj fajl yazyka shell), text2 (obychnyj tekst) i text3.c (Si-programma). Vse eto vypolnyaetsya posle togo, kak Vy naberete na klaviature "archive". |to udobno, esli nuzhno perenesti tekst v drugoe mesto. Vmesto togo chtoby peresylat' tri faj- la, nam nuzhno pereslat' odin. Vmesto treh fajlov, soedinennyh vmeste, u nas tri otdel'no upakovannnyh fajla, kazhdyj iz kotoryh vosstanavli- vaet sebya pri zapuske arhiva. Takim obrazom, nam ne pridetsya gadat', pytayas' predstavit' kakoj tekst v kakoj fajl popadet. Upravlenie statusom cikla Inogda uslovnye vyrazheniya cikla nuzhno podbirat' special'nym obrazom, chtoby oni otvechali nashim potrebnostyam. |to proishodit ne chasto, odnako byvayut situacii, kogda Vy mozhete zahotet' ispol'zovat' opredelennyj sintaksis. V tablice 10-1 privedeny tri raznyh sposoba sdelat' uslovie cikla while "istinnym". Pomnite, chto shell ishchet uspeshnyj status vyhoda - status (0) iz poslednej sinhronno vypolnyaemoj komandy. Tablica 10-1 Sposoby zastavit' cikl byt' "istinnym" +--------------+----------------------------------------+ | Cikl | Uslovie so znacheniem "istina" | - 14 - +--------------+----------------------------------------+ |while true |True - eto komanda v /bin, kotoraya voz-| | |vrashchaet status 0 | |while[1 -eq 1]|My ispol'zuem zdes' testovuyu komandu, | | |chtoby vozvratit' status 0 | |while : |My ispol'zuem vstroennoe predlozhenie | | |shell'a, chtoby vozvratit' status 0 | +--------------+----------------------------------------+ Fil'try i sintaksis Ranee v etoj knige uzhe shla rech' o fil'trah. Ne vse komandy yavlyayutsya fil'trami ili mogut byt' ispol'zovany v kachestve fil'trov. Vspomnite opredelenie fil'tra - eto komanda, kotoraya beret vvod iz argumentov komandnoj stroki, esli oni est'. Inache vvod chitaetsya iz standartnogo vvoda. Pochemu vse komandy ne mogut dejstvovat' kak fil'try? Potomu, chto oni ne prednaznacheny dlya etogo. Voz'mem, naprimer, ls. CHto delaet ls? Ona vydaet spisok fajlov v tekushchem kataloge. Esli my govorim "ls file", on vydaet informaciyu tol'ko dlya etogo fajla. Esli my govorim "echo file | ls", ls ne daet informaciyu o fajle, no vydaet spisok fajlov v tekushchem kataloge, potomu chto ls ne smotrit v standartnyj vvod, esli v komandnoj stroke net argumentov. Odin vazhnyj moment, svyazannyj s fil'trami - eto sposob ih vyzova. Esli Vy pomeshchaete imya fajla v komandnuyu stroku, fil'tr otkryvaet fajl i chitaet dannye. Pomnite, chto fil'try hotyat chitat' dannye. Esli Vy prisoedinyaete standartnyj vvod k fil'tru, on dumaet, chto to, chto on chitaet iz programmnogo kanala- eto dannye. Esli Vy dadite fil'tru imena fajlov, Vy ne poluchite togo rezul'tata, kotoryj ozhidaete. Davajte rassmotrim neskol'ko primerov. Komanda UNIX wc - eto fil'tr. My mozhem vyzyvat' ee kak "wc file1 file2 file3", chtoby ona podschitala slova v treh fajlah. CHto bylo by, esli by my skazali: "ls file1 file2 file3 | wc" ? Wc podschitala by summu simvolov, kotorye vydala by ls. V dannom sluchae v stroke file1, file2, i file3 - 15 simvolov. Kak nam poluchit' real'nye fajlovye dannye, a ne imena fajlov v wc? Izmenyaya sposob, kotorym my vyzyvaem wc: cat file1 file2 file3 | ws Putem predvaritel'nogo soedineniya fajlov, dannye peredayutsya na vhod wc, i wc summiruet podschitannye summy simvolov, soderzhimogo fajlov. Ta zhe samaya koncepciya primenima dlya vseh komand fil'trov. Eshche odnoj podobnoj komandoj yavlyaetsya awk. My mozhem skazat' "awk file", i komanda prochitaet soderzhimoe fajla, ili "cat file | awk", i poluchim takoj zhe rezul'tat. My ne mozhem ispol'zovat' sintaksis "ls file | awk", t.k. awk vypolnyaet svoyu programmu tol'ko nad simvolami v imeni "file". Nedostatki/osobennosti programmirovaniya na yazyke shell V etom razdele my rassmotrim nekotorye nedochety yazyka shell. Do konca poka ne yasno, pochemu proyavlyayutsya eti defekty ili osobennosti. Tak uzh shell rabotaet i takoj uzh on na samom dele. Programma dlya perenapravleniya oshibki 1 : 2 # @(#) perenapravlenie oshibochnogo znacheniya peremennoj v cikl, prisoedinennyj k programmnomu kanalu 3 4 N=1 5 echo "nachal'noe znachenie N = $N" 6 7 echo "1\n2\n3" | while read LINE 8 do 9 N=2 10 echo "znachenie v cikle N = $N" 11 done 12 13 echo "konechnoe znachenie N = $N" Programma pokazyvaet, chto razlichnye prisvoeniya, sdelannye v do- chernih yazykah shell, ne rasprostranyayutsya na ih roditelej. Stroka 4 prisvaivaet N nachal'noe znacheni 1. Zatem znachenie N otobrazhaetsya v stroke 5 dlya proverki. Vsya hitrost' etoj programmy zaklyuchena v stroke 5. My otpravlyaem simvoly "1 novaya stroka 2 novaya stroka 3" v prog- rammnyj kanal i daem eto na vhod ciklu while. Takim obrazom, my zastavlyaem cikl vypolnit' tri iteracii. Prisoedinyaya vyvod k programm- nomu kanalu, my sozdaem dochernij shell, chtoby vypolnit' cikl while. Vnutri cikla while my izmenyaem znachenie N i pechataem ego dlya prover- ki. V konce cikla my pechataem okonchatel'noe znachenie N. Ono bol'she ne ravno 2 kak eto bylo vnutri cikla, a ravno 1, kak eto bylo posle pervogo prisvoeniya. Nizhe predstavlen primer progona etoj programmy. $ redir nachal'no znachenie N = 1 znachenie v cikle N = 2 znachenie v cikle N = 2 znachenie v cikle N = 2 konechnoe znacheni N = 1 |to pokazyvaet, chto znachenie peremennoj peredaetsya vniz dochernemu yazyku shell, no izmeneniya v dochernem shell ne peredayutsya roditel'sko- mu. Nekorrektnyj kod vozvrata Otkuda shell znaet, yavlyayutsya li korrektnymi te ili inye kody vozvrata? Na eto slozhno otvetit'. Inogda okazyvaetsya, chto kod oshibochen, kogda oshibku soderzhit vasha programma. Naprimer: 1 : 2 # @(#) oshibka koda vozvrata 3 4 echo "Vvedite komandu : \s" 5 read CMD 6 7 eval $CMD 8 echo "\$? = $?" 9 10 if [ $? -eq 0 ] 11 then echo horoshij vyhod - $? 12 else echo plohoj vyhod - $? 13 fi Programma nachinaetsya s togo, chto v stroke 4 Vam vydaetsya podskazka dlya vvedeniya komandy. Komanda chitaetsya, stroka 7 ocenivaet ne trebuyutsya li ej dopolnitel'nye peremennye i vypolnyaet ee. Pomnite, chto nam nuzhno ocenit' parametr v tom sluchae, esli kto-nibud' skazal chto-to tipa "echo $HOME". Esli komandy eval net, to pechataetsya - 16 - literal'naya stroka $HOME. Posle komandy eval pechataetsya dejstvitel'noe znachenie $HOME. Tak chto nam prihoditsya ispol'zovat' komandu eval v etoj situacii. Posle togo kak komanla vypolnena stroka pechataet status vyhoda, ssylayas' na $?. |to sovershenno normal'no. Stroka 10 zatem ispol'zuet testovuyu komandu, chtoby programma razvetvilas' v zavisimosti ot koda vozvrata. |to i est' to mesto, gde oshibka. Velichina, kotoruyu vidit testovaya komanda ne sovpadaet s toj, kotoruyu pechataet eho. $ status vvedite komandu: ls -z ls : illegal option --z usage : -1ACFRabcdfglmnopqrstux [files] $? = 2 horoshij vyhod - 0 |to pokazyvaet, chto ls zapustili v oshibochnom rezhime. Ls napechatal svoe soobshchenie ob oshibke i vozvratil kod vozvrata ravnyj 2. Odnako testovaya komanda vidit $? kak znachenie 0 i vybiraet vetv' istina. Mozhete li vy najti oshibku v stroke 8 programmy ? |to horoshaya nota dlya okonchaniya razdela ob oshibkah. Hitrosti redaktora Vi Odna iz samyh zamechatel'nyh osobennostej UNIX - eto vozmozhnost' vyjti iz program tak, chtoby Vy mogli zapuskat' drugie komandy vne yazyka shell. |to bylo razrabotano vnutri UNIX i yavlyaetsya prostym i moshchnym sredstvom. Ispol'zovanie nekotoryh priemov, opisannyh nizhe mo- zhet sdelat' razrabotku programmy bolee prostoj i bystroj. Vozvrashchenie v shell Vozvrashchenie v shell - ochen' poleznaya vozmozhnost' v redaktore vi. Vy mozhete zapisat' Vashu programmu v redaktore, vyjti iz nego, zapustit' programmu, vernut'sya nazad v redaktor i t.d. |tot cikl redaktirovanie - translyaciya - proverka mozhet byt' vypolnen iz redaktora. S etimi vozmozhnostyami vhoda i vyhoda iz redaktora Vy mozhete zakonchit' seans raboty bez real'nogo unichtozheniya redaktora. Redaktor vi takzhe yavlyaetsya redaktorom ex. Vi - eto vizual'naya chast' ex. Sledovatel'no, Vy mozhete vyjti v shell dvumya putyami. Pervyj - ispol'zuya peremennuyu sh, kotoraya ustanovlena v redaktore ex. Vy mozhete nabrat' : sh poka vy v vi ili prosto "sh", esli Vy v ex. Redaktor pryamo pokidaet shell, kotoryj Vy opredelili v peremennoj sh. Otkuda redaktor znaet kakoj shell Vy zapuskaete? |to mozhno opredelit' po registracionnoj peremennoj okruzheniya yazyka shell. Esli Vash shell - /bin/sh, a Vy ho- tite zapustit' /bin/shV, Vy mozhete pereustanovit' znachenie peremennoj, napechatav ":set sh=/bin/shV" Drugoj sposob vyhoda iz vi - eto s ispol'zovaniem sintaksisa: :!sh gde "sh" daet Vam shell (/bin/sh). Obratite vnimanie, chto proishodit. Vy zapuskaete shell (zapuskaemyj po :!), kotoromu dana komanda zapustit' shell (:!sh). Kogda Vy, nakonec, zapukaete etot shell, poluchaetsya, chto u Vas zapushchen lishnij shell. |to ochen' naglyadno predstavleno v listinge ps, privedennom nizhe - 17 - UID PID PPID C STIME TTY TIME COMMAND russ 35 1 0 Jul 5 co 0:50 -shv russ 1233 35 0 04:30:15 co 0:57 vi file russ 1237 1233 0 04:43:13 co 0:01 sh -c sh russ 1238 1237 0 04:43:15 co 0:02 sh V tret'ej stroke vse skazano. Iz vi vy zapustili shell s opciej -s dlya zapuska yazyka shell . |to bespoleznaya trata celogo shell! A esli ispol'zovat' ukazannyj vyshe sintaksis ili prosto ":sh", to takaya situaciya ne vozniknet. Podderzhka Escape Krome togo, chto redaktor vi mozhno pokinut' po Esc, on podderzhivaet nekotorye drugie vozmozhnosti dlya vyhoda. Obladaya razlichnymi vozmozhnostyami vyhoda, instrumental'nye sredstva mogut vypolnyat' dlya Vas bol'shuyu chast' raboty. Pervyj variant sintaksisa - ":!cmd", kotoryj yavlyaetsya prefiksom dlya zapuska lyuboj komandy vne redaktora. V etom sluchae komanda mozhet byt' lyuboj komandoj razdela (1). Vtoroj variant sintaksisa - eto ":!!". |to oznachaet vyjti (:!) i ispol'zovat' poslednyuyu komandnuyu stroku kak argument dlya zapuska v novom yazyke shell. Naprimer, esli my skazali: ":!ls", potom ":!!", :ls budet zapushchena opyat'. Vtoroj ! ssylaetsya ko vsej predydushchej ko- mandnoj stroke. Tretij variant sintaksisa - eto ":!%". |to oznachaet vyjti (:!) i zapustit' komandu, imya kotoroj yavlyaetsya imenem etogo fajla (%). Kogda vy nazhimaete vozvrat karetki, % - zameshchaetsya imenem fajla, chto ochen' udobno pri redaktirovanii komandnyh fajlov. Vy mozhete sdelat' chto-nibud' tipa: $ vi tool . . . edit . . . :w Vy vyzyvaete vi s imenem fajla, tak chto vi zapominaet imya "tool" v svoem bufere. Vy mozhete izmenit' chto-to pryamo tut v redaktore, zapisat' izmeneniya na disk, zatem zapustit' novuyu kopiyu fajla. Redaktor zapolnyaet fajl s imenem "tool" i zapuskaet ego. Kogda Vy vyhodite iz ispolnyaemogo fajla "tool", Vy popadaete nazad v redaktor, gotovye vnesti izmeneniya v tekst i zapustit' programmu snova. Odna iz horoshih posledovatel'nostej - eto otredaktirovat' fajl, sdelat' izmeneniya, zapisat' ih, zapustit' fajl, ispol'zuya %, vnesti izmeneniya eshche raz, perezapustit' programmu, napechatav :!!, chto perezapuskaet poslednyuyu komandu escape, :!% . Takim obrazom cikl vyhodov i zapuskov programmy obrazuet tri nazhatiya klaviatury, :!!. My dazhe mozhem ispol'zovat' etu vozmozhnost' dlya kompilyacii programm na S. Esli u nas est' komandnyj fajl, kotoryj nazyvaetsya "cg" (generator kompilyacii) my mozhem proshche ispol'zovat' vi: F = 'echo $ 1 | sed -e "s/^\(.*\).c$/\1"' cc $1 -o $F Potom my mozhem vypolnit' posledovatel'nost' takogo tipa: $ vi test.c ...edit... :!cg % ili to zhe samoe koroche - 18 - : !cg test.c i zakanchivaetsya sozdaniem ispolnyaemogo modulya "test". Makrosy Drugaya vozmozhnost' vi, kotoraya podderzhivaet prostoj vyhod, - eto mehanizm makrosov. Hotya glavnym obrazom makrosy nuzhny dlya togo, chtoby mozhno bylo pomeshchat' komandy redaktirovaniya v imenovannye registry, kotorye chasto ispol'zuyutsya. Takim obrazom vmesto togo, chtoby ispol'zovat' sintaksis opyat' i opyat', Vy prosto ispol'zuete makros. Nizhe priveden primer makropodstanovki: i s/^[^ ]*/ [^ ]*/ "add @a Snachala nuzhno perejti v rezhim vstavki, chtoby my mogli pomestit' komandu v nash fajl redaktora. My pechataem komandu podstanovki i nazhimaem ESC, chtoby zakonchit' rabotu v rezhime vstavki. Komanda podstanovki govorit "V strokah, kotorye nachinayutsya s nepustogo simvola, za kotorym sleduyut odin ili neskol'ko simvolov takogo zhe tipa, postavit' probel pered nepustoj posledovatel'nost'yu simvolov". Dalee my pechataem "add", gde "a" oboznachaet imenovannyj registr a i dd oboznachaet peremestit' stroku v bufer. Teper' stroka podstanovki nahoditsya v bufere a. CHtoby ee vypolnit' my prosto napechataem @a v komandnom rezhime vi. CHtoby vyjti my mozhem vypolnit' tu zhe posledovatel'nost' dejstvij, no pomestit' komandu tipa :!ps -ef v redaktor i perepisat' ee v bufer. Potom, kogda my govorim @a, my vhodim v shell i zapuskaem komandu ps. Komandy takogo tipa mozhno pomeshchat' v imenovannye bufery ot a-z. Poslednij sposob ispol'zovaniya makrosov dlya podderzhki vyhoda - eto cherez komandu map. |ta komanda est' v ex i adresuetsya predshestvuyushchim dvoetochiem : iz vi. Sintaksis dlya komandy map vyglyadit tak: :map lhs rhs |to ustanavlivaet otobrazhenie levoj storony na pravuyu storonu. Primer prisvoeniya vyglyadit tak: :map w :!who^M Teper' kazhdyj raz, kogda Vy pechataete w, budet vypolnyat'sya dejstvie vyhoda cherez ex, pechatat'sya komanda who, potom pechatat'sya vozvrat karetki, kotoryj otpravlyaet vsyu etu posledovatel'nost' na vypolnenie. Vse eto po odnomu nazhatiyu klaviatury. Samoe smeshnoe nachinaetsya, kogda Vash terminal imeet funkcional'nye klavishi. Vi obrashchaetsya k funkcional'nym klavisham po #0 -#9. Teper' my mozhem zarezervirovat' funkcional'nye klavishi dlya komand vyhoda. Prostoe prisvoenie budet: :map #1 :!ps -ef^ Kazhdyj raz, kogda Vy nazhimaete funkcional'nuyu klavishu F1, - 19 - zapuskaetsya komanda ps -ef. Komanda "One-Liners" - kroshechnaya, no moshchnaya Sleduyushchij spisok - eto podborka obychnyh komand, ispol'zovannyh takim obrazom, chtoby poluchit' moshchnyj effekt. Kak master voennogo iskusstva, kotoryj ubivaet golymi rukami, master UNIX chasto mozhet slozhit' vmeste neskol'ko obychnyh komand i dostich' kolossal'nogo effekta. Nekotorye stroki, kotorye budut predstavleny nizhe, mozhno vstretit' v drugih mestah etoj knigi, no oni privodyatsya zdes' povtorno dlya oblegcheniya poiska. Stroki gruppiruyutsya v sootvetstvii s komandoj, kotoraya yavlyaetsya klyuchevoj v dannoj stroke, odnako, inogda slozhno vydelit' takuyu komandu kak, naprimer, v sluchae programmnogo kanala, kogda Vy s dvuh storon imeete vazhnye komandy. Zamet'te, chto nekotorye iz etih komand yavlyayutsya standartnymi komandami UNIX, v to vremya kak drugie - eto komandnye fajly i programmy, predstavlennye ranee v etoj knige. ACCTCOM * prochitat' vsyu Vashu uchetnuyu informaciyu, nachinaya s poslednej komandy. acctcom -b -u$LOGNAME * pokazat' vse uchetnye zapisi, zapushchennye s Vashego terminala i togo, kotoryj zapushchen kak superpol'zovatel' acctcom -u# -l'tty' BANNER * napechatat' soobshchenie na treh strokah banner "line 1" "line2" "line3" * napechatat' den' nedeli i datu na odnoj stroke, vremya na drugoj banner "'date|cut -d' ' -f1,3'" "'date|cut -d''-f4'" * poslat' soobshchenie na ekran drugogo pol'zovatelya banner "Privet" "tam" > /dev/tty01 BASENAME * ochistit' put' echo "YA za ustrojstvom 'basename\'tty\' ' '' BC * peredat' formulu na vhod komande bc, kotoraya dolzhna vypolnit' umnozhenie i prisvoit rezul'tat PROD PROD = 'echo $NUM1 * $NUM2 | bc' CAT - 20 - * peredat' simvoly s klaviatury v fajl cat > file (pechatat' poka ne vstretitsya simvol ^D dlya prekrashcheniya chteniya) * poluchit' vvod iz konstrukcii "dokument zdes'" cat << -! |to obrazec teksta, kotoryj pechataetsya na ekrane ! CC * mnozhestvennaya kompilyaciya v fonovom rezhime iz odnoj komandnoj stroki cc file1.c & cc file2 & cc file3.c & CD * perejti v katalag, v kotorom nahoditsya fajl cd 'imya direktoriya\'put' fajl\'' * perejti v katalog, kotoryj zapisan v peremennoj DESTINATION="/usr/bin" cd $DESTINATION * perejti v katalog, zapisannyj v fajle cd 'cat dest_file' CHMOD * vklyuchit' bit ispolneniya fajla chmod +x file * vklyuchit' bit smeny identifikatora pol'zovatelya i razreshit' vsem vypolnenie fajla chmod 4755 file * ustanovit' bit sticky vo vklyuchennoe sostoyanie chmod 1755 file CHOWN * ustanovit' sebya vladel'cem fajla chown $LOGMAME files * to zhe samoe drugim sposobom chown 'who am i| cut -d' '-f1' files * izmenit' pravo sobstvennosti dlya dereva - 21 - cd dest find . -print | sort | while read FILE do chown russ $FILE done CP * skopirovat' tri urovnya fajlov v odin vkatalog /tmp cp */*/* /tmp * to zhe samoe drugim sposobom cp 'find . -type f -print' /tmp * pereklyuchit' pol'zovatel'skoe predlozhenie cp -z CPIO * peremestit' derevo sistemy fajlov v novoe mestopolozhenie cd $SRC find .-print | sort | cpio -pdv $DEST * skopirovat' derevo sistemy fajlov na gibkij disk cd $HOME find .-print | sort | cpio -ocBv > /dev/rfd0 * vosstanovit' kopiyu na strimere cd $DEST cpio -icBvt < /dev/rfd0 * vypolnit' "ls -l" na kopii strimera cpio -icBvt < /dev/rfd0 CRON * zapustite Vash generator soobshchenij o statuse kazhdyj chetverg v 6:00 a.m. 0 6 * * 4 /usr/russ/bin/status_msg * chmod na fajl parolej * * * * * /bin/su root -c "chmod 777 /etc/passwd" CU * neposredstvenno obratit'sya posledovatel'nomu portu na skorosti 1200 bod cu -ltty00 dir * neposredstvenno obratit'sya k posledovatel'nomu portu na skorosti 9600 bod cu -ltty00 -s9600 dir * avtomaticheski vyzvat' druguyu sistemu, ispol'zuya kombinaciyu dial/modem cu -acua0 555-1212 - 22 - CUT * otsech' pervoe pole iz fajla passwd cut -d: -f1 /etc/passwd * otsech' imya iz listinga komandy who who | cut -d' ' -f1 who | awk '{print $1} DD * polnaya gibkaya kopiya dorozhka za dorozhkoj dd if = /dev/fd0 of=/dev/fd1 DOS * skopirovat' vse fajly dannogo kataloga na disketu DOS doscp * a: * skopirovat' vse fajly s diskety DOS v dannyj katalog dosls a: > /tmp/dosf for FILE in 'cat /tmp/dosf' do doscp a:$FILE done DU * vydat' obshchee kolichestvo blokov dlya vseh katalogov v / du -s /* * napechatat' kolichestvo ispol'zovannogo mesta v kataloge kazhdogo pol'zovatelya echo "total bytes: 'expr\'du -s $1\' \* 512'" ECHO * napechatat' znachenie peremennoj shell'a echo $PATH $CDPATH * napechatat' vyvod vperemeshku s obychnym tekstom echo " Moe imya $LOGNAME ili 'logname' ili 'who am i|cut -d' ' -f1'" * napechatat' simvoly upraleniya v kavychkah i bez echo "\n\t |to zapisano v kavychkah" echo \\n\\t |to zapisano bez kavychek * napechatat' i ostavit' kursor v konce toj zhe stroki - 23 - echo -n "prompt: " echo "prompt: \c" ED * zapustit' ed avtomatichski s konstrukciej "dokument zdes'" ed /etc/passwd <<-! 1,$p g/root/s//noroot w q ! EXPR * umnozhit' dva chisla expr 512 \* 1024 * uvelichit' peremennuyu na predopredelennoe znachenie x = 0; INC = 5 X='expr $X + $INC' FILE * najti vse tekstovye fajly file * | fgrep text * napechatat' imena tol'ko tekstovyh fajlov file * | fgrep text | cut -d: -f1 * more vse tekstovye fajly more 'file * | fgrep text | cut -d: -f1' FIND * najti vse fajly v sisteme find / -print | sort * najti vse fajly i raspechatat' spisok v formate long find / -exec ls -ld {} \; * napechatat' imena vseh regulyarnyh fajlov find / -type f print * najdite vse katalogi i raspechatajte soderzhimoe find / -type d print | while read DIR do echo "listing $DIR" ls $DIR done * najdite vse fajly, kotorye byli modificirovany v poslednie 24 chasa i raspechatajte ih spisok v formate long find / -atime -0 -exec ls -ld {} \; - 24 - * najdite vse fajly setuid i setgid find / -perm -4000 -o -perm -2000 -exec ls -ld {} \; FINGER * ukazhite vseh pol'zovatelej, vyshedshih iz sistemy finger 'who | cut -d' ' -f1' * ukazhite vseh pol'zovatelej v fajle passwd cut -d: -f1 /etc/passwd | while read NAME do finger $NAME done GREP * najti sluchai upotrebleniya shestnadcatirichnyh chisel v fajle dannyh od -x datafile | grep 'A3F09' * najti svoe imya v sisteme find / -type f print | while read FILE do grep "russ" $FILE /dev/null done HEAD * ozaglav'te vse tekstovye fajly v tekushchem kataloge file * | fgrep text | cut -d: -f1 | while read FILE do echo "--------" echo "$FILE" echo "--------" head "$FILE" ID * opredelit', kto v dannyj moment yavlyaetsya superpol'zovatelem if [ "'id'" = "uid=0(root) gid=0(root)" ] then echo "you are root" fi * to zhe samoe drugim sposobom if id | fgrep root > /dev/null then echo "you are root" fi KILL * unichtozh'te sebya (vygruzite) kill -9 0 kill -9 $$ * zavershite rabotu sistemy kill -1 1 * unichtozh'te poslednij process, zapushchennyj v fonovom rezhime kill -9 $! - 25 - * unichtozh'te process, identifikator kotorogo nahoditsya v fajle kill -9 'cat idfile' LINE * vzyat' stroku s terminala LINE='line < /dev/tty' * vzyat' stroku iz standartnogo vvoda cat datafile | while LINE = 'line' do echo $LINE done LOGIN * perejti iz sgenerirovannoj podskazki login ??? login: ^d login: * poluchit' nekotoruyu vnutrennyuyu informaciyu (programma strings - eto BSD) strings /bin/login | more LOGNAME * napechatat' informaciyu o svoem parole grep '^'logname ':' /etc/passwd * poluchit' informaciyu o svoem processe ps -fu 'logname' LS * vydat' spisok skrytyh fajlov ls -ad .* * vydat' razmer fajla v bajtah ls -l file * vydat' razmer fajla v blokah ls -s file * vydat' informaciyu o pravah dostupa po zapisi vseh zaregestrirovavshihsya v sisteme ls -li 'who |sed "s/^[^ ]* *\([^ ]*\) .*$/\/dev\/\1/p"' * poluchit' pomoshch' po ispo'zovaniyu komandy ls -z * vydat' spisok tol'ko katalogov ls -al |grep "^d" MAIL * poslat' pochtu vsem pol'zovatelyam - 26 - cut -d: -f1 |while read USER do echo "mailing to $USER" mail $USER done * poslat' pochtu iz fajla mail russ < /etc/passwd * poslat' pochtu iz programmnogo kanala echo "|to tekst pochty" | mail russ MORE * napechatat' vse fajly tekushchego kataloga more * * napechatat' 10 strok za raz more -10 file cat file | more -10 MKDIR * opustit'sya na maksimal'nuyu glubinu while : do mkdir x cd x done * to zhe samoe drugim sposobom PATH="x" while : do mkdir $PATH PATH="$PATH/x" done NCHECK * najti vse fajly, prisoedinennye k vi ls -li /bin/vi 40 -rwwx--x--t 1109344 Feb 14 1985 /bin/vi ncheck -i 40 /dev/root * najti vse fajly ustanovki identifikatora pol'zovatelya ncheck -s NM * posmotret' simvol'nye tablicy vseh nonstripped ispolnyaemyh fajlov nm 'file *| grep "not stripped"|sed "s/^\(.*\):.*$/\1/" OD * posmotret' simvoly v imenah fajlov v tekushchem kataloge - 27 - od -c . * napechatat' znachenie funkcional'nyh klavish, kombinacij klavish, i.t.d. od -cb (nazhmite kombinaciyu klavish) ^d (pechataet stroku) (nazhmite chto-nibud' eshche) ^d (pechataet sleduyushchuyu stroku) ^d (vyyhodit iz od) * sdelat' damp kopii na strimere od -c /dev/rfd0 * sdelat' damp fajlovoj sistemy od -c /dev/root PASSWD * kak superpol'zovatel' Vy mozhete ustanovit' v kachestve parolya lyubuyu stroku # passwd russ Changing password for russ (Izmenenie parolya dlya russ) Enter new password (minimum of 5 characters) (Vvedite novyj parol' (minimum 5 simvolov)) Please use combination of upper, lowercase letters and numbers (Pros'ba ispol'zovat' kombinacii chisel i bukv v verhnem i nizhnem registrah) New password: junk (Novyj parol': junk) Re-enter new password: junk (Novyj parol': junk) # * kak obychnyj pol'zovatel' Vy dolzhny budete vvodit' parol' s uchetom kolichestvennyh ogranichenij i ogranichenij po dline $ passwd russ Changing password for russ (Izmenenie parolya dlya russ) Enter new password (minimum of 5 characters) (Vvedite novyj parol' (minimum 5 simvolov)) Please use combination of upper, lowercase letters and numbers (Pros'ba ispol'zovat' kombinacii chisel i bukv v verhnem i nizhnem registrah) New password: junk (Novyj parol': junk) Too short. Password unchanged. (Slishkom korotkij. Parol' ne izmenen) $ PR * vyvesti mnogokolonochnyj spisok imen fajlov ls $@ | pr -5t * napechatat' fajly iz spiska - 28 - pr 'find . -name "*.c" -print | sort' PS * napechatat' polnuyu informaciyu obo vseh aktivnyh processah ps -aef * napechatat' informaciyu obo vseh processah, upravlyaemyh Vashim terminalom ps -f * napechatat' informaciyu o processah, svyazannyh s terminalom tty00 ps -ft00 * napechatat' informaciyu o processah, svyazannyh s pol'zovatelem russ ps -furuss * BSD sintaksis dlya pechati vseh processov ps -aux * BSD sintaksis dlya pechati vseh processov, svyazannyh s terminal'nym ustrojstvom ps -xut00 PWD * sohranit' tekushchij rabochij katalog PWD='pwd' * vernut'sya v ranee sohranennyj rabochij katalog cd $PWD RM * udalit' vse fajly, krome katalogov s fajlami rm * * udalit' pustye katalogi rmdir dirs * udalit' katalogi, imeyushchie fajly rm -r dirs * udalit' vse fajly v rezhime, kogda sistema ne budet zadavat' nikakih voprosov rm -rf * * udalit' kazhdyj fajl v sisteme po otdel'nosti rm -rf / SH * prochitat' spisok poelementno for ELEMENT in 'cat /etc/motd' do - 29 - echo $ELEMENT done * prochitat' spisok postrochno cat /etc/motd | while read LINE do echo $LINE done * cikl poka - navsegda (while-forever) while : do echo $PS1 read CMD case $CMD in "") break;; esac done * upravlyaemyj cikl while read CMD while [ "$CMD" != ""] do case $CMD in user-cmd) do_it;; esac echo $PS1 read CMD done * perepolneniie testovogo steka pri obrabotke preryvaniya trap "echo trapping; kill $$" 2 3 15 * vygruzka iz yazyka shell neskol'kimi sposobami exit eof character (usually control -d) kill -9 0 kill -9 $$ STTY * posmotrite vse svoi ustanovki stty -a * posmotrite terminal'nye ustanovki drugogo terminala stty -a < /dev/tty01 * ustanovit' peredachu bod na druguyu skorost' dlya drugogo terminala stty 300 < /dev/tty01 * dinamicheski ustanovit' control-A kak klavishu preryvaniya stty intr ^a * vklyuchit' eho-soprovozhdenie terminala stty -echo - 30 - SU * testovyj cikl dlya unichtozheniya legkih parolej awk '{FS =":"; print $1,$5} '/etc/passwd|while read N C do echo "\n$N\t$C" su $N done TAIL * prosledit' v real'nom vremeni zapis' tranzakcij fajla vhoda v sistemu (logfile) uucp tail -f /usr/spool/uucp/LOGFILE * posmotret' poslednyuyu stroku fajla tail -1 file * posmotret' poslednie 10 simvolov peremennoj echo "$VAR" | tail -10c TAR * sdelat' kopii fajlov v Vashem home-kataloge ne razryvaya fajl, no formiruya kopii na kusk