Unix shell ni nini. Mageuzi ya makombora ya amri ya Linux. Jinsi ya kufanya shughuli za chelezo zilizopangwa kiotomatiki

Watu wengi wanafikiri kwamba kufanya programu ambayo itatumiwa na mamilioni ni vigumu sana. Hata hivyo, nyuma ya yoyote, hata ngumu zaidi, bidhaa daima kuna wazo rahisi. Mmoja wao ni ganda la amri, au ganda. Katika nakala hii, tutakuonyesha jinsi ya kuandika ganda la Unix lililorahisishwa katika C.

Ushauri Usitume au kutumia (hata katika fomu iliyorekebishwa) msimbo ulio hapa chini kama mradi wa nyumbani shuleni au chuo kikuu. Walimu wengi wanajua kuhusu makala asili na watakupata ukidanganya.

Mzunguko wa maisha ya shell

Ganda hufanya shughuli tatu kuu wakati wa maisha yake:

  1. Uanzishaji: Katika hatua hii, inasoma na kutekeleza faili zake za usanidi. Wanabadilisha tabia yake.
  2. Ufafanuzi: Ganda kisha husoma amri kutoka kwa stdin na kuzitekeleza.
  3. Zima: Baada ya kutekeleza amri za msingi, hutekeleza amri za kuzima, huweka kumbukumbu huru, na hutoka.

Ni shughuli hizi tatu ambazo tutatumia kama msingi wa ganda letu la amri. Hatutaongeza faili za ziada usanidi na amri ya kuzima. Tutaita tu kazi ya kitanzi na kukamilisha kazi. Ni muhimu kuzingatia kwamba kutoka kwa mtazamo wa usanifu. mzunguko wa maisha ngumu zaidi kuliko kitanzi tu.

Int main(int argc, char **argv) ( // Pakia faili za usanidi ikiwa zinapatikana. // Anzisha kitanzi cha amri. lsh_loop(); // Zima / futa kumbukumbu. rudisha EXIT_SUCCESS; )

Katika mfano hapo juu unaweza kuona lsh_loop() kazi, ambayo itazunguka kupitia amri. Tutaangalia utekelezaji hapa chini.

Kitanzi cha Msingi cha Shell

Kwanza kabisa, tunahitaji kufikiria jinsi programu inapaswa kuendeshwa. Na hapa ni muhimu kuelewa nini shell hufanya wakati wa kitanzi. Njia rahisi ya kusindika amri ina hatua tatu:

  1. Soma: Soma amri kutoka kwa mitiririko ya kawaida.
  2. Kuchanganua: kutambua programu na hoja katika mfuatano wa pembejeo.
  3. Tekeleza: Endesha amri inayotambulika.

Wazo hili linatekelezwa katika lsh_loop() kazi:

Utupu lsh_loop(batili) ( char *line; char **args; int status; fanya ( printf("> "); mstari = lsh_read_line(); args = lsh_split_line(line); status = lsh_execute(args); bure(line ); bure(args);) wakati (hali);)

Hebu kupitia kanuni. Mistari michache ya kwanza ni matangazo tu. Kitanzi cha postcondition ni rahisi zaidi kwa kuangalia hali ya kutofautisha kwa sababu inatekelezwa kabla ya kuangalia thamani yake. Ndani ya kitanzi, kidokezo cha uingizaji kinachapishwa, kazi huitwa kusoma kamba ya kuingiza na kugawanya kamba katika hoja, na kisha hoja zinatekelezwa. Ifuatayo, kumbukumbu iliyotengwa kwa kamba na hoja hutolewa. Ni muhimu kuzingatia kwamba kanuni hutumia hali ya kutofautiana, iliyorejeshwa na lsh_execute() na kuonyesha wakati wa kutoka kwenye chaguo la kukokotoa.

Kusoma mstari

Kusoma kamba kutoka kwa pembejeo ya kawaida inaonekana rahisi, lakini katika C inaweza kusababisha shida nyingi. Shida ni kwamba hakuna mtu anayejua mapema ni maandishi ngapi ambayo mtumiaji ataingia kwenye ganda la amri. Huwezi tu kuangazia kizuizi na kutumaini kuwa watumiaji hawatakivuka. Badala yake, unahitaji kutenga tena kizuizi cha kumbukumbu kilichotengwa ikiwa watumiaji watazidi mipaka yake. Hii suluhisho la kawaida katika C, na hii ndiyo itatumika kutekeleza lsh_read_line() .

#fafanua LSH_RL_BUFSIZE 1024 char *lsh_read_line(batili) ( int bufsize = LSH_RL_BUFSIZE; int position = 0; char *buffer = malloc(sizeof(char) * bufsize); int c; if (!buffer) ( fprintf(stderr, "lsh) : hitilafu ya mgao wa kumbukumbu\n"); toka(EXIT_FAILURE); ) huku (1) ( // Soma herufi c = getchar(); // Unapokutana na EOF, ibadilishe na kiondoa null na urudishe buffer ikiwa (c == EOF || c == "\n") ( buffer = "\0"; rudisha bafa; ) mwingine ( buffer = c; ) position++; // Tukizidisha bafa, weka upya kizuizi cha kumbukumbu ikiwa (nafasi > = bufsize) ( bufsize += LSH_RL_BUFSIZE; buffer = realloc(bafa, bufsize); ikiwa (!bafa) ( fprintf(stderr, "lsh: hitilafu ya ugawaji kumbukumbu\n"); toka(EXIT_FAILURE); ) ) ) )

Kuna matangazo mengi katika sehemu ya kwanza. Inafaa kumbuka kuwa nambari hutumia mtindo wa zamani wa C wa kutangaza vigeu kabla ya mwili wa nambari. Sehemu kuu ya chaguo la kukokotoa iko ndani ya kitanzi kinachoonekana kutokuwa na mwisho (1). Kwenye kitanzi, mhusika husomwa na kuhifadhiwa kama int badala ya char (EOF ni nambari kamili, sio herufi, kwa hivyo tumia int kuangalia). Ikiwa ni laini mpya au EOF, tunatoka mstari wa sasa na kuirudisha. Vinginevyo, mhusika huongezwa kwenye kamba iliyopo.

Kisha tunaangalia ili kuona ikiwa herufi inayofuata iko nje ya bafa. Ikiwa ndivyo ilivyo, basi tunasambaza tena bafa (huku tukiiangalia kwa makosa ya ugawaji) na kuendelea na utekelezaji.

Wale wanaofahamu matoleo mapya zaidi ya maktaba ya kawaida ya C wanaweza kutambua kuwa stdio.h ina kitendakazi cha getline() ambacho hufanya kazi nyingi zinazotekelezwa katika msimbo ulio hapo juu. Kipengele hiki kilikuwa kiendelezi cha GNU kwa maktaba ya C hadi 2008, na kisha iliongezwa kwa vipimo, kwa hivyo mifumo mingi ya kisasa ya Unix tayari inakuja nayo. Na getline kazi inakuwa ndogo:

Char *lsh_read_line(batili) ( char *line = NULL; ssize_t bufsize = 0; // getline itatenga getline ya kumbukumbu(&line, &bufsize, stdin); laini ya kurejesha;)

Kuchanganua masharti

Sasa tunahitaji kuchanganua mfuatano wa ingizo katika orodha ya hoja. Tutafanya kurahisisha kidogo na kumzuia mtumiaji kutumia manukuu na mikwaruzo katika hoja za mstari wa amri. Badala yake, tutatumia tu nafasi kutenganisha hoja. Kwa hivyo, amri ya echo "hapa kuna ujumbe" itaita amri ya echo sio kwa hoja moja "hapa kuna ujumbe" lakini kwa mbili: "hapa" na "ujumbe".

Sasa tunachohitaji kufanya ni kugawanya kamba vipande vipande kwa kutumia nafasi kama vikomo. Hii ina maana kwamba tunaweza kutumia classic maktaba kazi strtok.

#fafanua LSH_TOK_BUFSIZE 64 #fafanua LSH_TOK_DELIM "\t\r\n\a" char **lsh_split_line(char *line) ( int bufsize = LSH_TOK_BUFSIZE, nafasi = 0; char **tokeni = malloc(char *line) ); char *token; ikiwa (!ishara) ( fprintf(stderr, "lsh: hitilafu ya ugawaji kumbukumbu\n"); toka(EXIT_FAILURE); ) token = strtok(line, LSH_TOK_DELIM); huku (ishara != NULL) ( tokeni = ishara; nafasi++; ikiwa (nafasi >= bufsize) ( bufsize += LSH_TOK_BUFSIZE; tokeni = realloc(tokeni, bufsize * sizeof(char*)); ikiwa (!tokens) ( fprintf(stderr, "lsh: hitilafu ya ugawaji kumbukumbu \n"); toka(EXIT_FAILURE); ) ) tokeni = strtok(NULL, LSH_TOK_DELIM); ) tokeni = NULL; tokeni za kurudisha; )

Utekelezaji wa kazi hii ni sawa na lsh_read_line() , na kwa sababu nzuri! Mbinu kama hiyo inatumika hapa, lakini badala ya safu ya vibambo isiyokamilika, tunatumia safu ya vielelezo vilivyobatilishwa.

Tunaanza kugawanya kwa kupiga simu strtok. Inarudisha pointer kwenye kipande cha kwanza cha kamba (ishara). Kwa ujumla, strtok() inarudisha viashiria kwenye maeneo kwenye kamba na huweka viambatisho visivyo na mwisho mwisho wa kila ishara. Tunahifadhi viashiria hivi katika safu tofauti.

Ikiwa ni lazima, tutaweka upya safu ya pointer. Tunarudia mchakato huo hadi strtok itaacha kurudisha ishara, na kusitisha safu ya ishara na kiondoa null.

Sasa tuna safu ya ishara tayari kwa utekelezaji.

Jinsi makombora ya amri huanza michakato

Sasa tunafika kwenye moyo wa kile ganda hufanya. Michakato ya kukimbia ni kazi kuu ya shells za amri. Kwa hiyo, ukitengeneza shell, lazima ujue hasa kinachotokea kwa taratibu na jinsi zinazinduliwa. Ndiyo maana sasa tutazungumzia.

Katika Unix kuna njia mbili tu za kuendesha michakato. Ya kwanza (ambayo hatutahesabu) ni Init . Unaona, wakati mfumo wa Unix unaanza, kernel yake inapakiwa. Baada ya kuwasha na kuanzishwa, kernel huanza mchakato mmoja tu, unaoitwa Init. Utaratibu huu unaendesha wakati kompyuta inaendesha na inasimamia upakiaji wa michakato mingine ambayo ni muhimu kwa uendeshaji wake.

Kwa kuwa michakato mingine yote sio Init, kuna njia moja tu ya vitendo ya kuanza michakato: fork() simu ya mfumo. Wakati kazi hii inaitwa, mfumo wa uendeshaji hufanya duplicate ya mchakato na huendesha kwa sambamba. Mchakato wa asili unaitwa "mzazi" na mchakato mpya unaitwa "mtoto". Fork() inarudisha 0 kwenye mchakato wa mtoto na kurudisha kitambulisho cha mchakato (PID) cha mtoto wake kwa mzazi. Kwa hivyo mtu yeyote mchakato mpya inaweza tu kuundwa kutoka kwa nakala ya iliyopo.

Hili linaweza kuonekana kama tatizo. Kwa kawaida, unapotaka kuanza mchakato mpya, hutaki nakala ya programu ambayo tayari inaendeshwa - unataka kuanzisha programu tofauti. Ili kufanya hivyo, unahitaji kutumia exec() simu ya mfumo. Inachukua nafasi ya sasa programu inayoendesha mpya kabisa. Hii ina maana kwamba wakati exec inaitwa, mfumo wa uendeshaji huacha mchakato, hupakia programu mpya na kuianzisha katika sehemu moja. Simu ya exec() hairudishi mchakato isipokuwa kuna hitilafu.

Simu hizi mbili za mfumo hufanya iwezekane kuendesha programu nyingi kwenye Unix. Kwanza, mchakato uliopo unabadilisha mzazi na mtoto, na kisha mchakato wa mtoto hutumia exec() kujibadilisha na programu mpya. Mchakato wa mzazi unaweza kuendelea kufanya mambo mengine na pia kufuatilia yake yenyewe vipengele vya mtoto kwa kutumia wait() simu ya mfumo.

Ndiyo, kuna habari nyingi. Wacha tuangalie nambari ya uzinduzi wa programu:

Int lsh_launch(char **args) ( pid_t pid, wpid; int status; pid = fork(); ikiwa (pid == 0) ( // Mchakato wa mtoto ikiwa (execvp(args, args) == -1) ( kosa ("lsh"); ) toka(EXIT_FAILURE); ) vinginevyo ikiwa (pid< 0) { // Ошибка при форкинге perror("lsh"); } else { // Родительский процесс do { wpid = waitpid(pid, &status, WUNTRACED); } while (!WIFEXITED(status) && !WIFSIGNALED(status)); } return 1; }

Chaguo hili la kukokotoa huchukua orodha ya hoja ambazo tulianzisha awali. Kisha inafungua mchakato na kuhifadhi thamani ya kurudi. Mara fork() inaporudi, tuna michakato miwili inayofanana. Mchakato wa mtoto unalingana na hali ya kwanza ikiwa (ambapo pid == 0).

Katika mchakato wa mtoto tunataka kutekeleza amri, imeainishwa na mtumiaji. Kwa hivyo, tunatumia lahaja ya simu ya mfumo wa exec, execvp. Lahaja tofauti exec kufanya mambo tofauti. Baadhi huchukua idadi ya kutofautiana ya hoja za kamba, wengine huchukua orodha ya masharti, na wengine hukuwezesha kutaja mazingira ambayo mchakato unaendelea. Lahaja hii mahususi inachukua jina la programu na safu (pia inaitwa vekta, kwa hivyo "v") ya hoja za kamba (la kwanza lazima liwe jina la programu). "p" ina maana kwamba badala ya kutoa njia kamili ya faili ya programu ya kukimbia, tutataja jina lake tu, na pia kuwaambia mfumo wa uendeshaji utafute peke yake.

Ikiwa exec inarudi -1 (au thamani nyingine yoyote), basi hitilafu imetokea. Kwa hivyo tunatumia kosa kuchapisha ujumbe wa makosa pamoja na jina la programu kwa hivyo ni wazi ambapo hitilafu ilitokea. Kisha tunasitisha mchakato, lakini ili shell iendelee kufanya kazi.

Hali ya pili (pid< 0) проверяет, произошла ли в процессе выполнения fork() ошибка. Если ошибка есть, мы выводим сообщение об этом на экран, но программа продолжает работать.

Hali ya tatu inamaanisha kuwa simu ya fork() imekamilika kwa mafanikio. Hapa ndipo mchakato wa mzazi unakaa. Tunajua kwamba mtoto anakaribia kutekeleza mchakato, kwa hivyo ni lazima mzazi asubiri amri ikamilike. Tunatumia waitpid() kusubiri hali ya mchakato kubadilika. Kwa bahati mbaya waitpid() ina chaguzi nyingi (exec() kwa mfano). Taratibu zinaweza kubadilisha hali yao kwa njia nyingi, na sio majimbo yote yanamaanisha kuwa mchakato umekoma. Mchakato unaweza kuisha kwa kawaida (kwa mafanikio au kwa msimbo wa hitilafu), au kusimamishwa na ishara. Kwa hivyo tunatumia macros iliyotolewa na waitpid() kuhakikisha kuwa mchakato umekamilika. Chaguo za kukokotoa hurejesha 1 kama ishara kwa kipengele cha kupiga simu kwamba inaweza kuchapisha kidokezo tena.

Shell zilizojengwa

Huenda umegundua kuwa lsh_loop() kitendakazi huita lsh_execute() , lakini hapo juu tuliita chaguo zetu za kukokotoa lsh_launch() . Hii ilikuwa ni makusudi! Jambo ni kwamba amri nyingi ambazo shell hutekeleza ni programu - lakini sio zote. Baadhi ya amri zimejengwa moja kwa moja kwenye ganda.

Sababu ni rahisi sana. Ikiwa unataka kubadilisha saraka, unahitaji kutumia chdir() kazi. Jambo ni kwamba saraka ya sasa ni mali ya mchakato. Kwa hivyo wacha tuseme uliandika programu ya cd inayobadilisha saraka. Inabadilisha tu saraka yake ya sasa na kutoka, lakini saraka ya sasa ya mchakato wa mzazi haibadilika. Badala yake, mchakato wa ganda lazima utekeleze chdir() kusasisha saraka yake ya sasa. Halafu inapozindua michakato ya watoto, pia wanarithi saraka hii.

Vivyo hivyo, programu inayoitwa exit haitaweza kutoka kwa ganda la amri lililoiita. Amri hii inapaswa pia kujengwa ndani ya ganda. Zaidi ya hayo, makombora mengi yamesanidiwa kwa kutumia hati za usanidi kama vile ~/.bashrc. Maandishi haya hutumia amri zinazobadilisha jinsi ganda linavyofanya kazi. Amri zenyewe zinaweza kubadilisha jinsi ganda linavyofanya kazi, mradi zilitekelezwa ndani ya ganda lenyewe.

Ipasavyo, inaeleweka kuongeza amri kadhaa kwenye ganda. Katika ganda hili tutaongeza cd , toka na usaidizi . Na hapa kuna utekelezaji wa kazi hizi:

/* Kutangaza chaguo za kukokotoa kwa maganda yaliyojengewa ndani: */ int lsh_cd(char **args); int lsh_help(char **args); int lsh_exit(char **args); /* Orodha ya amri zilizojengewa ndani ikifuatwa na vitendakazi sambamba */ char *builtin_str = ( "cd", "help", "exit" ); int (*builtin_func) (char **) = ( &lsh_cd, &lsh_help, &lsh_exit ); int lsh_num_builtins() ( return sizeof(builtin_str) / sizeof(char *); ) /* Utekelezaji wa vitendaji vilivyojengewa ndani */ int lsh_cd(char **args) ( if (args == NULL) ( fprintf(stderr, " lsh: hoja inayotarajiwa ya \"cd\"\n"); ) vinginevyo ( ikiwa (chdir(args) != 0) ( perror("lsh"); ) ) rudisha 1; ) int lsh_help(char **args) ( int i ; printf("LSH by Stephen Brennan\n"); printf("Andika jina la programu na hoja zake na ubonyeze enter.\n"); printf("Hii hapa ni orodha ya amri zilizojengewa ndani: \n"); kwa (i = 0; i< lsh_num_builtins(); i++) { printf(" %s\n", builtin_str[i]); } printf("Используйте команду man для получения информации по другим программам.\n"); return 1; } int lsh_exit(char **args) { return 0; }

Msimbo una sehemu tatu. Sehemu ya kwanza ina matamko ya utendakazi tangulizi. Tamko la mbele ni wakati unapotangaza (lakini usifafanue) kitu ili jina litumike kabla halijafafanuliwa. lsh_help() ndio sababu tunafanya hivi. Inatumia safu ya vitendaji vilivyojengwa ndani, na safu zenyewe zina lsh_help() . Njia rahisi zaidi ya kuvunja mzunguko huu wa utegemezi ni kwa tamko la awali.

Sehemu inayofuata ni safu ya majina ya amri iliyojengwa, ikifuatiwa na safu ya kazi zinazolingana. Hii ina maana kwamba katika siku zijazo, amri zilizojumuishwa zinaweza kuongezwa kwa kurekebisha safu hizi badala ya taarifa kubwa ya kubadili mahali fulani kwenye msimbo. Ikiwa umechanganyikiwa na tamko la buildin_func, ni sawa. Hii ni safu ya viashiria vya utendakazi (ambazo huchukua safu ya safu na kurudisha int). Tamko lolote linalohusisha viashiria vya utendakazi katika C linaweza kuwa tata sana.

Hatimaye, kila kazi inatekelezwa. Chaguo la kukokotoa la lsh_cd() kwanza hukagua uwepo wa hoja yake ya pili na kuchapisha ujumbe wa makosa ikiwa haipo. Kisha huita chdir() , hukagua makosa, na kutoka. Kitendaji cha usaidizi kinaonyesha ujumbe wenye taarifa na majina ya vitendaji vyote vilivyojumuishwa. Na kazi ya kutoka inarudi 0 kama ishara ya kumaliza kitanzi cha amri.

Kuchanganya kazi zilizojengwa ndani na michakato

Sehemu ya mwisho inayokosekana ya fumbo ni utekelezaji wa lsh_execute() chaguo la kukokotoa, ambalo huzindua mchakato wa asili au mwingine.

Int lsh_execute(char **args) ( int i; ikiwa (args == NULL) ( // Amri tupu iliingizwa. rudisha 1; ) kwa (i = 0; i< lsh_num_builtins(); i++) { if (strcmp(args, builtin_str[i]) == 0) { return (*builtin_func[i])(args); } } return lsh_launch(args); }

Nambari hukagua ikiwa amri imeandikwa. Ikiwa ni hivyo, inaizindua, vinginevyo huita lsh_launch() kuzindua mchakato.

Kuweka yote pamoja

Hiyo ndiyo nambari yote inayoingia kwenye ganda la amri. Ikiwa unasoma makala kwa uangalifu, unapaswa kuelewa jinsi shell inavyofanya kazi. Ili kujaribu ganda (kwenye Linux), unahitaji kunakili sehemu hizi za msimbo kwenye faili kuu.c na kuikusanya. Hakikisha umejumuisha utekelezaji mmoja tu wa lsh_read_line(). Utahitaji kujumuisha faili za kichwa zifuatazo:

  • #pamoja na
    • waitpid() na macros zinazohusiana
  • #pamoja na
    • chdir()
    • uma ()
    • kutekeleza ()
    • pid_t
  • #pamoja na
    • malloc()
    • realloc()
    • bure ()
    • Utgång()
    • execvp ()
    • EXIT_SUCCESS, EXIT_FAILURE
  • #pamoja na
    • fprintf()
    • printf()
    • stderr
    • getchar()
    • kosa ()
  • #pamoja na
    • strcmp()
    • strtok()

Ili kukusanya faili, chapa gcc -o main main.c kwenye terminal, ikifuatiwa na ./main ili kukimbia.

Kwa kuongezea, vyanzo vyote vinapatikana kwenye GitHub.

Kwa muhtasari

Kwa wazi, shell hii sio multifunctional. Baadhi ya makosa yake:

  • hoja zinatenganishwa na nafasi tu, hakuna uungwaji mkono wa nukuu au kurudi nyuma;
  • hakuna mwelekeo au mabomba;
  • kazi chache zilizojengwa;
  • hakuna mbadala wa jina la faili.

Ili kuelewa simu za mfumo, tunapendekeza urejelee mwongozo: man 3p. Ikiwa hujui maktaba za kawaida za C na Unix zinakupa kiolesura gani, tunapendekeza uangalie vipimo vya POSIX, hasa sehemu ya 13.

Lugha ya amri ya ganda (iliyotafsiriwa kama ganda, ganda) kwa kweli ni lugha ya programu ngazi ya juu. Katika lugha hii, mtumiaji anadhibiti kompyuta. Kwa kawaida, baada ya kuingia, unaanza kuingiliana na shell ya amri. Ishara kwamba shell iko tayari kupokea amri ni kichocheo kinachoonyesha kwenye skrini. Katika hali rahisi ni dola moja ("$"). Shell sio lazima na lugha ya amri pekee (ingawa ndiyo iliyosawazishwa ndani ya mfumo wa POSIX, kiwango cha mifumo ya rununu). Kwa mfano, lugha ya cshell ni maarufu sana; pia kuna kshell, bashell na zingine. Kwa kuongeza, kila mtumiaji anaweza kuunda yake mwenyewe lugha ya amri. Inaweza kufanya kazi wakati huo huo na lugha tofauti za amri kwenye mfano mmoja wa mfumo wa uendeshaji. shell ni mojawapo ya amri nyingi za UNIX. Hiyo ni, seti ya amri ya "shell" inajumuisha amri ya "sh" - kumwita mkalimani wa "shell". "Shell" ya kwanza inaitwa moja kwa moja unapoingia na kuonyesha programu. Baada ya hayo, unaweza kuita amri yoyote ya utekelezaji, ikiwa ni pamoja na "shell" yenyewe, ambayo itaunda shell mpya kwako ndani ya zamani. Kwa hivyo kwa mfano, ukitayarisha faili "file_1" kwenye kihariri:

Mwangwi Jambo!

basi hii itakuwa faili ya maandishi ya kawaida iliyo na amri ya "echo", ambayo, wakati inatekelezwa, inaonyesha kila kitu kilichoandikwa kwa haki yake kwenye skrini. Unaweza kufanya faili "file_1" itekelezwe kwa kutumia amri "chmod 755 file_1". Lakini inaweza kufanywa kwa kuita kwa uwazi amri ya "sh" ("ganda"):

Sh faili_1

Sh< file1

Faili pia inaweza kutekelezwa katika mfano wa sasa wa ganda. Kuna amri maalum kwa hii "." (kitone), i.e.

Faili_1

Kwa kuwa UNIX ni mfumo wa watumiaji wengi, unaweza hata kufanya kazi kwenye kompyuta ya kibinafsi sambamba, sema, skrini 12 (kubadilisha kutoka skrini hadi skrini ya ALT/kitufe cha kazi), kuwa na mtumiaji mpya (au sawa) kwenye kila skrini. amri yake mwenyewe shell. Unaweza pia kufungua idadi kubwa ya madirisha katika hali ya picha ya X-Window, na kila dirisha linaweza kuwa na mtumiaji wake na shell yake ya amri ... Kipengele cha msingi cha lugha ya shell ni amri.

Muundo wa amri:

Amri kwenye ganda kawaida huwa na muundo ufuatao:

<имя команды> <флаги> <аргумент(ы)>

Kwa mfano:

Ls -ls /usr/bin

Ambapo ls ni jina la amri ya kutoa yaliyomo kwenye saraka, -ls ni bendera ("-" ni ishara ya bendera, l ni muundo mrefu, s ni kiasi cha faili kwenye vizuizi), /usr/ bin ni saraka ambayo amri inatekelezwa. Amri hii itaonyesha yaliyomo kwenye saraka ya /usr/bin katika umbizo refu, na itaongeza maelezo kuhusu saizi ya kila faili kwenye vizuizi. Kwa bahati mbaya, muundo huu wa amri haufuatwi kila wakati. . Bendera si mara zote hutanguliwa na minus, na bendera sio neno moja kila wakati. Ndiyo aina tofauti katika uwasilishaji wa hoja. Amri zenye miundo ya kigeni hujumuisha amri za "kukimbia" kama vile cc - kuita mkusanyaji wa lugha C, tar - kufanya kazi. na kumbukumbu, dd - kunakili faili na ubadilishaji, pata - kutafuta faili na idadi ya zingine Kama sheria, ganda huona neno la kwanza kama amri. Kwa hivyo, kwenye safu ya amri

neno la kwanza litafutwa na ganda kama amri (concatenation), ambayo itaonyesha faili inayoitwa "paka" (neno la pili) iliyoko kwenye saraka ya sasa. Amri redirection Pembejeo ya kawaida (pembejeo) - "stdin" katika UNIX OS inafanywa kutoka kwa kibodi cha terminal, na pato la kawaida (pato) - "stdout" inaelekezwa kwenye skrini ya terminal. Pia kuna faili ya kawaida ya ujumbe wa uchunguzi - "stderr", ambayo itajadiliwa baadaye kidogo. Amri inayoweza kufanya kazi kwenye pembejeo na pato la kawaida inaitwa FILTER. Mtumiaji ana njia rahisi za kuelekeza pembejeo na pato kwa faili zingine (vifaa). Alama za ">" na ">>" zinaonyesha uelekezaji wa pato. ls >file_1 Amri ya "ls" itazalisha orodha ya faili katika saraka ya sasa na kuiweka kwenye faili "file_1" (badala ya kuichapisha kwenye skrini). Ikiwa faili "file_1" ilikuwepo hapo awali, itafutwa na mpya.

Pwd >>faili_1

amri ya pwd itaunda jina kamili la saraka ya sasa na kuiweka mwishoni mwa faili "file_1", i.e. ">>" inaambatanisha kwenye faili ikiwa ni tupu. Alama"<" и "<<" обозначают перенаправление ввода.

Wc -l

itahesabu na kuonyesha idadi ya mistari kwenye faili_1.

Mhariri faili_2<

itaunda faili "file_2" kwa kutumia kihariri, moja kwa moja kutoka kwa terminal. Mwisho wa pembejeo imedhamiriwa na mhusika kulia "<<" (т. е. "!"). То есть ввод будет закончен, когда первым в очередной строке будет "!". Можно сочетать перенаправления. Так

Wc -l faili_4

Wc -l > faili_4

hufanywa kwa njia ile ile: idadi ya mistari kwenye faili "file_3" imehesabiwa na matokeo yamewekwa kwenye faili "file_4". Njia inayochanganya pato la kawaida la amri moja na pembejeo ya kawaida ya mwingine inaitwa PIPELINE na inaonyeshwa na upau wa wima "|".

ls | wc -l

orodha ya faili katika saraka ya sasa itatumwa kwa pembejeo ya amri ya "wc", ambayo itaonyesha idadi ya mistari kwenye saraka. Bomba pia linaweza kuchanganya amri zaidi ya mbili, wakati zote, ikiwezekana isipokuwa ya kwanza na ya mwisho, ni vichungi:

Faili ya paka_1 | matokeo ya grep -h | aina | paka -b > faili_2

Bomba hili kutoka kwa faili "file_1" ("paka") litachagua mistari yote iliyo na neno "matokeo" ("grep"), kupanga ("panga") mistari inayotokana, na kisha nambari ("paka -b") na chapisha matokeo katika faili "file_2". Kwa sababu vifaa vya UNIX vinawakilishwa na faili maalum, vinaweza kutumika katika uelekezaji kwingine. Faili maalum ziko kwenye saraka ya "/dev". Kwa mfano, "lp" - kuchapisha; "console" - console; "tty" - i-th terminal; "null" ni faili dummy (tupu) (kifaa). Kisha, kwa mfano,

Ls > /dev/lp

itachapisha yaliyomo kwenye saraka ya sasa, na faili_1< /dev/null обнулит файл "file_1".

Panga faili_1 | tee /dev/lp | mkia -20

Katika kesi hii, faili "file_1" itapangwa na kuchapishwa, na mistari 20 ya mwisho pia itachapishwa kwenye skrini. Hebu turudi kwenye uelekezaji upya wa pato. Faili za kawaida zimepewa nambari:

0 - stdin, 1 - stdout 2 - stderr. Ikiwa hutaki kuwa na ujumbe wa hitilafu kwenye skrini, unaweza kuielekeza upya kutoka kwa skrini hadi kwenye faili uliyotaja (au kuitupa kabisa kwa kuielekeza kwenye faili ya "kifaa tupu" - /dev/null). Kwa mfano, wakati wa kutekeleza amri

Faili ya paka_1 faili_2

ambayo inapaswa kuonyesha yaliyomo kwenye faili "file_1" na "faili_2" kwa mpangilio kwenye skrini, itakupa, kwa mfano, zifuatazo.

111111 222222 paka: f2: Hakuna faili au saraka kama hiyo

ambapo 111111 222222 ni yaliyomo kwenye faili "file_1" na faili "file_2" haipo, ambayo amri ya "paka" iliripoti kwa faili ya kawaida ya uchunguzi, kwa chaguo-msingi, kama vile pato la kawaida linalowakilishwa na skrini. Ikiwa hutaki ujumbe kama huo kwenye skrini, unaweza kuuelekeza kwa faili uliyotaja:

Faili ya paka_1 faili_2 2>f-err

ujumbe wa makosa utatumwa (kama inavyoonyeshwa na uelekezaji upya "2>") hadi faili ya "f-err". Kwa njia, unaweza kutuma taarifa zote kwa faili moja "ff" kwa kutumia kwa kesi hii kubuni

Faili ya paka_1 faili_2 >>ff 2>ff

Unaweza kutaja sio tu ni faili gani ya kawaida ya kuelekeza, lakini pia ni faili gani ya kawaida ya kuelekeza.

Faili ya paka_1 faili_2 2>>ff 1>&2

Hapa, kwanza "stderr" inaelekezwa upya (katika hali ya kiambatanisho) hadi faili "ff", na kisha matokeo ya kawaida yanaelekezwa kwa "stderr", ambayo kwa hatua hii ni faili "ff". Hiyo ni, matokeo yatakuwa sawa na ya awali. Ujenzi "1>&2" inamaanisha kuwa pamoja na nambari ya faili ya kawaida ya kuelekeza, lazima uweke "&" mbele; muundo mzima umeandikwa bila nafasi.<- закрывает стандартный ввод. >- hufunga pato la kawaida. Faili za amri. Kuna chaguzi kadhaa za kuruhusu faili ya maandishi kutumika kama amri. Wacha tutumie kihariri kuunda faili inayoitwa "cmd" iliyo na laini moja kama hii:

Tarehe; pwd; ls

Unaweza kuita ganda kama amri, iliyoashiria "sh", na kuipitisha faili ya "cmd" kama hoja au kama pembejeo iliyoelekezwa, i.e.

$ sh cmd

$sh

Matokeo ya kutekeleza mojawapo ya amri hizi itakuwa tarehe, kisha jina la saraka ya sasa, na kisha yaliyomo kwenye saraka. Chaguo la kuvutia zaidi na rahisi la kufanya kazi na faili ya batch ni kuibadilisha kuwa inayoweza kutekelezwa, i.e. tu kuifanya amri, ambayo inafanikiwa kwa kubadilisha msimbo wa usalama. Kwa kufanya hivyo, lazima kuruhusu utekelezaji wa faili hii. Kwa mfano,

Chmod 711 cmd

itafanya msimbo wa usalama "rwx__x__x". Kisha wito rahisi

itatekeleza amri tatu sawa. Matokeo yatakuwa sawa ikiwa faili iliyo na yaliyomo

Tarehe; pwd; ls

inawakilishwa katika umbo: tarehe pwd ls kwani mpito hadi mstari mwingine pia ni kitenganishi katika mlolongo wa amri. Kwa hivyo, faili zinazoweza kutekelezwa haziwezi tu kuwa faili zilizopatikana kama matokeo ya mkusanyiko na mkusanyiko, lakini pia faili zilizoandikwa kwa lugha ya ganda. Zinatekelezwa kwa njia ya kutafsiri kwa kutumia mkalimani wa ganda

Kutatua faili za kundi

SHELL hutumia njia mbili za kurekebisha faili za batch. Ya kwanza ni: set -v inachapisha mistari faili ya batch unapozisoma. Hali hii hutumiwa wakati wa kutafuta makosa ya sintaksia. Ili kuitumia, huna haja ya kurekebisha faili ya amri, kwa mfano: sh -v proc... hapa proc ni jina la faili ya amri. Kubadili -v kunaweza kutumika kwa kushirikiana na -n kubadili, ambayo inazuia utekelezaji wa amri zinazofuata (amri ya kuweka -n inazuia terminal hadi bendera ya EOF itaingia). Amri ya kuweka -x inaonyesha amri zinapotekelezwa, na mistari ya programu hutolewa kwa terminal na maadili yao yanabadilishwa badala ya vigezo. Ili kughairi swichi za -x na -v, unaweza kutumia amri iliyowekwa - na kusakinisha, toa thamani inayolingana na tofauti kubwa. MAZINGIRA YA SHELI (VIGEUZI NA VIGEZO) Katika lugha ya ganda, unaweza kuandika faili za kundi na kutumia amri ya "chmod" ili kuzifanya zitekelezwe. Baada ya hayo, hawana tofauti na amri nyingine za UNIX OS.

Vigezo vya shell

Jina la kutofautisha la ganda ni mlolongo wa herufi, nambari, na mistari chini inayoanza na herufi. Thamani ya kutofautisha kwa ganda ni safu ya herufi. Ukweli kwamba kuna aina mbili tu za data kwenye ganda: safu ya wahusika na faili ya maandishi, kwa upande mmoja, inafanya iwe rahisi kuhusisha watumiaji wa mwisho katika programu ambao hawajawahi kufanya programu hapo awali, na kwa upande mwingine. husababisha pingamizi fulani la ndani kati ya watayarishaji programu wengi ambao wamezoea utofauti mkubwa zaidi na unyumbufu mkubwa wa njia za lugha. Walakini, inafurahisha kuona jinsi watengenezaji wa programu waliohitimu sana, wakiwa wamezoea "sheria za mchezo" wa ganda, huandika programu ndani yake mara nyingi haraka kuliko C, lakini, ni nini kinachovutia sana, katika hali zingine programu hizi. kukimbia kwa kasi zaidi kuliko zile zilizotekelezwa katika C. Jina la kutofautisha ni sawa na wazo la jadi la kitambulisho, i.e. jina linaweza kuwa mfuatano wa herufi, nambari, na mistari chini, kuanzia herufi au kistari. Opereta ya kazi "=" inaweza kutumika kugawa maadili kwa vigeu.

Var_1=13 - "13" sio nambari, lakini mfuatano wa tarakimu mbili. var_2="UNIX OS" - Nukuu mbili (" ") zinahitajika hapa kwa sababu kuna nafasi katika mfuatano.

Njia zingine za kugawa maadili kwa anuwai za ganda pia zinawezekana. Kwa mfano, rekodi

DAT=`tarehe`

husababisha amri ya "tarehe" kutekelezwa kwanza (vijiti vya nyuma vinaonyesha kuwa amri iliyoambatanishwa lazima itekelezwe kwanza), na matokeo ya utekelezaji wake, badala ya kutolewa kwa pato la kawaida, hupewa kama thamani ya kutofautisha, katika kesi hii "DAT". Unaweza pia kugawa thamani kwa kutofautiana kwa kutumia amri ya "soma", ambayo inahakikisha kwamba thamani ya kutofautiana inapokelewa kutoka kwa onyesho la (kibodi) katika hali ya mazungumzo. Kawaida amri ya "kusoma" katika faili ya batch inatanguliwa na amri ya "echo", ambayo inakuwezesha kuonyesha ujumbe fulani kwenye skrini. Kwa mfano:

Echo -n "Ingiza nambari ya tarakimu tatu:" soma x

Wakati wa kutekeleza sehemu hii ya faili ya amri, baada ya ujumbe kuonyeshwa

Weka nambari yenye tarakimu tatu:

mkalimani ataacha na kusubiri thamani kuingizwa kutoka kwenye kibodi. Ikiwa umeingia, sema, "753" basi hii itakuwa thamani ya kutofautisha "x". Amri moja ya "kusoma" inaweza kusoma (kukabidhi) maadili kwa anuwai kadhaa mara moja. Ikiwa kuna anuwai nyingi katika "soma" kuliko zilizoingizwa (zilizotenganishwa na nafasi), zile zilizobaki hupewa kamba tupu. Ikiwa kuna maadili zaidi ya kupitishwa kuliko vigezo katika amri ya "kusoma", basi zile za ziada hazizingatiwi. Wakati wa kufikia kutofautiana kwa shell, lazima utangulie jina na ishara ya "$". Kwa hivyo amri echo $var_2 echo var_2 itaonyeshwa kwenye skrini

UNIX OS var_2 Inatoroka

Wacha tuangalie kwa karibu mbinu za kutoroka zinazotumiwa kwenye ganda. Manukuu mara mbili (" "), nukuu moja (" "), na mikwaju ya nyuma (\) hutumiwa kama vifaa vya kutoroka. Hatua yao ni dhahiri kutoka kwa mifano: Unaweza kuandika kazi kadhaa katika mstari mmoja.

X=22 y=33 z=$x A="$x" B="$x" C=\$x D="$x + $y + $z" E="$x + $y + $z " F=$x\ +\ $y\ +\ $z

(mgawo wa G=$x+$y ungeshindwa kwa sababu ya nafasi) Kisha

Echo A = $A B = $B C = $C echo D = $D E = $E F = $F eval echo imetathminiwa A = $A echo ya tathmini imetathminiwa B = $B echo ya tathmini imetathminiwa C = $C

Itaonyeshwa kwenye skrini

A = 22 B = $x C = $x D = 22 + 33 + 22 E = $x + $y + $z F = 22 + 33 + 22 imetathminiwa A = 22 imetathminiwa B = 22 imetathminiwa C = 22

Wacha tutoe mifano zaidi inayohusiana na milisho ya laini ya kutoroka. Acha "kamba" ya kutofautisha ipewe dhamana ya "safu" 2x3: abc def Kumbuka kuwa ili kuzuia kugawa nafasi za ziada, safu ya pili ya safu huanza kutoka nafasi ya kwanza ya safu ifuatayo: string="abc def" Kisha. kuna chaguzi tatu za kuandika kutofautisha katika amri ya "echo" echo $string echo "$string" echo "$string" itatoa matokeo matatu tofauti: abc def $string abc def na mlolongo wa amri echo "str_1 str_2" > file_1 echo "str_1 str_2" > file_2 cat file_1 file_2 itatoa kwa mfuatano faili zinazofanana file_1 na file_2: str_1 str_2 str_1 str_2 Kumbuka pia kwamba kurudi nyuma (\) sio tu huepuka tabia inayoifuata, ambayo hukuruhusu kutumia herufi maalum kama herufi zinazojiwakilisha (inaweza pia kujiepusha yenyewe - \\), lakini kwa faili ya amri, kurudi nyuma hukuruhusu kuunganisha mistari kuwa moja (epuka mwisho wa mstari) Kwa mfano, mfano wa mstari wa amri uliotolewa hapo awali:

Faili ya paka_1 | matokeo ya grep -h | aina | paka -b > faili_2

inaweza kuandikwa katika faili ya kundi, sema kama

Faili ya paka_1 | grep -h\matokeo | aina | paka -b > faili_2

Kwa njia, ishara ya conveyor pia hutoa athari ya kuendelea na mstari wa amri. Katika kesi hii, inaweza kutoa matokeo mazuri, kama hii:

Faili ya paka_1 | matokeo ya grep -h | aina | paka -b > faili_2

Udanganyifu na vijiwezo vya ganda Licha ya ukweli kwamba vigeu vya ganda kwa ujumla huchukuliwa kuwa vifungu, i.e. "35" sio nambari, lakini safu ya herufi mbili "3" na "5", katika idadi ya kesi zinaweza kufasiriwa tofauti, kwa mfano kama nambari kamili. Amri ya "expr" ina uwezo mbalimbali. Wacha tuonyeshe baadhi kwa mifano: Utekelezaji wa faili ya kundi:

X=7 y=2 a=`expr $x + $y` ; mwangwi a=$a a=`expr $a + 1` ; echo a=$a b=`expr $y - $x` ; echo b=$b c=`expr $x "*" $y` ; echo c=$c d=`expr $x / $y` ; echo d=$d e=`expr $x % $y` ; mwangwi e=$e

itaonyeshwa kwenye skrini

A=9 a=10 b=-5 c=14 d=3 e=1

Operesheni ya kuzidisha ("*") lazima iepukwe, kwa kuwa kwenye ganda ikoni hii inatambulika kama herufi maalum, kumaanisha kuwa mlolongo wowote wa herufi unaweza kubadilishwa mahali hapa. Kwa amri ya "expr", sio tu (jumla) shughuli za hesabu zinawezekana, lakini pia zile za kamba:

A=`expr "cocktail" : "jogoo"` ; echo $A B=`expr "cocktail" : "tail"` ; echo $B C=`expr "cocktail" : "pika"` ; echo $C D=`expr "jogoo" : "cocktail"` ; mwangwi $D

Nambari zitaonyeshwa kwenye skrini inayoonyesha idadi ya wahusika wanaolingana kwenye minyororo (tangu mwanzo). Mstari wa pili hauwezi kuwa mrefu kuliko wa kwanza:

4 0 0 0

Kuhamisha vigeu vya UNIX OS ina dhana ya mchakato. Mchakato hutokea wakati amri inatekelezwa. Kwa mfano, wakati wa kuandika "p" kwenye kibodi "mchakato "p" huzaliwa. Kwa upande mwingine, "p" inaweza kuibua michakato mingine. Hebu tuchukulie kwamba "p" huita "p1" na "p2", ambayo kwa mfululizo huzaa michakato inayolingana. Kila mchakato una mazingira yake - a seti ya vigeu vinavyopatikana kwake Kwa mfano, kabla ya kuzindua "p" tayari kulikuwa na mazingira ambayo baadhi ya viambajengo vilikuwa vimefafanuliwa.Kuzindua "p" huleta mazingira mapya;"p1" na "p2" tayari yatatolewa ndani yake. Vigezo ni vya ndani kwa mchakato ambao walitangaza, yaani, ambapo wamepewa thamani. Ili ziweze kupatikana kwa michakato mingine iliyozalishwa, lazima zipitishwe kwa uwazi. Ili kufanya hivyo, tumia amri iliyojumuishwa ya "kuuza nje".

Chaguo

Vigezo vinaweza kupitishwa kwa faili ya amri. Ganda hutumia vigezo vya msimamo (yaani, mpangilio ambao wanaonekana ni muhimu). Katika faili ya amri, vigezo vinavyolingana na vigezo (sawa na vigezo vya shell) huanza na ishara "$", ikifuatiwa na moja ya nambari kutoka 0 hadi 9: Hebu "mtihani-1" iitwe na vigezo "jogoo" na "mkia". Vigezo hivi huenda kwenye mazingira mapya chini ya majina ya kawaida "1" na "2". Tofauti (ya kawaida) inayoitwa "0" itahifadhi jina la hesabu inayoitwa. Wakati wa kufikia vigezo, nambari inatanguliwa na ishara ya dola "$" (kama wakati wa kufikia vigezo): $ 0 inafanana na jina la faili hii ya amri; $1 ni kigezo cha kwanza kwa mpangilio; Kigezo cha sekunde $2, nk. Kwa kuwa idadi ya vigezo ambavyo vigezo vinaweza kupitishwa ni mdogo kwa tarakimu moja, i.e. 9 ("0", kama ilivyoonyeshwa tayari, ina maana maalum), basi kwa maambukizi zaidi vigezo, amri maalum "kuhama" hutumiwa. Amri ya "kuweka" hutoa mbinu ya kipekee kwa vigezo. Kwa mfano, kipande

Weka b kwa mwangwi first=$1 second=$2 third=$3

itaonyeshwa kwenye skrini

Ya kwanza=sekunde=b ya tatu=c

hizo. amri ya "kuweka" inaweka maadili ya parameter. Hii inaweza kuwa rahisi sana. Kwa mfano, amri ya "tarehe" inaonyesha tarehe ya sasa, sema "Mon Mei 01 12:15:10 2000", inayojumuisha maneno matano, kisha

Weka `tarehe` mwangwi $1 $3 $5

itaonyeshwa kwenye skrini

Jumatatu 01 2000

Amri ya "kuweka" pia inakuwezesha kudhibiti utekelezaji wa programu, kwa mfano: kuweka -v mistari ni pato kwa terminal, kusoma na shell. set +v hughairi hali ya awali. set -x prints amri kwa terminal kabla ya utekelezaji. set +x hughairi hali ya awali. Amri ya "kuweka" bila vigezo inaonyesha hali ya mazingira ya programu kwenye terminal.

Ubadilishaji wa shell

Kabla ya kutafsiri moja kwa moja na kutekeleza amri zilizomo katika faili za amri, shell hufanya aina mbalimbali za uingizwaji: 1. KUBADILISHA MATOKEO. Amri zote zilizoambatanishwa katika nukuu za nyuma hutekelezwa na matokeo hubadilishwa mahali pake. 2. KUBADILISHA MAADILI YA VIGEZO NA VIGEZO. Hiyo ni, maneno yanayoanza na "$" yanabadilishwa na maadili yanayolingana ya vigezo na vigezo. 3. KUTAFSIRI MAPENGO. Nafasi zilizotoroshwa hazizingatiwi. 4. KUZALISHA MAJINA YA FAILI. Maneno yanaangaliwa kwa uwepo wa wahusika maalum ("*", "?","") na vizazi vinavyofanana vinafanywa. Mazingira ya Programu Kila mchakato una mazingira ambamo unaendeshwa. Shell hutumia idadi ya anuwai hizi za mazingira. Ukiandika amri ya "weka" bila vigezo, skrini itaonyesha habari kuhusu idadi ya vigeu vya kawaida vilivyoundwa wakati wa kuingia (na kisha kupitishwa kwa michakato yako yote mpya "iliyorithiwa"), na vile vile vigeu vilivyoundwa na kusafirishwa na michakato yako. . Aina maalum na maudhui ya pato la habari inategemea kwa kiasi kikubwa juu ya toleo gani la UNIX linatumiwa na jinsi mfumo umewekwa.

Matokeo ya kutekeleza amri iliyowekwa bila vigezo (si kamili):

HOME=/root PATH=/usr/local/bin:/usr/bin:/bin:.:/usr/bin/X11: IFS= LOGNAME=sae MAIL=/var/spool/mail/sae PWD=/home/ sae/SUDY/SHELL PS1=$(PWD):" " PS2=> SHELL=/bin/bash

Wacha tutoe maoni juu ya maadili ya anuwai. HOME=/root ni jina la saraka ya nyumbani ambapo mtumiaji huishia baada ya kuingia. Hiyo ni, baada ya kuingiza jina na nenosiri kwa usahihi, nitajipata kwenye saraka ya "/ mizizi". PATH=/bin:/usr/bin:.:/usr/local/bin:/usr/bin/X11 - tofauti hii inabainisha mlolongo wa faili ambazo shell hutafuta katika kutafuta amri. Majina ya faili yanatenganishwa hapa na koloni. Mlolongo wa kutazama unalingana na mpangilio wa majina kwenye njia. Lakini mwanzoni utafutaji hutokea kati ya kinachojulikana kama amri zilizojengwa. Amri zilizojumuishwa ni pamoja na amri zinazotumiwa sana, kama vile "echo", "cd", "pwd", "tarehe". Baada ya hayo, mfumo unaangalia kupitia saraka ya "/ bin", ambayo inaweza kuwa na amri "sh", "cp", "mv", "ls", nk. Kisha saraka "/ usr/bin" na amri "paka", "ss", "expr", "nroff", "mtu" na wengine wengi. Ifuatayo, utafutaji unafanyika katika saraka ya sasa ("", au jina lingine "tupu", yaani ""), ambapo amri ulizoandika zinapatikana zaidi. Baada ya kuandika mstari wa amri na kushinikiza "ganda" (baada ya kufanya vibadala vinavyohitajika) hutambua jina linalolingana na amri na hulitafuta katika saraka zilizoorodheshwa katika PATH. Ikiwa amri itawekwa nje ya saraka hizi, haitapatikana. Ikiwa kuna amri kadhaa zilizo na jina moja, moja iliyo kwenye saraka iliyotazamwa kwanza itaitwa. PATH, kama vigeu vingine, inaweza kubadilishwa kwa urahisi kwa kuongeza, kupanga upya, au kufuta saraka. IFS= (Kitenganishi cha Sehemu ya Ndani) huorodhesha herufi zinazotumika kutenganisha maneno (sehemu). Hizi ni "nafasi", "tabo" na "mlisho wa mstari", kwa hiyo hapa hakuna kitu kinachoonekana upande wa kushoto wa mgawo na mistari miwili inachukuliwa. LOGNAME=mzizi - jina la kuingia ("jina la mtumiaji"). MAIL=/var/spool/mail/root - jina la faili ambalo (barua-pepe) hupokelewa. PWD=/mzizi - jina la saraka ya sasa PS1=$(PWD): " " - aina ya saraka. Katika kesi hii, mhamasishaji ataonyesha jina la saraka ya sasa ikifuatiwa na koloni na nafasi. Hiyo ni, kutakuwa na "/root: ". PS2=> - kidokezo hiki (hapa ">") kinatumika kama mwaliko wa kuendelea kuingiza (katika mstari unaofuata) amri ambayo haijakamilika. Kwa mfano, chapa mabano ya ufunguzi "(" na baada ya kushinikiza katika mstari unaofuata utaona kishawishi hiki. Ikiwa hujui cha kufanya baadaye, chapa mabano ya kufunga ")" na itatoweka. SHELL=/bin/sh - Tofauti hii inabainisha ganda ambalo mtumiaji anatumia. Katika kesi hii, shell ya kawaida ("sh") hutumiwa. Mazingira ya awali husakinishwa kiotomatiki unapoingia kwa kutumia faili kama "/etc/rc" na "/etc/.profile". Njia moja ya kubadilisha mazingira kwa urahisi (kwa mfano, njia ya utafutaji ya amri, aina ya programu, aina ya ganda, rangi ya skrini, n.k.) ni kwa kuweka maelezo haya kwenye orodha yako ya nyumbani katika faili maalumu ".profile" ($(HOME)/ . wasifu), ikikabidhi maadili yanayohitajika vigezo vya mazingira. Hiyo ni, piga faili hii kwenye kihariri na uandike chochote unachotaka). Kisha, kila wakati unapoingia, faili hii itatekelezwa kiotomatiki na kusakinisha mazingira mapya. Faili hii LAZIMA iwekwe kwenye orodha yako ya HOME (saraka ya kuingia). Inapaswa kukumbushwa katika akili kwamba majina ya faili yanayoanza na nukta kwa ujumla yana hali maalum. Kwa hivyo, hazionyeshwa kwenye skrini na amri rahisi ya "ls" - lazima uita amri hii na bendera "-a". Kwa njia, haziharibiwi bila ubaguzi na amri ya "rm *". Mimi mwenyewe mkalimani wa shell inapeana maadili kiotomatiki kwa anuwai zifuatazo (vigezo): ? thamani iliyorejeshwa na amri ya mwisho; Nambari ya mchakato wa $; ! nambari ya mchakato wa nyuma;

  1. idadi ya vigezo vya nafasi vilivyopitishwa kwenye ganda;
  • orodha ya vigezo kama mstari mmoja;

@ orodha ya vigezo, kama seti ya maneno; - bendera zilizopitishwa kwenye ganda. Wakati wa kufikia vigezo hivi (yaani, wakati wa kutumia katika faili ya amri - mpango wa shell), unapaswa kuweka "$" mbele. Jukumu muhimu katika kuunda faili za kipekee linachezwa na tofauti maalum "$$", thamani ambayo inalingana na idadi ya mchakato unaofanya hesabu hii. Kila hesabu mpya inayofanywa na kompyuta huanzisha mchakato mmoja au zaidi ambao hupokea nambari kiotomatiki kwa mpangilio. Kwa hivyo, kwa kutumia nambari ya mchakato kama jina la faili, unaweza kuwa na uhakika kwamba kila faili mpya itakuwa na jina jipya (halitaandikwa badala ya lililopo). Faida pia ni hasara kuu ya njia hii ya kutaja faili. Haijulikani ni majina gani yatapewa faili. Na, ikiwa ndani ya mfumo wa mchakato huu unaweza kupata faili "bila kuangalia," yaani, kwa kuipata kwa kutumia $$, basi faili hizo zinaweza kupotea kwa urahisi. Hii inaunda matatizo ya ziada wakati wa kurekebisha programu. Kumwita mkalimani Baada ya kusajili mtumiaji katika mfumo (kwa kutumia amri ya kuingia), mkalimani wa lugha ya SHELL anaitwa. Ikiwa saraka ya usajili wa mtumiaji ina faili ya .profile, basi kabla ya angalau amri moja kupokea kutoka kwa terminal, mkalimani anatekeleza faili hii (inadhaniwa kuwa faili ya .profile ina amri). Wakati wa kupiga simu, funguo zifuatazo zinaweza kubainishwa: -c string Amri zinasomwa kutoka kwa kamba iliyotolewa. -s Amri zinasomwa kutoka kwa uingizaji wa kawaida. Ujumbe wa mkalimani huandikwa kwa faili ya kawaida ya uchunguzi. -i Hali ya uendeshaji inayoingiliana. Ikiwa tabia ya kwanza ya parameter "0" ni - ishara, basi amri zinasomwa kutoka kwa faili ya .profile.

MIUNDO YA PROGRAM===

Kama ilivyo katika lugha yoyote ya programu, maandishi ya shell yanaweza kuwa na maoni. Alama ya "#" inatumika kwa hili. Kila kitu kilicho kwenye mstari (kwenye faili ya amri) upande wa kushoto wa mhusika huyu hugunduliwa na mkalimani kama maoni. Kwa mfano,

#Haya ni maoni.

Kama lugha yoyote ya utaratibu wa programu, lugha ya shell ina waendeshaji. Idadi ya waendeshaji hukuruhusu kudhibiti mlolongo wa utekelezaji wa amri. Katika waendeshaji vile, mara nyingi ni muhimu kuangalia hali, ambayo huamua mwelekeo ambao mahesabu yanaendelea.

Mtihani ("") amri

Amri ya jaribio huangalia kuwa hali fulani imefikiwa. Chaguo la lugha ya Shell na taarifa za kitanzi hutolewa kwa kutumia amri hii (iliyojengwa ndani). Fomu mbili za amri zinazowezekana:

Hali ya mtihani

[hali]

tutatumia chaguo la pili, i.e. Badala ya kuandika neno "mtihani" kabla ya hali hiyo, tutafunga hali hiyo kwenye mabano, ambayo ni ya kawaida zaidi kwa watengeneza programu. Kwa kweli, ganda litatambua amri hii kwa mabano ya ufunguzi "[" kama neno linalolingana na amri ya "mtihani". Lazima kuwe na nafasi kati ya mabano na hali iliyomo. Lazima pia kuwe na nafasi kati ya thamani na ishara ya ulinganisho au operesheni. Gamba hutumia hali ya "aina" mbalimbali. MASHARTI YA KUANGALIA FAILI: -f file file "faili" ni faili ya kawaida; -d faili ya faili "faili" - saraka; -с faili ya faili "faili" ni faili maalum; -r faili ina ruhusa ya kusoma faili "faili"; -w faili ina ruhusa ya kuandika faili "faili"; -s faili "faili" sio tupu.

MASHARTI YA NAMBA ZA KUJARIBU: str1 = mifuatano ya str2 "str1" na "str2" inayolingana; str1 != str2 masharti "str1" na "str2" si sawa; -n str1 kamba "str1" ipo (isiyo tupu); -z str1 kamba "str1" haipo (tupu). Mifano.

X="nani ni nani"; kuuza nje x; [ "who is who" = "$x" ]; echo $? 0 x=abc ; kuuza nje x ; [ abc = "$x" ] ; echo $? 0 x=abc ; kuuza nje x ; [ -n "$x" ] ; echo $? 0 x="" ; kuuza nje x ; [ -n "$x" ] ; echo $? 1

Kwa kuongeza, kuna mbili maadili ya kawaida masharti ambayo yanaweza kutumika badala ya hali (hakuna mabano inahitajika kwa hili). MASHARTI YA KULINGANISHA VIUNGANISHI: x -eq y "x" ni sawa na "y", x -ne y "x" si sawa na "y", x -gt y "x" ni kubwa kuliko "y", x - ge y "x" ni kubwa kuliko au sawa na "y", x -lt y "x" chini ya "y", x -le y "x" chini ya au sawa na "y". MASHARTI TATA: Inatekelezwa kwa kutumia utendakazi wa kimantiki wa kawaida: ! (si) hubadilisha thamani ya msimbo wa kutoka. -o (au) inalingana na mantiki "OR". -a (na) inalingana na mantiki "NA".

Taarifa ya masharti "ikiwa"

Kwa ujumla, taarifa ya "ikiwa" ina muundo

Ikiwa hali basi orodhesha

Hapa "elif" toleo fupi la "else if" linaweza kutumika pamoja na kamili, i.e. kuweka nambari kiholela ya taarifa za "ikiwa" (pamoja na taarifa zingine) inaruhusiwa. Bila shaka, "orodha" katika kila kesi lazima iwe na maana na kukubalika katika muktadha uliotolewa. Muundo uliopunguzwa zaidi wa mwendeshaji huyu

Ikiwa hali basi orodhesha fi

ikiwa sharti limetimizwa (kwa kawaida hapa ndipo nambari ya kukamilisha "0" inapokewa), basi "orodha" inatekelezwa, vinginevyo inarukwa. Mifano: Acha "ikiwa-1" iandikwe.

Ikiwa [ $1 -gt $2]

kisha pwd mwingine mwangwi $0: Hujambo!

Kisha kupiga simu if-1 12 11 itazalisha /home/sae/STUDY/SHELL na if-1 12 13 itazalisha if-1: Hello!

Piga simu opereta ("kesi")

Opereta ya uteuzi wa "kesi" ina muundo:

Mfuatano wa kesi ndani

template) orodha ya amri; template) orodha ya amri; ... template) orodha ya amri;;

Hapa "kesi", "katika" na "esac" ni maneno ya utendaji. "Kamba" (hii inaweza kuwa tabia moja) inalinganishwa na "muundo". "Orodha ya amri" ya mstari uliochaguliwa inatekelezwa. ";;" inaonekana isiyo ya kawaida mwishoni mwa mistari ya uteuzi, lakini andika ";" hapa itakuwa ni kosa. Amri nyingi zinaweza kutekelezwa kwa kila mbadala. Ikiwa amri hizi zimeandikwa kwenye mstari mmoja, basi ishara ";" itatumika kama kitenganishi cha amri. Kwa kawaida mstari wa mwisho wa uteuzi una muundo "*", ambao katika muundo wa "kesi" unamaanisha "thamani yoyote". Mstari huu umechaguliwa ikiwa thamani ya kigezo (hapa $z) hailingani na muundo wowote ulioandikwa hapo awali uliotengwa na mabano ")". Thamani hutazamwa kwa mpangilio ulioandikwa.

Opereta ya kitanzi iliyohesabiwa ("kwa")

Opereta ya "kwa" ina muundo:

Kwa jina

fanya orodha ya amri zilizofanywa ambapo "kwa" ni neno kisaidizi ambalo linafafanua aina ya kitanzi, "fanya" na "fanya" ni maneno saidizi ambayo huangazia mwili wa kitanzi. Acha amri ya "lsort" iwakilishwe na faili ya batch

Kwa mimi katika file_1 file_2 file_3 kufanya proc_sort $i nimefanya

Katika mfano huu, jina "i" hufanya kama parameta ya kitanzi. Jina hili linaweza kuzingatiwa kama kigezo cha ganda ambacho maadili yaliyoorodheshwa yamepewa kwa mpangilio (i=file_1, i=file_2, i=file_3), na amri ya "proc_sort" inatekelezwa kwa kitanzi. Fomu "kwa i katika *" hutumiwa mara nyingi, ikimaanisha "kwa faili zote kwenye saraka ya sasa". Acha "proc_sort" nayo iwakilishwe na faili batch

Paka $1 | aina | tee /dev/lp > $(1)_sorted

hizo. faili zilizobainishwa hupangwa kwa mpangilio, matokeo ya upangaji huchapishwa ("/dev/lp") na kutumwa kwa faili_1_iliyopangwa faili_2_iliyopangwa na faili_3_kupangwa.

Taarifa ya kitanzi na hali halisi ("wakati")

Muundo wa "wakati", ambao pia hufanya mahesabu, ni bora wakati orodha halisi ya maadili ya parameta haijulikani mapema au orodha hii lazima ipatikane kama matokeo ya mahesabu kwenye kitanzi. Taarifa ya kitanzi "wakati" ina muundo:

Wakati hali

fanya orodha ya amri zilizofanywa ambapo "wakati" ni neno kisaidizi ambalo huamua aina ya kitanzi kilicho na hali halisi. Orodha ya amri katika mwili wa kitanzi (kati ya "fanya" na "imefanywa") inarudiwa hadi hali ibaki kuwa kweli (yaani, msimbo wa kukamilisha amri ya mwisho katika mwili wa kitanzi ni "0") au kitanzi hakijaingiliwa. kutoka ndani kwa amri maalum ( "kuvunja", "endelea" au "toka"). Unapoingia kwanza kitanzi, hali lazima iwe kweli. Amri ya "break [n]" hukuruhusu kujiondoa kwenye kitanzi. Ikiwa "n" haipo, basi ni sawa na "kuvunja 1". "n" inaonyesha idadi ya vitanzi vilivyowekwa kiota kutoka, kwa mfano, "break 3" - kutoka kwa vitanzi vitatu vilivyowekwa. Tofauti na amri ya "kuvunja", amri ya "endelea [n]" inasimamisha tu utekelezaji wa kitanzi cha sasa na inarudi kwenye MWANZO wa kitanzi. Inaweza pia kuwa na parameter. Kwa mfano, "endelea 2" inamaanisha kutoka hadi mwanzo wa pili (kuhesabu kutoka kwa kina) kitanzi kilichowekwa. Amri ya "toka [n]" inakuwezesha kuondoka kwa utaratibu kabisa na msimbo wa kurudi wa "0" au "n" (ikiwa parameter ya "n" imetajwa). Amri hii inaweza kutumika katika zaidi ya vitanzi tu. Hata katika mlolongo wa amri, inaweza kuwa muhimu katika kurekebisha hitilafu kusimamisha hesabu (ya sasa) katika hatua fulani.

Taarifa ya kitanzi yenye hali ya uwongo ("mpaka")

Opereta ya "mpaka" ina muundo:

Mpaka hali

fanya orodha ya amri zilizofanywa ambapo "mpaka" ni neno kisaidizi ambalo huamua aina ya kitanzi na hali ya uwongo. Orodha ya amri katika mwili wa kitanzi (kati ya "fanya" na "imefanywa") inarudiwa hadi hali ibaki ya uwongo au kitanzi kinaingiliwa kutoka ndani na amri maalum ("kuvunja", "endelea" au "kutoka" ) Mara ya kwanza unapoingia kwenye kitanzi, hali haipaswi kuwa kweli. Tofauti kutoka kwa opereta "wakati" ni kwamba hali ya kitanzi inakaguliwa kwa uwongo (kwa nambari ya kutoka isiyo ya sifuri ya amri ya mwisho ya mwili wa kitanzi) na inaangaliwa BAADA ya kila (pamoja na ya kwanza!) Utekelezaji wa amri kwenye mwili wa kitanzi. Mfano.

Mpaka uwongo ufanye

soma x ikiwa [$x = 5] kisha mwangwi vya kutosha; kuvunja mwingine echo baadhi fi zaidi

Hapa kuna programu na kitanzi kisicho na mwisho inasubiri maneno kuingizwa (kurudia maneno "mengine zaidi" kwenye skrini) hadi "5" iingizwe. Baada ya hayo, "kutosha" hutolewa na amri ya "kuvunja" huacha kutekeleza kitanzi.

Opereta tupu

Taarifa tupu ina umbizo

:

Bila kufanya chochote. Hurejesha thamani "0".

Kazi katika shell

Kazi inakuwezesha kuandaa orodha ya amri za shell kwa utekelezaji unaofuata. Maelezo ya kazi inaonekana kama:

Jina () (orodha ya amri)

baada ya hapo kazi inaitwa kwa jina. Wakati kazi inatekelezwa, hakuna mchakato mpya unaoundwa. Inaendesha katika mazingira ya mchakato unaolingana. Hoja za chaguo za kukokotoa huwa vigezo vyake vya nafasi; jina la kazi ni parameter yake ya sifuri. Unaweza kukatiza utekelezaji wa chaguo za kukokotoa kwa kutumia opereta "return [n]", ambapo (si lazima) "n" ni msimbo wa kurejesha.

Ushughulikiaji wa kukatiza ("mtego")

Inaweza kuwa muhimu kulinda utekelezaji wa programu kutokana na kukatizwa. Mara nyingi hukutana na usumbufu ufuatao unaolingana na ishara: 0 kutoka kwa mkalimani, 1 kata simu (kukatwa kwa mteja wa mbali), kukatizwa 2 kutoka , 9 uharibifu (haujaingiliwa), 15 mwisho wa utekelezaji. Ili kulinda dhidi ya kukatizwa, kuna amri ya "mtego", ambayo ina umbizo:

Mtego "orodha ya amri" ishara

Ikiwa usumbufu unatokea kwenye mfumo, ambao ishara zake zimeorodheshwa zimetenganishwa na nafasi katika "ishara", basi "orodha ya amri" itatekelezwa, baada ya hapo (ikiwa amri ya "kutoka" haikutekelezwa katika orodha ya amri) udhibiti utafanywa. kurudi kwenye hatua ya usumbufu na utekelezaji wa faili ya amri utaendelea. Kwa mfano, ikiwa kabla ya kukatiza utekelezaji wa faili ya amri ni muhimu kufuta faili katika "/tmp", basi hii inaweza kufanyika kwa amri ya "mtego":

Mtego "rm /tmp/* ; toka 1" 1 2 15

ambayo hutangulia amri zingine kwenye faili. Hapa, baada ya kufuta faili, faili ya amri itatoka.

    Mifumo ya uendeshaji Familia ya Linux, kama OS nyingine yoyote, inadhani uwepo wa kiolesura cha mwingiliano kati ya vipengele vya mfumo wa kompyuta na mtumiaji wa mwisho, yaani, uwepo wa safu ya programu ambayo hutoa pembejeo ya amri na vigezo ili kupata matokeo yaliyohitajika. Vile kiwango cha programu nilipata jina "ganda" au, kwa Kiingereza - ganda.

Ganda ni nini?

Kamba ya amri ( ganda) hutoa mwingiliano kati ya mtumiaji na mazingira ya mfumo wa uendeshaji wa Linux. Yeye ni maalumu bidhaa ya programu, ambayo inahakikisha utekelezaji wa amri na kupata matokeo ya utekelezaji wao, au, ili kuiweka kwa urahisi sana, shell ni mpango ambao umeundwa ili kuhakikisha utekelezaji wa programu nyingine kwa ombi la mtumiaji. Mfano wa shell inaweza kuwa, kwa mfano, mkalimani wa amri amri.com mfumo wa uendeshaji MS DOS, au shell bash vyumba vya upasuaji Mifumo ya Unix/Linux.

Magamba yote yana kazi na mali sawa, kwa mujibu wa madhumuni yao kuu - kutekeleza amri za mtumiaji na kuonyesha matokeo ya utekelezaji wao:

Tafsiri ya mstari wa amri.

Upatikanaji wa amri na matokeo ya utekelezaji wao.

Msaada kwa vigezo, wahusika maalum na maneno yaliyohifadhiwa.

Inachakata faili, shughuli pembejeo ya kawaida na pato.

Utekelezaji wa lugha maalum ya programu ya shell.

    Kwa mifumo ya uendeshaji ya familia ya Unix / Linux, inawezekana kutumia makombora kadhaa tofauti ambayo hutofautiana katika sifa na mbinu za mwingiliano na mfumo. Magamba ya kawaida ni

sh- shell Bourne , shell ya classic kwa Unix OS

bash ganda Bourne Tena(GNU Bourne-Again Shell). Labda shell ya kawaida kwa sasa katika mazingira ya Linux OS.

ksh- shell Korn, iliyoundwa kama ukuzaji wa ganda Bourne na historia ya mstari wa amri na uwezo wa kuhariri amri.

csh- shell C, kwa kutumia sintaksia ya lugha maarufu ya programu C

tcsh- toleo la shell C na uhariri wa mstari wa amri unaoingiliana.

Makombora kadhaa tofauti yanaweza kusakinishwa kwenye mfumo, na kila mtumiaji anaweza kutumia ganda lao la chaguo-msingi. Yote hii, bila shaka, inafanywa moja kwa moja wakati wa mchakato wa kupakua na usajili wa mtumiaji.

    Wakati wa mchakato wa upakiaji wa mifumo ya uendeshaji ya familia ya Linux, baada ya kupakia kernel ya mfumo, mfumo hubadilika hadi hali ya mwingiliano - hali ya mwingiliano kati ya mtumiaji na mfumo wa uendeshaji. Kwenye Linux, mchakato wa kwanza uliozinduliwa wakati wa buti ni programu ya init. ndani yake, ambayo inasoma yaliyomo kwenye faili ya usanidi /etc/inittab, huamua orodha na sifa za vituo vinavyopatikana kwenye mfumo, na huita programu ya kuingiliana ya kuingia Getty, ambayo hukuhimiza kuingiza jina lako la mtumiaji. Baada ya kuingia jina la mtumiaji na nenosiri, programu Getty inaita programu Ingia, ambayo hukagua uhalali akaunti, huenda kwenye saraka ya nyumbani ya mtumiaji na kupitisha udhibiti kwa programu ya kuanzisha kikao, ambayo kwa kawaida ni programu ya shell ya mtumiaji, ladha maalum ambayo imedhamiriwa na yaliyomo kwenye faili. /etc/passwd kwa akaunti hii. Kwa mfano:

user1:x:508:511::/home/user1:/bin/sh
interbase:x:510:511::/home/interbase:/bin/csh
apb:x:511:513:apb:/home/apb:/bin/bash

Kama inavyoweza kuonekana kutoka kwa yaliyomo kwenye faili /etc/passwd, kwa mtumiaji mtumiaji1 ganda litazinduliwa sh(Bourne shell), kwa mtumiaji interbase- shell csh(C shell) na kwa mtumiaji apb- shell bash(Bourne Tena) Baada ya ganda kuanza, haraka ya amri huonyeshwa kwenye skrini (kawaida katika mfumo wa ishara ya dola. $ ikiwa kazi inafanywa katika muktadha wa akaunti mtumiaji wa kawaida, au pound # , ikiwa ganda linatumika chini ya akaunti ya mtumiaji wa mizizi ( mzizi).

Wakati wa kutoka kwa ganda, kernel ya mfumo inarudisha udhibiti kwenye programu ndani yake, ambayo huanza tena mchakato wa kuingia na kuonyesha jina la mtumiaji kwenye terminal. Kuondoa ganda kunaweza kufanywa kwa moja ya njia mbili:

Kupitia timu Utgång kufanywa na mtumiaji

Wakati mchakato wa shell unapokea ishara kuua, iliyotumwa na kernel, kwa mfano wakati mfumo umewekwa upya.

Tafsiri ya mstari wa amri.

    Ingizo la mtumiaji katika kujibu swali la shell kawaida huitwa mstari wa amri au timu. Amri ya Linux ni safu ya herufi ya jina la amri na hoja, ikitenganishwa na nafasi. Hoja hutolewa kwa amri Chaguzi za ziada ambayo huamua tabia yake. Mara nyingi hutumika kama hoja chaguzi Na majina faili na saraka. Kwa mfano, mstari wa amri

ls -l faili01 faili02

Ina ls amri, chaguo la -l, na majina mawili ya faili file01 file02.

Wakati wa kutumia chaguzi kadhaa, zinaweza kuunganishwa. Kwa mfano, chaguo zifuatazo za amri ni sawa:

Ls -l -d
ls -ld

Amri ambazo ni sehemu ya ganda huitwa iliyojengwa ndani. Amri hizo ni pamoja na, kwa mfano, cd, kama, kesi, nk Kwa kawaida, amri zilizojengwa zinaweza kutofautiana kwa chaguo tofauti za shell. Mbali na amri zilizojengwa, inawezekana kutumia moduli za programu, ambazo ni faili za mtu binafsi zinazoweza kutekelezwa, au faili maandishi au matukio- kawaida faili za maandishi, iliyo na mistari ya amri ya ganda iliyotekelezwa kwa mpangilio. Baadhi ya hati (hati) zinaweza kutekelezwa na michakato ya Linux, kama vile kipanga ratiba cron. Kipanga ratiba kwa kawaida kimeundwa kutekeleza kiotomati kazi za usimamizi wa mfumo kwa ratiba. Kazi cron ni amri au hati na hutekelezwa kiotomatiki, bila uingiliaji kati wa kibinadamu, na inaweza kutekelezwa katika muktadha wa akaunti tofauti za watumiaji. Katika kesi ambapo kazi ya mpangilio inajumuisha kutekeleza hati, shida inatokea ya kuchagua ganda ambalo linapaswa kuzinduliwa kama mchakato wa mtoto. cron kusindika maagizo kutoka kwa faili ya hati - baada ya yote, ganda linaweza kuwa yoyote, na syntax ya hati, kama sheria, inahitaji matumizi ya ganda maalum ambalo limeandikwa. Ili kuondoa tatizo hili, katika mifumo ya uendeshaji ya Linux ni desturi ya kuonyesha katika mstari wa kwanza wa hati aina ya shell inayohitajika kwa utekelezaji wake, kwa fomu:

#!/bin/bash- kwa shell bash

#!/bin/sh- kwa shell sh

Ishara # ni ishara ya maoni na wahusika wanaoifuata hawafasiriwi kama amri. Mbinu hii hukuruhusu kutaja kwa uwazi ni ganda lipi linafaa kutumika kuchakata yaliyomo kwenye faili inayofuata. Ikiwa hati haina ingizo ambalo linafafanua kwa uwazi shell inayohitajika, basi mipangilio kutoka kwa akaunti katika muktadha ambao hati inatekelezwa itatumika. Katika kesi hii, inawezekana kwamba hati iliyoandikwa kwa ganda, kwa mfano, tch itapitishwa kwa ganda kwa utekelezaji bash, ambayo itafanya kuwa haiwezekani kutekeleza.

Wakati wa kutekeleza amri au hati, tumia vigezo vya mazingira (kwa Kingereza - mazingira, maadili ambayo yanaashiria mazingira ya programu ambayo amri hutekelezwa. Vigezo kama hivyo vinaweza kuwa na mipangilio ya jumla ya mfumo, vigezo vya ganda la picha au amri, njia za faili zinazoweza kutekelezwa, nk. Thamani za kutofautisha za mazingira zimewekwa katika kiwango cha mfumo (kwa watumiaji wote) na kwa kiwango maalum cha mtumiaji. Kuweka vigezo vya mazingira katika kiwango cha mfumo, yaliyomo kwenye faili hutumiwa:

/etc/profile- huweka vigezo tu kwa makombora ya amri. Inaweza kuendesha maandishi yoyote kwenye makombora yanayolingana na ganda la Bourne.

/etc/bash.bashrc- huweka vigezo tu kwa shells zinazoingiliana. Pia inaendesha maandishi ya bash.

/etc/mazingira- inayotumiwa na moduli ya PAM-env. Jozi pekee ndizo zinaweza kubainishwa katika faili hii jina=thamani.

Kila moja ya faili hizi ina programu yake mwenyewe, kwa hivyo unapaswa kuchagua kwa uangalifu ile inayofaa madhumuni yako. Kwa mfano, ikiwa unahitaji kuongeza saraka maalum ~/bin katika kutofautiana NJIA kwa watumiaji wote, weka msimbo ufuatao katika mojawapo ya faili za mfumo uanzishaji wa mazingira (/etc/profile au /etc/bash.bashrc):

# Ikiwa kitambulisho cha mtumiaji ni kikubwa kuliko au sawa na 1000 na kuna ~/bin saraka nayo

#haijaongezwa hapo awali kwa utofauti wa PATH,

# hamisha ~/bin hadi $PATH.

Ikiwa [[ $UID -ge 1000 && -d $HOME/bin && -z $(echo $PATH | grep -o $HOME/bin)

Hamisha PATH=$HOME/bin:$(PATH)

Kawaida katika vyumba vya uendeshaji Mifumo ya Linux, Kitambulisho cha Mtumiaji chini ya 1000 au chini ya 500 kinatumika kwa akaunti za huduma. KATIKA katika mfano huu, utofauti wa mazingira utawekwa kwa wote watumiaji wa ndani mifumo yenye kitambulisho cha 1000 au zaidi.

Ikiwa unahitaji kubadilisha mazingira kwa mtumiaji maalum, rekebisha yaliyomo kwenye mazingira ya mtumiaji:

- ~/.bash_profile, ~/.bash_login Nakadhalika. - faili za uanzishaji wa ganda kutoka kwa saraka ya nyumbani ya mtumiaji.

- ~/.wasifu- faili ya uanzishaji wa wasifu wa mtumiaji. Inatumiwa na makombora mengi kufafanua anuwai za mazingira.

~/.pam_mazingira- analog maalum ya faili /etc/environment, ambayo hutumiwa na moduli ya PAM-env.

Kwa mfano, kuongeza saraka ya mtumiaji ~/bin kwenye njia ya utafutaji ya faili zinazoweza kutekelezeka zilizobainishwa na kutofautisha NJIA, kwa mfano, kwa faili ~/.wasifu weka mstari:

export PATH="$(PATH):/home/user/bin"

Kuweka vigezo vya mazingira kwa programu za picha, yaliyomo kwenye faili za usanidi wa mazingira ya picha ya mtumiaji hutumiwa ~/.xinitrc

Mara nyingi zaidi, maadili ya anuwai ya mazingira yamewekwa kikao cha sasa mtumiaji. Kwa mfano, kuongeza saraka maalum ~/bin katika njia ya utaftaji wa faili zinazoweza kutekelezwa:

export PATH=~/bin:$PATH

Thamani mpya ya kutofautisha NJIA itaendelea tu hadi kipindi cha sasa cha mtumiaji kumalizika.

Kuangalia thamani ya kutofautiana, unaweza kutumia amri echo $variable, Kwa mfano:

mwangwi $PATH

Hivi sasa, ganda la kawaida, kama ilivyoelezwa hapo juu, ni bash. Hii inasababishwa hasa na ukweli kwamba shell bash ni sh- ganda la amri linalolingana, ambalo linaongeza huduma muhimu kutoka kwa ganda la Korn ( ksh) na ganda la C ( csh) Shell bash inaweza kuendesha maandishi mengi yaliyoandikwa chini ya lugha ya programu ya ganda bila marekebisho yoyote sh na inajaribu kupata karibu na kiwango iwezekanavyo POSIX, ambayo ilisababisha maboresho mengi, kwa programu na kwa matumizi hali ya mwingiliano. Katika utekelezaji wa kisasa bash kuna hali ya uhariri wa mstari wa amri, saizi isiyo na kikomo historia ya amri, zana za usimamizi wa kazi, uwezo wa kutumia lakabu, orodha pana ya amri zilizojengwa, kazi za ganda, n.k. Kwa ujumla, bash inafaa zaidi mahitaji ya mtumiaji wa kawaida, ambayo imeifanya itumike zaidi katika mazingira ya Linux.

Wakati wa kuanza bash bila vigezo vya mstari wa amri, shell huanza katika hali ya maingiliano, kuonyesha amri ya amri kwenye skrini. Ganda linaloingiliana kawaida husoma data kutoka kwa terminal ya mtumiaji na huandika data kwa terminal sawa, kifaa cha kawaida Kifaa cha kuingiza ni kibodi, na kifaa cha kawaida cha kutoa ni onyesho. Mtumiaji huingiza amri kwenye kibodi, na matokeo ya utekelezaji wao yanaonyeshwa kwenye maonyesho.

  • Mafunzo

Kwa nini na kwa nani makala hiyo?

Hapo awali, hii ilikuwa ukumbusho kwa wanafunzi ambao wanaanza kufanya kazi na mifumo kama Unix. Kwa maneno mengine, makala hiyo inalenga kwa wale ambao hawana uzoefu wa awali wa kufanya kazi na mstari wa amri ya Unix, lakini kwa sababu moja au nyingine wanataka au wanahitaji kujifunza jinsi ya kuingiliana kwa ufanisi nayo.

Hakutakuwa na kusimuliwa tena kwa mana (hati), na kifungu hakighairi au kuchukua nafasi ya kuzisoma. Badala yake, nitazungumzia juu ya mambo makuu (amri, mbinu na kanuni) ambazo unahitaji kuelewa tangu mwanzo wa kufanya kazi katika shell ya unix ili kazi iwe yenye ufanisi na ya kufurahisha.

Nakala hii inahusu mazingira kamili kama unix, yenye ganda linalofanya kazi kikamilifu (ikiwezekana zsh au bash) na anuwai nyingi programu za kawaida.

Shell ni nini

Shell (shell, aka "mstari wa amri", aka CLI, aka "console", aka "terminal", aka "dirisha nyeusi na herufi nyeupe") ni kiolesura cha maandishi cha kuwasiliana na mfumo wa uendeshaji (vizuri, madhubuti ninamaanisha, hii. ni programu, ambayo hutoa kiolesura kama hicho, lakini sasa tofauti hii haina maana).

Kwa ujumla, fanya kazi kupitia ganda inaonekana kama hii: mtumiaji (yaani wewe) huingiza amri kutoka kwa kibodi, bonyeza Enter, mfumo hutoa amri, huandika matokeo ya utekelezaji kwenye skrini, na tena subiri amri inayofuata. ya kuingizwa.

Aina ya kawaida ya ganda:

Ganda ndio njia kuu ya kuingiliana na mifumo yote ya seva kama Unix.

Mifumo ya mstari wa amri inapatikana wapi?

Ambapo ganda la unix linaweza kuwa linakungoja, chaguzi maarufu:
  • MacOS (bash);
  • ufikiaji wa mbali kwa seva kwa kazi au mradi wa kibinafsi wa wavuti;
  • seva ya faili ya nyumbani na ufikiaji wa mbali;
  • Ubuntu, PC-BSD kwenye kompyuta ndogo/desktop - mifumo inayofanana na unix leo ni rahisi kusakinisha na kutumia.

Ni shida gani zinazofaa kusuluhisha na ganda?

Kazi za asili ambazo ganda linafaa, muhimu na la lazima:
  • kazi ya maingiliano katika terminal:
    • kufanya mkusanyiko, kuendesha kazi kupitia make;
    • kulinganisha faili za maandishi;
    • uchambuzi wa haraka wa data ya matangazo (idadi ya IP za kipekee kwenye logi, usambazaji wa rekodi kwa saa/dakika, n.k.);
    • vitendo vya wingi wa wakati mmoja (kuua michakato mingi; ikiwa unafanya kazi na mfumo wa udhibiti wa toleo, pindua au suluhisha kundi la faili);
    • utambuzi wa kile kinachotokea katika mfumo (semaphores, kufuli, michakato, maelezo, nafasi ya diski, nk);
  • uandishi:
    • maandishi ya ufungaji, ambayo huwezi kutegemea uwepo wa wakalimani wengine - hii sio kwa Kompyuta;
    • kazi za kubinafsisha shell inayoingiliana (inayoathiri mwaliko, kubadilisha saraka, kuweka vigezo vya mazingira) pia sio hasa kwa Kompyuta;
    • hati za wakati mmoja kama vile kuweka upya faili nyingi;
    • makefiles.

Hatua za kwanza kabisa

Hebu tuanze: ingia na uondoke

Hakikisha unajua jinsi ya kuanza ganda na jinsi ya kuiondoa.

Ikiwa unafanya kazi kwenye mashine iliyo na Ubuntu imewekwa, unahitaji kuzindua programu ya Terminal. Baada ya kumaliza, unaweza tu kufunga dirisha.

Kwenye MacOS - pia uzindua terminal.

Ili kufikia seva ya mbali- tumia ssh (ikiwa unayo MacOS, Ubuntu au mfumo mwingine kama unix ndani) au putty (ikiwa unayo Windows).

Mimi ni nani, niko wapi?

Endesha amri zifuatazo:
  • jina la mwenyeji - huonyesha jina la mashine (seva) uliyonayo sasa;
  • whoami - inaonyesha kuingia kwako (jina lako kwenye mfumo);
  • mti -d / | chini - uwakilishi wa pseudo-graphic wa mti wa saraka kwenye mashine; toka kutoka kwa kusonga - q ;
  • pwd - inaonyesha saraka uliyopo sasa; kwenye safu ya amri huwezi kuwa "vivyo hivyo", lazima uwe kwenye saraka fulani (=saraka ya sasa, saraka ya kufanya kazi). Saraka ya sasa ya kufanya kazi labda itaonyeshwa kwenye kidokezo chako.
  • ls - orodhesha faili ndani saraka ya sasa; ls / nyumbani - orodha ya faili kwenye saraka maalum;

Historia ya amri (historia)

Sifa muhimu ya safu kamili ya amri ni historia ya amri.

Tekeleza amri kadhaa: jina la mwenyeji, ls, pwd, whoami. Sasa bonyeza kitufe cha juu. Amri ya awali inaonekana kwenye mstari wa pembejeo. Unaweza kutumia vitufe vya juu na chini kusonga mbele na nyuma kupitia historia. Unapofika kwa jina la mwenyeji, bonyeza Enter - amri itatekelezwa tena.

Amri kutoka kwa historia haziwezi tu kutekelezwa mara kwa mara, lakini pia kuhaririwa. Tembea kupitia historia hadi ls amri, ongeza -l kubadili kwake (inageuka ls -l , kuna nafasi kabla ya minus, lakini sio baada). Bonyeza Ingiza - amri iliyobadilishwa itatekelezwa.

Kupitia historia, kuhariri na kutekeleza tena amri ni vitendo vya kawaida wakati wa kufanya kazi kwenye mstari wa amri, kwa hiyo izoea.

Nakili-bandika

Mstari wa amri ni wa maandishi sana: amri ni maandishi, data ya pembejeo kwa programu nyingi za kawaida ni maandishi, na matokeo mara nyingi ni maandishi.

Jambo kuu juu ya maandishi ni kwamba inaweza kunakiliwa na kubandikwa, na hii ni kweli kwenye safu ya amri pia.

Jaribu tarehe ya amri +"%y-%m-%d, %A"
Je, uliiingiza kabisa kwa mkono au umeinakili kutoka kwa makala? Hakikisha unaweza kuinakili, kuibandika kwenye terminal na kuitekeleza.

Mara tu unapojifunza jinsi ya kutumia man, hakikisha unaweza kunakili na kutekeleza amri za mfano kutoka kwa usaidizi.Kuangalia, tafuta sehemu ya MIFANO katika usaidizi wa programu ya tarehe, nakili na utekeleze mfano wa kwanza uliotolewa (ikiwa tu: the ishara ya dola sio sehemu ya amri , hii ni picha ya ishara ya haraka ya kuingiza).

Jinsi ya kunakili maandishi kutoka kwa terminal na kuiweka kwenye terminal inategemea mfumo wako na mipangilio yake, kwa hivyo, kwa bahati mbaya, haitawezekana kutoa maagizo ya ulimwengu wote. Kwenye Ubuntu, jaribu hii: nakala - chagua tu na panya, bandika - kitufe cha kati cha panya. Ikiwa haifanyi kazi, au ikiwa una mfumo tofauti, angalia kwenye mtandao au uulize marafiki wenye ujuzi zaidi.

Vifunguo na chaguzi

Wakati wa kutafiti historia ya amri, tayari umekutana na ukweli kwamba amri ya ls inayo angalau chaguzi mbili. Ikiwa utaiita kama hivyo, hutoa orodha rahisi:

Akira@latitude-e7240: ~/shell-survival-quide> ls Makefile shell-first-steps.md shell-first-steps.pdf shell-survival-quide.md shell-survival-quide.pdf
Ukiongeza -l swichi, maelezo ya kina yanaonyeshwa kwa kila faili:

Akira@latitude-e7240: ~/shell-survival-quide> ls -l jumla 332 -rw-rw-r-- 1 akira akira 198 Feb 13 11:48 Makefile -rw-rw-r-- 1 akira akira 15107 Feb 14 22:26 shell-first-steps.md -rw-rw-r-- 1 akira akira 146226 Feb 13 11:49 shell-first-hatua.pdf -rw-rw-r-- 1 akira akira 16626 Feb 13 11 :45 shell-survival-quide.md -rw-rw-r-- 1 akira akira 146203 Feb 13 11:35 shell-survival-quide.pdf
Hii ni sana hali ya kawaida: ikiwa marekebisho maalum (funguo, chaguzi, vigezo) huongezwa kwa simu ya amri, tabia ya amri inabadilika. Linganisha: mti / na mti -d / , jina la mwenyeji na jina la mwenyeji -f .

Kwa kuongeza, amri zinaweza kuchukua majina ya faili, majina ya saraka, au kwa urahisi mistari ya maandishi. Jaribu:

Ls -ld /home ls -l /home grep mzizi /etc/passwd

mtu

man - Msaada kwa amri na programu zinazopatikana kwenye mashine yako, pamoja na simu za mfumo na maktaba ya kawaida ya C.

Jaribu: man grep , man atoi , man chdir , man man .

Kusogeza mbele na nyuma kunafanywa kwa vitufe vya "juu", "chini", "PageUp", "PageDown", kutoka kwa mtazamo wa usaidizi hufanywa na kitufe cha q. Tafuta maandishi mahususi katika nakala ya usaidizi: bonyeza / (sogeza mbele), weka maandishi ili kutafuta, bonyeza Enter. Nenda kwa matukio yanayofuata - ufunguo n.

Makala yote ya usaidizi yamegawanywa katika kategoria. Muhimu zaidi:

  • 1 - mipango inayoweza kutekelezwa na amri za shell (wc, ls, pwd, nk);
  • 2 - simu za mfumo(uma, dup2, n.k.)
  • 3 - kazi za maktaba (printf, scanf, cos, exec).
Ni muhimu kuonyesha kutoka kwa jamii ambayo cheti inapaswa kuonyeshwa katika matukio ya bahati mbaya ya majina. Kwa mfano, man 3 printf inaelezea kazi kutoka kwa maktaba ya kawaida ya C, na man 1 printf inaelezea programu ya console yenye jina sawa.

Unaweza kutazama orodha ya nakala zote za usaidizi zinazopatikana kwenye mashine yako kwa kutumia man -k amri. (kitone pia ni sehemu ya komada).

kidogo

Unapokuwa kwenye dirisha ndogo la terminal unahitaji kutazama sana maandishi marefu(yaliyomo kwenye faili fulani, mtu mrefu, nk), hutumia programu maalum za "pager" (kutoka kwa ukurasa wa neno, ambayo ni, vipeperushi vya ukurasa). Kisogeza kinachojulikana zaidi ni kidogo, na ndicho kinachokupa usogezaji unaposoma kurasa za watu.

Jaribu na kulinganisha tabia:

Paka /etc/bash.bashrc paka /etc/bash.bashrc |less

Unaweza kuhamisha faili kwa paja moja kwa moja katika vigezo:

Chini /etc/bash.bashrc

Kusogeza juu na chini - vifungo "juu", "chini", "PageUp", "PageDown", toka - kifungo q. Tafuta maandishi maalum: bonyeza / (songa mbele), ingiza maandishi ili kutafuta, bonyeza Enter. Nenda kwa matukio yanayofuata - ufunguo n. (Je, unatambua maagizo kuhusu mwanadamu? Si ajabu, kidogo pia hutumiwa kuonyesha usaidizi.)

Haki

Faili au saraka yoyote inahusishwa na seti ya "haki": haki ya kusoma faili, haki ya kuandika faili, haki ya kutekeleza faili. Watumiaji wote wamegawanywa katika makundi matatu: mmiliki wa faili, kikundi cha wamiliki wa faili, na watumiaji wengine wote.

Unaweza kutazama ruhusa za faili kwa kutumia ls -l . Kwa mfano:

> ls -l Makefile -rw-r--r-- 1 akira wanafunzi 198 Feb 13 11:48 Makefile
Pato hili linamaanisha kuwa mmiliki (akira) anaweza kusoma na kuandika faili, kikundi (wanafunzi) wanaweza kusoma tu, na watumiaji wengine wote wanaweza kusoma tu.

Ukipokea ujumbe ulionyimwa ruhusa unapofanya kazi, hii inamaanisha kuwa huna haki za kutosha kwa kitu ulichotaka kufanya kazi nacho.

Soma zaidi katika man chmod.

STDIN, STDOUT, conveyors (mabomba)

Kuhusishwa na kila programu inayoendesha ni 3 mtiririko wa kawaida data: mtiririko wa data ya ingizo STDIN, mtiririko wa data ya pato STDOUT, mtiririko wa matokeo ya hitilafu STDERR.

Endesha programu ya wc, ingiza maandishi Siku njema leo, bonyeza Enter, ingiza maandishi siku njema, bonyeza Enter, bonyeza Ctrl + d. Programu ya wc itaonyesha takwimu za idadi ya herufi, maneno na mistari katika maandishi yako na mwisho:

> wc siku njema leo siku njema 2 5 24
Katika hali hii, ulitoa maandishi ya mistari miwili kwa STDIN ya programu, na ukapokea nambari tatu katika STDOUT.

Sasa endesha amri head -n3 /etc/passwd , inapaswa kuonekana kama hii:

> kichwa -n3 /etc/passwd root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x: 2:2:bin:/bin:/usr/sbin/nologin
Katika kesi hii, programu ya kichwa haikusoma chochote kutoka kwa STDIN, lakini iliandika mistari mitatu kwa STDOUT.

Unaweza kufikiria kwa njia hii: mpango ni bomba ambalo STDIN inapita na STDOUT inapita nje.

Sifa muhimu zaidi ya mstari wa amri ya Unix ni kwamba programu za "bomba" zinaweza kuunganishwa kwa kila mmoja: matokeo (STDOUT) ya programu moja yanaweza kupitishwa kama data ya pembejeo (STDIN) kwa programu nyingine.

Ujenzi huo wa mipango iliyounganishwa inaitwa bomba kwa Kiingereza, au conveyor au bomba kwa Kirusi.

Kuchanganya programu kwenye bomba hufanywa na ishara | (bar wima)

Endesha amri head -n3 /etc/passwd |wc , itaonekana kitu kama hiki:

> kichwa -n3 /etc/passwd |wc 3 3 117
Hapa ndivyo ilivyotokea: mpango wa kichwa hutoa mistari mitatu ya maandishi katika STDOUT, ambayo mara moja ilikwenda kwenye pembejeo ya programu ya wc, ambayo kwa upande wake ilihesabu idadi ya wahusika, maneno na mistari katika maandishi yaliyotokana.

Unaweza kuchanganya programu nyingi kama unavyopenda kwenye bomba. Kwa mfano, unaweza kuongeza programu nyingine ya wc kwenye bomba lililopita, ambalo litahesabu maneno na herufi ngapi zilikuwa kwenye matokeo ya wc ya kwanza:

> kichwa -n3 /etc/passwd |wc |wc 1 3 24

Kujenga mabomba (mabomba) ni kazi ya kawaida sana wakati wa kufanya kazi kwenye mstari wa amri. Kwa mfano wa jinsi hii inafanywa kwa mazoezi, soma sehemu "Kuunda bomba la mjengo mmoja."

Uelekezaji kwingine wa I/O

Pato (STDOUT) ya programu haiwezi tu kuhamishiwa kwenye programu nyingine kupitia bomba, lakini pia imeandikwa tu kwa faili. Uelekezaji huu unafanywa kwa kutumia > (kubwa kuliko ishara):

Tarehe > /tmp/today.txt
Kama matokeo ya kutekeleza amri hii, faili /tmp/today.txt itaonekana kwenye diski. Tazama yaliyomo kwa kutumia cat /tmp/today.txt

Ikiwa faili iliyo na jina sawa tayari ilikuwepo, yaliyomo yake ya zamani yataharibiwa. Ikiwa faili haikuwepo, itaundwa. Saraka ambayo faili imeundwa lazima iwepo kabla ya amri kutekelezwa.

Ikiwa hutaki kubatilisha faili, lakini badala yake ongeza matokeo hadi mwisho wake, tumia >> :

Tarehe >> /tmp/today.txt
Angalia kile kilichoandikwa kwenye faili sasa.

Kwa kuongeza, unaweza kupitisha faili yoyote kwenye programu badala ya STDIN. Jaribu:

Wc

Nini cha kufanya wakati kitu haijulikani

Ikiwa unakutana na tabia ya mfumo ambayo hauelewi, au unataka kufikia matokeo fulani, lakini haujui jinsi gani, nakushauri uendelee kwa utaratibu ufuatao (kwa njia, hii inatumika si tu kwa shells):
  • Kwa uwazi iwezekanavyo, tengeneza swali au kazi - hakuna kitu ngumu zaidi kuliko kutatua "kitu ambacho sijui nini";
  • kumbuka ikiwa tayari umekutana na shida sawa au sawa - katika kesi hii, inafaa kujaribu suluhisho ambalo lilifanya kazi mara ya mwisho;
  • soma kurasa za mtu zinazofaa (ikiwa unaelewa ni kurasa gani za mtu zinafaa katika kesi yako) - labda utapata mifano inayofaa ya kutumia amri, chaguo muhimu au viungo kwa amri nyingine;
  • fikiria: inawezekana kubadilisha kazi kidogo? - labda, kwa kubadilisha hali kidogo, utapata shida ambayo tayari unajua jinsi ya kutatua;
  • uliza swali lako lililoundwa kwa uwazi katika injini ya utafutaji - labda jibu linaweza kupatikana kwenye Stack Overflow au tovuti zingine;
Ikiwa hakuna yoyote ya hapo juu inayosaidia, tafuta ushauri kutoka kwa mwalimu, mwenzako mwenye ujuzi au rafiki. Na usiogope kuuliza maswali "ya kijinga" - sio aibu kutojua, ni aibu kutouliza.

Ikiwa unatatua shida ngumu (peke yako, kwa msaada wa Mtandao au watu wengine), andika suluhisho lako ikiwa shida kama hiyo itatokea tena kwako au kwa marafiki zako. Unaweza kurekodi katika faili rahisi ya maandishi, katika Evernote, au kuchapisha kwenye mitandao ya kijamii.

Mbinu za kazi

Nakili na ubandike- kutoka kurasa za watu, kutoka kwa makala kwenye StackOverflow, n.k. Mstari wa amri una maandishi, tumia fursa hii: nakala na tumia amri za mifano, andika matokeo yaliyofaulu kama kumbukumbu, yachapishe kwenye Twitter na blogu.

Vuta amri ya awali kutoka kwa historia, ongeza amri nyingine kwenye bomba, kukimbia, kurudia.Sentimita. Tazama pia sehemu ya "Kuunda bomba la mjengo mmoja."

Amri za msingi

  • badilisha kwa saraka nyingine: cd ;
  • kutazama yaliyomo kwenye faili: paka, chini, kichwa, mkia;
  • kudanganywa kwa faili: cp, mv, rm;
  • kutazama yaliyomo kwenye saraka: ls , ls -l , ls -lS ;
  • muundo wa saraka: mti , mti -d (saraka inaweza kupitishwa kama kigezo);
  • tafuta faili: find . -jina ...;

Uchanganuzi

  • wc, wc -l;
  • panga -k - panga kwa shamba maalum;
  • aina -n - kupanga nambari;
  • diff - kulinganisha faili;
  • grep , grep -v , grep -w , grep "\ " , grep -E - tafuta maandishi;
  • uniq , uniq -c - upekee wa kamba;
  • awk - katika awk "(chapisha $ 1)" chaguo, kuondoka tu shamba la kwanza kutoka kwa kila mstari, $ 1 inaweza kubadilishwa hadi $ 2, $ 3, nk;

Utambuzi wa mfumo

  • ps axuww - habari kuhusu michakato (programu zinazoendesha) zinazoendesha kwenye mashine;
  • juu - kutazama maingiliano ya michakato inayotumia rasilimali nyingi zaidi;
  • df - kutumika na nafasi ya bure ya disk;
  • du - saizi ya jumla ya faili kwenye saraka (kwa kurudia na subdirectories);
  • strace , ktrace - mfumo unaita mchakato gani;
  • lsof - ni faili gani mchakato hutumia;
  • netstat -na, netstat -nap - ambayo bandari na soketi zimefunguliwa kwenye mfumo.

Huenda usiwe na baadhi ya programu; zinahitaji kusakinishwa kwa kuongeza. Kwa kuongeza, baadhi ya chaguzi za programu hizi zinapatikana tu kwa watumiaji wenye upendeleo (mizizi).

Utekelezaji wa wingi na nusu otomatiki

Mara ya kwanza, ruka sehemu hii; utahitaji amri hizi na miundo unapofikia uandishi rahisi wa shell.
  • mtihani - kuangalia hali;
  • wakati wa kusoma - kitanzi mstari kwa mstari STDIN;
  • xargs - uingizwaji wa masharti kutoka kwa STDIN kwenye vigezo vya programu maalum;
  • seq - kizazi cha mlolongo wa nambari za asili;
  • () - kuchanganya pato la amri kadhaa;
  • ; - fanya jambo moja baada ya jingine;
  • && - tekeleza ikiwa amri ya kwanza imekamilika kwa mafanikio;
  • | - kutekeleza ikiwa amri ya kwanza inashindwa;
  • tee - duplicate pato la programu kwa STDOUT na faili kwenye diski.

Mbalimbali

  • tarehe - tarehe ya sasa;
  • curl - kupakua hati kutoka kwa url maalum na kuandika matokeo kwa STDOUT;
  • kugusa - sasisha tarehe ya kurekebisha faili;
  • kuua - tuma ishara kwa mchakato;
  • kweli - haifanyi chochote, inarudi kweli, muhimu kwa kuandaa vitanzi vya milele;
  • sudo - toa amri kama mzizi "a.

Kuunda bomba la mjengo mmoja

Wacha tuangalie mfano wa kazi halisi: tunahitaji kuua michakato yote ya seva-6 inayoendesha kama mtumiaji wa sasa.

Hatua ya 1.
Kuelewa ni programu gani hutoa takriban data muhimu, hata ikiwa sio katika hali yake safi. Kwa kazi yetu, inafaa kupata orodha ya michakato yote kwenye mfumo: ps sawa. Uzinduzi.

Hatua ya 2.
Angalia data iliyopokelewa kwa macho yako, njoo na kichungi ambacho kitatupa data isiyo ya lazima. Hii mara nyingi ni grep au grep -v . Tumia kitufe cha "Juu" kutoa amri iliyotangulia kutoka kwa historia, ikabidhi kichujio kilichobuniwa, na uikimbie.

Ps axuww |grep `whoami`
- michakato tu ya mtumiaji wa sasa.

Hatua ya 3.
Rudia hatua ya 2 hadi upate data safi unayohitaji.

"
- michakato yote iliyo na jina linalohitajika (pamoja, labda, zile za ziada kama vim task-6-server.c, nk),

Ps axuww |grep `whoami` | grep "\ " | grep -v vim ps axuww |grep `whoami` | grep "\ " | grep -v vim |grep -v less
- michakato tu na jina linalohitajika

Ps axuww |grep `whoami` | grep "\ " | grep -v vim |grep -v less |awk "(chapisha $2)"

Pids ya michakato inayohitajika, hatua ya 3 imekamilika

Hatua ya 4.
Tumia kidhibiti cha mwisho kinachofaa. Kutumia kitufe cha "Juu", tunatoa amri iliyotangulia kutoka kwa historia na kuongeza usindikaji ambao utakamilisha suluhisho la shida:

  • |wc -l kuhesabu idadi ya michakato;
  • > pids kuandika pids kwenye faili;
  • |xargs kuua -9 michakato ya kuua.

Kazi za mafunzo

Unataka kufanya mazoezi ya ujuzi mpya? Jaribu kazi zifuatazo:
  • pata orodha ya faili zote na saraka kwenye saraka yako ya nyumbani;
  • pata orodha ya vifungu vyote vya mtu kutoka kwa kitengo cha 2 (simu za mfumo);
  • hesabu ni mara ngapi neno grep linaonekana kwenye ukurasa wa mtu wa programu ya grep;
  • hesabu ni michakato ngapi inayoendesha kwa sasa kama mzizi;
  • pata amri gani inayoonekana katika idadi ya juu ya kategoria za usaidizi (mtu);
  • hesabu mara ngapi neno var linaonekana kwenye ukurasa wa ya.ru.
Kidokezo: utahitaji find , grep -o , awk "(print $1)" , misemo ya kawaida katika grep , curl -s .

Nini cha kujifunza baadaye?

Ukianza kupenda mstari wa amri, usisimame, endelea kuboresha ujuzi wako.

Hapa kuna programu ambazo hakika zitakuja kusaidia ikiwa unaishi kwenye safu ya amri:

  • pata na chaguzi ngumu
  • apropos
  • tafuta
  • telnet
  • netcat
  • tcpdump
  • rsync
  • skrini
  • zgrep, bila
  • visudo
  • crontab -e
  • barua pepe
Kwa kuongezea, baada ya muda inafaa kujua aina fulani ya lugha ya uandishi, kama vile perl au python, au hata zote mbili.

Nani anahitaji hii?

Inafaa hata kujifunza safu ya amri na uandishi wa ganda leo? Hakika thamani yake. Nitatoa mifano michache tu ya mahitaji ya Facebook kwa watahiniwa wanaotaka kupata kazi katika FB.
  • Mafunzo

Kwa nini na kwa nani makala hiyo?

Hapo awali, hii ilikuwa ukumbusho kwa wanafunzi ambao wanaanza kufanya kazi na mifumo kama Unix. Kwa maneno mengine, makala hiyo inalenga kwa wale ambao hawana uzoefu wa awali wa kufanya kazi na mstari wa amri ya Unix, lakini kwa sababu moja au nyingine wanataka au wanahitaji kujifunza jinsi ya kuingiliana kwa ufanisi nayo.

Hakutakuwa na kusimuliwa tena kwa mana (hati), na kifungu hakighairi au kuchukua nafasi ya kuzisoma. Badala yake, nitazungumzia juu ya mambo makuu (amri, mbinu na kanuni) ambazo unahitaji kuelewa tangu mwanzo wa kufanya kazi katika shell ya unix ili kazi iwe yenye ufanisi na ya kufurahisha.

Makala haya yanahusu mazingira kamili yanayofanana na unix, yenye ganda linalofanya kazi kikamilifu (ikiwezekana zsh au bash) na anuwai ya programu za kawaida.

Shell ni nini

Shell (shell, aka "mstari wa amri", aka CLI, aka "console", aka "terminal", aka "dirisha nyeusi na herufi nyeupe") ni kiolesura cha maandishi cha kuwasiliana na mfumo wa uendeshaji (vizuri, madhubuti ninamaanisha, hii. ni programu, ambayo hutoa kiolesura kama hicho, lakini sasa tofauti hii haina maana).

Kwa ujumla, fanya kazi kupitia ganda inaonekana kama hii: mtumiaji (yaani wewe) huingiza amri kutoka kwa kibodi, bonyeza Enter, mfumo hutoa amri, huandika matokeo ya utekelezaji kwenye skrini, na tena subiri amri inayofuata. ya kuingizwa.

Aina ya kawaida ya ganda:

Ganda ndio njia kuu ya kuingiliana na mifumo yote ya seva kama Unix.

Mifumo ya mstari wa amri inapatikana wapi?

Ambapo ganda la unix linaweza kuwa linakungoja, chaguzi maarufu:
  • MacOS (bash);
  • ufikiaji wa mbali kwa seva kwa kazi au mradi wa kibinafsi wa wavuti;
  • seva ya faili ya nyumbani na ufikiaji wa mbali;
  • Ubuntu, PC-BSD kwenye kompyuta ndogo/desktop - mifumo inayofanana na unix leo ni rahisi kusakinisha na kutumia.

Ni shida gani zinazofaa kusuluhisha na ganda?

Kazi za asili ambazo ganda linafaa, muhimu na la lazima:
  • kazi ya maingiliano katika terminal:
    • kufanya mkusanyiko, kuendesha kazi kupitia make;
    • kulinganisha faili za maandishi;
    • uchambuzi wa haraka wa data ya matangazo (idadi ya IP za kipekee kwenye logi, usambazaji wa rekodi kwa saa/dakika, n.k.);
    • vitendo vya wingi wa wakati mmoja (kuua michakato mingi; ikiwa unafanya kazi na mfumo wa udhibiti wa toleo, pindua au suluhisha kundi la faili);
    • utambuzi wa kile kinachotokea katika mfumo (semaphores, kufuli, michakato, maelezo, nafasi ya diski, nk);
  • uandishi:
    • maandishi ya ufungaji, ambayo huwezi kutegemea uwepo wa wakalimani wengine - hii sio kwa Kompyuta;
    • kazi za kubinafsisha shell inayoingiliana (inayoathiri mwaliko, kubadilisha saraka, kuweka vigezo vya mazingira) pia sio hasa kwa Kompyuta;
    • hati za wakati mmoja kama vile kuweka upya faili nyingi;
    • makefiles.

Hatua za kwanza kabisa

Hebu tuanze: ingia na uondoke

Hakikisha unajua jinsi ya kuanza ganda na jinsi ya kuiondoa.

Ikiwa unafanya kazi kwenye mashine iliyo na Ubuntu imewekwa, unahitaji kuzindua programu ya Terminal. Baada ya kumaliza, unaweza tu kufunga dirisha.

Kwenye MacOS - pia uzindua terminal.

Ili kufikia seva ya mbali, tumia ssh (ikiwa unayo MacOS, Ubuntu au mfumo mwingine kama unix ndani ya nchi) au putty (ikiwa unayo Windows).

Mimi ni nani, niko wapi?

Endesha amri zifuatazo:
  • jina la mwenyeji - huonyesha jina la mashine (seva) uliyonayo sasa;
  • whoami - inaonyesha kuingia kwako (jina lako kwenye mfumo);
  • mti -d / | chini - uwakilishi wa pseudo-graphic wa mti wa saraka kwenye mashine; toka kutoka kwa kusonga - q ;
  • pwd - inaonyesha saraka uliyopo sasa; kwenye safu ya amri huwezi kuwa "vivyo hivyo", lazima uwe kwenye saraka fulani (=saraka ya sasa, saraka ya kufanya kazi). Saraka ya sasa ya kufanya kazi labda itaonyeshwa kwenye kidokezo chako.
  • ls - orodha ya faili kwenye saraka ya sasa; ls / nyumbani - orodha ya faili kwenye saraka maalum;

Historia ya amri (historia)

Sifa muhimu ya safu kamili ya amri ni historia ya amri.

Tekeleza amri kadhaa: jina la mwenyeji, ls, pwd, whoami. Sasa bonyeza kitufe cha juu. Amri ya awali inaonekana kwenye mstari wa pembejeo. Unaweza kutumia vitufe vya juu na chini kusonga mbele na nyuma kupitia historia. Unapofika kwa jina la mwenyeji, bonyeza Enter - amri itatekelezwa tena.

Amri kutoka kwa historia haziwezi tu kutekelezwa mara kwa mara, lakini pia kuhaririwa. Tembea kupitia historia hadi ls amri, ongeza -l kubadili kwake (inageuka ls -l , kuna nafasi kabla ya minus, lakini sio baada). Bonyeza Ingiza - amri iliyobadilishwa itatekelezwa.

Kupitia historia, kuhariri na kutekeleza tena amri ni vitendo vya kawaida wakati wa kufanya kazi kwenye mstari wa amri, kwa hiyo izoea.

Nakili-bandika

Mstari wa amri ni wa maandishi sana: amri ni maandishi, data ya pembejeo kwa programu nyingi za kawaida ni maandishi, na matokeo mara nyingi ni maandishi.

Jambo kuu juu ya maandishi ni kwamba inaweza kunakiliwa na kubandikwa, na hii ni kweli kwenye safu ya amri pia.

Jaribu tarehe ya amri +"%y-%m-%d, %A"
Je, uliiingiza kabisa kwa mkono au umeinakili kutoka kwa makala? Hakikisha unaweza kuinakili, kuibandika kwenye terminal na kuitekeleza.

Mara tu unapojifunza jinsi ya kutumia man, hakikisha unaweza kunakili na kutekeleza amri za mfano kutoka kwa usaidizi.Kuangalia, tafuta sehemu ya MIFANO katika usaidizi wa programu ya tarehe, nakili na utekeleze mfano wa kwanza uliotolewa (ikiwa tu: the ishara ya dola sio sehemu ya amri , hii ni picha ya ishara ya haraka ya kuingiza).

Jinsi ya kunakili maandishi kutoka kwa terminal na kuiweka kwenye terminal inategemea mfumo wako na mipangilio yake, kwa hivyo, kwa bahati mbaya, haitawezekana kutoa maagizo ya ulimwengu wote. Kwenye Ubuntu, jaribu hii: nakala - chagua tu na panya, bandika - kitufe cha kati cha panya. Ikiwa haifanyi kazi, au ikiwa una mfumo tofauti, angalia kwenye mtandao au uulize marafiki wenye ujuzi zaidi.

Vifunguo na chaguzi

Unapochunguza historia ya amri, tayari umekutana na kwamba amri ya ls ina angalau chaguzi mbili. Ikiwa utaiita kama hivyo, hutoa orodha rahisi:

Akira@latitude-e7240: ~/shell-survival-quide> ls Makefile shell-first-steps.md shell-first-steps.pdf shell-survival-quide.md shell-survival-quide.pdf
Ukiongeza -l swichi, maelezo ya kina yanaonyeshwa kwa kila faili:

Akira@latitude-e7240: ~/shell-survival-quide> ls -l jumla 332 -rw-rw-r-- 1 akira akira 198 Feb 13 11:48 Makefile -rw-rw-r-- 1 akira akira 15107 Feb 14 22:26 shell-first-steps.md -rw-rw-r-- 1 akira akira 146226 Feb 13 11:49 shell-first-hatua.pdf -rw-rw-r-- 1 akira akira 16626 Feb 13 11 :45 shell-survival-quide.md -rw-rw-r-- 1 akira akira 146203 Feb 13 11:35 shell-survival-quide.pdf
Hii ni hali ya kawaida sana: ikiwa unaongeza modifiers maalum (funguo, chaguo, vigezo) kwa wito wa amri, tabia ya mabadiliko ya amri. Linganisha: mti / na mti -d / , jina la mwenyeji na jina la mwenyeji -f .

Kwa kuongeza, amri zinaweza kuchukua majina ya faili, majina ya saraka, au tu kamba za maandishi kama vigezo. Jaribu:

Ls -ld /home ls -l /home grep mzizi /etc/passwd

mtu

man - Msaada kwa amri na programu zinazopatikana kwenye mashine yako, pamoja na simu za mfumo na maktaba ya kawaida ya C.

Jaribu: man grep , man atoi , man chdir , man man .

Kusogeza mbele na nyuma kunafanywa kwa vitufe vya "juu", "chini", "PageUp", "PageDown", kutoka kwa mtazamo wa usaidizi hufanywa na kitufe cha q. Tafuta maandishi mahususi katika nakala ya usaidizi: bonyeza / (sogeza mbele), weka maandishi ili kutafuta, bonyeza Enter. Nenda kwa matukio yanayofuata - ufunguo n.

Makala yote ya usaidizi yamegawanywa katika kategoria. Muhimu zaidi:

  • 1 - mipango inayoweza kutekelezwa na amri za shell (wc, ls, pwd, nk);
  • 2 - simu za mfumo (uma, dup2, nk)
  • 3 - kazi za maktaba (printf, scanf, cos, exec).
Ni muhimu kuonyesha kutoka kwa jamii ambayo cheti inapaswa kuonyeshwa katika matukio ya bahati mbaya ya majina. Kwa mfano, man 3 printf inaelezea kazi kutoka kwa maktaba ya kawaida ya C, na man 1 printf inaelezea programu ya console yenye jina sawa.

Unaweza kutazama orodha ya nakala zote za usaidizi zinazopatikana kwenye mashine yako kwa kutumia man -k amri. (kitone pia ni sehemu ya komada).

kidogo

Wakati unahitaji kutazama maandishi marefu sana kwenye dirisha ndogo la terminal (yaliyomo kwenye faili, mtu mrefu, nk), programu maalum za "pager" hutumiwa (kutoka kwa ukurasa wa neno, ambayo ni, vipeperushi vya ukurasa). Kisogeza kinachojulikana zaidi ni kidogo, na ndicho kinachokupa usogezaji unaposoma kurasa za watu.

Jaribu na kulinganisha tabia:

Paka /etc/bash.bashrc paka /etc/bash.bashrc |less

Unaweza kuhamisha faili kwa paja moja kwa moja katika vigezo:

Chini /etc/bash.bashrc

Kusogeza juu na chini - vifungo "juu", "chini", "PageUp", "PageDown", toka - kifungo q. Tafuta maandishi maalum: bonyeza / (songa mbele), ingiza maandishi ili kutafuta, bonyeza Enter. Nenda kwa matukio yanayofuata - ufunguo n. (Je, unatambua maagizo kuhusu mwanadamu? Si ajabu, kidogo pia hutumiwa kuonyesha usaidizi.)

Haki

Faili au saraka yoyote inahusishwa na seti ya "haki": haki ya kusoma faili, haki ya kuandika faili, haki ya kutekeleza faili. Watumiaji wote wamegawanywa katika makundi matatu: mmiliki wa faili, kikundi cha wamiliki wa faili, na watumiaji wengine wote.

Unaweza kutazama ruhusa za faili kwa kutumia ls -l . Kwa mfano:

> ls -l Makefile -rw-r--r-- 1 akira wanafunzi 198 Feb 13 11:48 Makefile
Pato hili linamaanisha kuwa mmiliki (akira) anaweza kusoma na kuandika faili, kikundi (wanafunzi) wanaweza kusoma tu, na watumiaji wengine wote wanaweza kusoma tu.

Ukipokea ujumbe ulionyimwa ruhusa unapofanya kazi, hii inamaanisha kuwa huna haki za kutosha kwa kitu ulichotaka kufanya kazi nacho.

Soma zaidi katika man chmod.

STDIN, STDOUT, conveyors (mabomba)

Kuna mitiririko 3 ya kawaida ya data inayohusishwa na kila programu inayotekelezwa: mtiririko wa data wa ingizo STDIN, mtiririko wa data ya pato STDOUT, mtiririko wa matokeo wa makosa STDERR.

Endesha programu ya wc, ingiza maandishi Siku njema leo, bonyeza Enter, ingiza maandishi siku njema, bonyeza Enter, bonyeza Ctrl + d. Programu ya wc itaonyesha takwimu za idadi ya herufi, maneno na mistari katika maandishi yako na mwisho:

> wc siku njema leo siku njema 2 5 24
Katika hali hii, ulitoa maandishi ya mistari miwili kwa STDIN ya programu, na ukapokea nambari tatu katika STDOUT.

Sasa endesha amri head -n3 /etc/passwd , inapaswa kuonekana kama hii:

> kichwa -n3 /etc/passwd root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x: 2:2:bin:/bin:/usr/sbin/nologin
Katika kesi hii, programu ya kichwa haikusoma chochote kutoka kwa STDIN, lakini iliandika mistari mitatu kwa STDOUT.

Unaweza kufikiria kwa njia hii: mpango ni bomba ambalo STDIN inapita na STDOUT inapita nje.

Sifa muhimu zaidi ya mstari wa amri ya Unix ni kwamba programu za "bomba" zinaweza kuunganishwa kwa kila mmoja: matokeo (STDOUT) ya programu moja yanaweza kupitishwa kama data ya pembejeo (STDIN) kwa programu nyingine.

Ujenzi huo wa mipango iliyounganishwa inaitwa bomba kwa Kiingereza, au conveyor au bomba kwa Kirusi.

Kuchanganya programu kwenye bomba hufanywa na ishara | (bar wima)

Endesha amri head -n3 /etc/passwd |wc , itaonekana kitu kama hiki:

> kichwa -n3 /etc/passwd |wc 3 3 117
Hapa ndivyo ilivyotokea: mpango wa kichwa hutoa mistari mitatu ya maandishi katika STDOUT, ambayo mara moja ilikwenda kwenye pembejeo ya programu ya wc, ambayo kwa upande wake ilihesabu idadi ya wahusika, maneno na mistari katika maandishi yaliyotokana.

Unaweza kuchanganya programu nyingi kama unavyopenda kwenye bomba. Kwa mfano, unaweza kuongeza programu nyingine ya wc kwenye bomba lililopita, ambalo litahesabu maneno na herufi ngapi zilikuwa kwenye matokeo ya wc ya kwanza:

> kichwa -n3 /etc/passwd |wc |wc 1 3 24

Kujenga mabomba (mabomba) ni kazi ya kawaida sana wakati wa kufanya kazi kwenye mstari wa amri. Kwa mfano wa jinsi hii inafanywa kwa mazoezi, soma sehemu "Kuunda bomba la mjengo mmoja."

Uelekezaji kwingine wa I/O

Pato (STDOUT) ya programu haiwezi tu kuhamishiwa kwenye programu nyingine kupitia bomba, lakini pia imeandikwa tu kwa faili. Uelekezaji huu unafanywa kwa kutumia > (kubwa kuliko ishara):

Tarehe > /tmp/today.txt
Kama matokeo ya kutekeleza amri hii, faili /tmp/today.txt itaonekana kwenye diski. Tazama yaliyomo kwa kutumia cat /tmp/today.txt

Ikiwa faili iliyo na jina sawa tayari ilikuwepo, yaliyomo yake ya zamani yataharibiwa. Ikiwa faili haikuwepo, itaundwa. Saraka ambayo faili imeundwa lazima iwepo kabla ya amri kutekelezwa.

Ikiwa hutaki kubatilisha faili, lakini badala yake ongeza matokeo hadi mwisho wake, tumia >> :

Tarehe >> /tmp/today.txt
Angalia kile kilichoandikwa kwenye faili sasa.

Kwa kuongeza, unaweza kupitisha faili yoyote kwenye programu badala ya STDIN. Jaribu:

Wc

Nini cha kufanya wakati kitu haijulikani

Ikiwa unakutana na tabia ya mfumo ambayo hauelewi, au unataka kufikia matokeo fulani, lakini haujui jinsi gani, nakushauri uendelee kwa utaratibu ufuatao (kwa njia, hii inatumika si tu kwa shells):
  • Kwa uwazi iwezekanavyo, tengeneza swali au kazi - hakuna kitu ngumu zaidi kuliko kutatua "kitu ambacho sijui nini";
  • kumbuka ikiwa tayari umekutana na shida sawa au sawa - katika kesi hii, inafaa kujaribu suluhisho ambalo lilifanya kazi mara ya mwisho;
  • soma kurasa za mtu zinazofaa (ikiwa unaelewa ni kurasa gani za mtu zinafaa katika kesi yako) - labda utapata mifano inayofaa ya kutumia amri, chaguo muhimu au viungo kwa amri nyingine;
  • fikiria: inawezekana kubadilisha kazi kidogo? - labda, kwa kubadilisha hali kidogo, utapata shida ambayo tayari unajua jinsi ya kutatua;
  • uliza swali lako lililoundwa kwa uwazi katika injini ya utafutaji - labda jibu linaweza kupatikana kwenye Stack Overflow au tovuti zingine;
Ikiwa hakuna yoyote ya hapo juu inayosaidia, tafuta ushauri kutoka kwa mwalimu, mwenzako mwenye ujuzi au rafiki. Na usiogope kuuliza maswali "ya kijinga" - sio aibu kutojua, ni aibu kutouliza.

Ikiwa unatatua shida ngumu (peke yako, kwa msaada wa Mtandao au watu wengine), andika suluhisho lako ikiwa shida kama hiyo itatokea tena kwako au kwa marafiki zako. Unaweza kurekodi katika faili rahisi ya maandishi, katika Evernote, au kuchapisha kwenye mitandao ya kijamii.

Mbinu za kazi

Nakili na ubandike- kutoka kurasa za watu, kutoka kwa makala kwenye StackOverflow, n.k. Mstari wa amri una maandishi, tumia fursa hii: nakala na tumia amri za mifano, andika matokeo yaliyofaulu kama kumbukumbu, yachapishe kwenye Twitter na blogu.

Vuta amri ya awali kutoka kwa historia, ongeza amri nyingine kwenye bomba, kukimbia, kurudia.Sentimita. Tazama pia sehemu ya "Kuunda bomba la mjengo mmoja."

Amri za msingi

  • badilisha kwa saraka nyingine: cd ;
  • kutazama yaliyomo kwenye faili: paka, chini, kichwa, mkia;
  • kudanganywa kwa faili: cp, mv, rm;
  • kutazama yaliyomo kwenye saraka: ls , ls -l , ls -lS ;
  • muundo wa saraka: mti , mti -d (saraka inaweza kupitishwa kama kigezo);
  • tafuta faili: find . -jina ...;

Uchanganuzi

  • wc, wc -l;
  • panga -k - panga kwa shamba maalum;
  • aina -n - kupanga nambari;
  • diff - kulinganisha faili;
  • grep , grep -v , grep -w , grep "\ " , grep -E - tafuta maandishi;
  • uniq , uniq -c - upekee wa kamba;
  • awk - katika awk "(chapisha $ 1)" chaguo, kuondoka tu shamba la kwanza kutoka kwa kila mstari, $ 1 inaweza kubadilishwa hadi $ 2, $ 3, nk;

Utambuzi wa mfumo

  • ps axuww - habari kuhusu michakato (programu zinazoendesha) zinazoendesha kwenye mashine;
  • juu - kutazama maingiliano ya michakato inayotumia rasilimali nyingi zaidi;
  • df - kutumika na nafasi ya bure ya disk;
  • du - saizi ya jumla ya faili kwenye saraka (kwa kurudia na subdirectories);
  • strace , ktrace - mfumo unaita mchakato gani;
  • lsof - ni faili gani mchakato hutumia;
  • netstat -na, netstat -nap - ambayo bandari na soketi zimefunguliwa kwenye mfumo.

Huenda usiwe na baadhi ya programu; zinahitaji kusakinishwa kwa kuongeza. Kwa kuongeza, baadhi ya chaguzi za programu hizi zinapatikana tu kwa watumiaji wenye upendeleo (mizizi).

Utekelezaji wa wingi na nusu otomatiki

Mara ya kwanza, ruka sehemu hii; utahitaji amri hizi na miundo unapofikia uandishi rahisi wa shell.
  • mtihani - kuangalia hali;
  • wakati wa kusoma - kitanzi mstari kwa mstari STDIN;
  • xargs - uingizwaji wa masharti kutoka kwa STDIN kwenye vigezo vya programu maalum;
  • seq - kizazi cha mlolongo wa nambari za asili;
  • () - kuchanganya pato la amri kadhaa;
  • ; - fanya jambo moja baada ya jingine;
  • && - tekeleza ikiwa amri ya kwanza imekamilika kwa mafanikio;
  • | - kutekeleza ikiwa amri ya kwanza inashindwa;
  • tee - duplicate pato la programu kwa STDOUT na faili kwenye diski.

Mbalimbali

  • tarehe - tarehe ya sasa;
  • curl - kupakua hati kutoka kwa url maalum na kuandika matokeo kwa STDOUT;
  • kugusa - sasisha tarehe ya kurekebisha faili;
  • kuua - tuma ishara kwa mchakato;
  • kweli - haifanyi chochote, inarudi kweli, muhimu kwa kuandaa vitanzi vya milele;
  • sudo - toa amri kama mzizi "a.

Kuunda bomba la mjengo mmoja

Wacha tuangalie mfano wa kazi halisi: tunahitaji kuua michakato yote ya seva-6 inayoendesha kama mtumiaji wa sasa.

Hatua ya 1.
Kuelewa ni programu gani hutoa takriban data muhimu, hata ikiwa sio katika hali yake safi. Kwa kazi yetu, inafaa kupata orodha ya michakato yote kwenye mfumo: ps sawa. Uzinduzi.

Hatua ya 2.
Angalia data iliyopokelewa kwa macho yako, njoo na kichungi ambacho kitatupa data isiyo ya lazima. Hii mara nyingi ni grep au grep -v . Tumia kitufe cha "Juu" kutoa amri iliyotangulia kutoka kwa historia, ikabidhi kichujio kilichobuniwa, na uikimbie.

Ps axuww |grep `whoami`
- michakato tu ya mtumiaji wa sasa.

Hatua ya 3.
Rudia hatua ya 2 hadi upate data safi unayohitaji.

"
- michakato yote iliyo na jina linalohitajika (pamoja, labda, zile za ziada kama vim task-6-server.c, nk),

Ps axuww |grep `whoami` | grep "\ " | grep -v vim ps axuww |grep `whoami` | grep "\ " | grep -v vim |grep -v less
- michakato tu na jina linalohitajika

Ps axuww |grep `whoami` | grep "\ " | grep -v vim |grep -v less |awk "(chapisha $2)"

Pids ya michakato inayohitajika, hatua ya 3 imekamilika

Hatua ya 4.
Tumia kidhibiti cha mwisho kinachofaa. Kutumia kitufe cha "Juu", tunatoa amri iliyotangulia kutoka kwa historia na kuongeza usindikaji ambao utakamilisha suluhisho la shida:

  • |wc -l kuhesabu idadi ya michakato;
  • > pids kuandika pids kwenye faili;
  • |xargs kuua -9 michakato ya kuua.

Kazi za mafunzo

Unataka kufanya mazoezi ya ujuzi mpya? Jaribu kazi zifuatazo:
  • pata orodha ya faili zote na saraka kwenye saraka yako ya nyumbani;
  • pata orodha ya vifungu vyote vya mtu kutoka kwa kitengo cha 2 (simu za mfumo);
  • hesabu ni mara ngapi neno grep linaonekana kwenye ukurasa wa mtu wa programu ya grep;
  • hesabu ni michakato ngapi inayoendesha kwa sasa kama mzizi;
  • pata amri gani inayoonekana katika idadi ya juu ya kategoria za usaidizi (mtu);
  • hesabu mara ngapi neno var linaonekana kwenye ukurasa wa ya.ru.
Kidokezo: utahitaji find , grep -o , awk "(print $1)" , misemo ya kawaida katika grep , curl -s .

Nini cha kujifunza baadaye?

Ukianza kupenda mstari wa amri, usisimame, endelea kuboresha ujuzi wako.

Hapa kuna programu ambazo hakika zitakuja kusaidia ikiwa unaishi kwenye safu ya amri:

  • pata na chaguzi ngumu
  • apropos
  • tafuta
  • telnet
  • netcat
  • tcpdump
  • rsync
  • skrini
  • zgrep, bila
  • visudo
  • crontab -e
  • barua pepe
Kwa kuongezea, baada ya muda inafaa kujua aina fulani ya lugha ya uandishi, kama vile perl au python, au hata zote mbili.

Nani anahitaji hii?

Inafaa hata kujifunza safu ya amri na uandishi wa ganda leo? Hakika thamani yake. Nitatoa mifano michache tu ya mahitaji ya Facebook kwa watahiniwa wanaotaka kupata kazi katika FB.