1 00:00:07,060 --> 00:00:08,420 [Powered by Google Translate] Tommy: En ĉi tiu video, ni lernos pri 2 00:00:08,420 --> 00:00:10,140 redireccionando kaj tuboj. 3 00:00:10,140 --> 00:00:12,780 Ĝis nun, ni estis uzante funkciojn kiel printf al 4 00:00:12,780 --> 00:00:15,590 eligo datumojn al la terminalo kaj funkcioj kiel GetString 5 00:00:15,590 --> 00:00:17,520 por permesi al la uzanto por havigi enigo al nia 6 00:00:17,520 --> 00:00:19,490 programo uzanta la klavaro. 7 00:00:19,490 --> 00:00:21,880 Ni rapide rigardu programo kiu ricevas linio de 8 00:00:21,880 --> 00:00:25,960 enigo de la uzanto kaj tiam eligas ĝin. 9 00:00:25,960 --> 00:00:28,990 >> Sur la linio 7, ni instigante al la uzanto por kordoj, kaj 10 00:00:28,990 --> 00:00:31,680 tiam la linio 8, ni presi ĝin eksteren. 11 00:00:31,680 --> 00:00:35,220 Ni tradukigi kaj ruli nia programo. 12 00:00:35,220 --> 00:00:35,900 Granda. 13 00:00:35,900 --> 00:00:37,620 La kordoj ni havigis estis eĥita reen 14 00:00:37,620 --> 00:00:39,170 nin al la terminalo. 15 00:00:39,170 --> 00:00:42,110 Ĉi tio okazis ĉar la printf funkcio skribis al 16 00:00:42,110 --> 00:00:46,220 rivereto nomita normo ekster, aŭ s-t-d-out. 17 00:00:46,220 --> 00:00:49,230 Kiam io estas skribita al stdout, estas defaŭlte 18 00:00:49,230 --> 00:00:51,110 montritaj de la terminalo. 19 00:00:51,110 --> 00:00:53,720 >> Do jen ĉio bone, sed kio se, anstataŭ simple 20 00:00:53,720 --> 00:00:57,700 montrante la ĉeno, ni volis savi ĝin al dosiero? 21 00:00:57,700 --> 00:01:00,470 Ekzemple, ni povus volas memori precize kion niaj 22 00:01:00,470 --> 00:01:04,450 programo faris kiam ni donis gxin aparta enigo poste. 23 00:01:04,450 --> 00:01:07,270 Unu proksimigo estus fari tion en nia C programon, uzante 24 00:01:07,270 --> 00:01:09,680 iuj specialaj funkcioj por skribi al dosieroj por ke ni instruos vin 25 00:01:09,680 --> 00:01:11,270 vidi en alia video. 26 00:01:11,270 --> 00:01:13,260 Eĉ pli facila, tamen, estus iel 27 00:01:13,260 --> 00:01:16,090 ridirektanta stdout al dosiero. 28 00:01:16,090 --> 00:01:19,780 Tiu vojo, kiam printf skribas al stdout, la enhavo volo 29 00:01:19,780 --> 00:01:21,720 esti skribita al dosiero anstataŭ 30 00:01:21,720 --> 00:01:23,410 montritaj de la terminalo. 31 00:01:23,410 --> 00:01:26,690 Ni povas fari ĝuste tion per aldono de pli granda ol signo, sekvis 32 00:01:26,690 --> 00:01:30,820 per dosiernomo, al la komando ni uzas por ekzekuti nia programo. 33 00:01:30,820 --> 00:01:34,730 >> Do, anstataŭ simple ekzekuti. / Alidirektilo, ni povas 34 00:01:34,730 --> 00:01:38,880 kuri. / alidirektilo, sekvita de iu pli granda ol signo, sekvita de 35 00:01:38,880 --> 00:01:41,530 dosiernomo, kiel file.txt. 36 00:01:41,530 --> 00:01:44,290 Ni vidu kio okazos. 37 00:01:44,290 --> 00:01:45,130 OK. 38 00:01:45,130 --> 00:01:48,470 Rimarku ke tiu tempo, nenio estis montrata je la fina stacio, 39 00:01:48,470 --> 00:01:50,290 sed ni ne modifis la enhavon de nia 40 00:01:50,290 --> 00:01:52,040 C programon tute ne. 41 00:01:52,040 --> 00:01:56,090 Ni nun ekzameni la enhavon de tiu ĉi dosierujo kun ls. 42 00:01:56,090 --> 00:01:56,630 >> Bone. 43 00:01:56,630 --> 00:02:00,840 Ni nun havas novan dosieron en nia katalogo nomis file.txt, 44 00:02:00,840 --> 00:02:03,640 kiu estas la dosiernomo ni havigis kiam ni kuris nia 45 00:02:03,640 --> 00:02:05,050 Alidirektila programo. 46 00:02:05,050 --> 00:02:08,020 Ni malfermi file.txt. 47 00:02:08,020 --> 00:02:11,840 Kaj tie, ni povas vidi ke la stdout el alidirektilo estis 48 00:02:11,840 --> 00:02:15,550 skribis al la dosiero nomata file.txt. 49 00:02:15,550 --> 00:02:18,470 Do ni kuras la antaŭa komando denove, sed provizado de 50 00:02:18,470 --> 00:02:20,075 malsamaj enigo ĉi tiu tempo. 51 00:02:25,140 --> 00:02:25,900 Okay. 52 00:02:25,900 --> 00:02:28,205 Ni rigardu file.txt nun. 53 00:02:31,070 --> 00:02:34,580 >> Ni povas vidi ĉi tie ke la dosiero estis anstataŭigi, do nia 54 00:02:34,580 --> 00:02:37,120 originalaj enigo ne estas tie plu. 55 00:02:37,120 --> 00:02:40,280 Se ni anstataŭ volas aldonas al ĉi tiu dosiero, metante la novajn 56 00:02:40,280 --> 00:02:43,600 enigo sub la ekzistantaj enhavon de la dosiero, ni povas 57 00:02:43,600 --> 00:02:46,800 uzi du pli grandaj ol signoj anstataŭ nur unu. 58 00:02:46,800 --> 00:02:48,050 Ni provu tion. 59 00:02:52,160 --> 00:02:57,910 Nun, se ni malfermas file.txt denove, ni povas vidi ambaux niaj 60 00:02:57,910 --> 00:02:59,580 enigo linioj. 61 00:02:59,580 --> 00:03:02,180 En iuj kazoj, ni eble volas forĵeti ajna 62 00:03:02,180 --> 00:03:03,850 eligo de nia programo. 63 00:03:03,850 --> 00:03:06,450 Anstataŭ skribi la eliro al dosiero kaj poste forigi 64 00:03:06,450 --> 00:03:09,310 la dosiero kiam ni el tio, ni povas skribi al specialaj 65 00:03:09,310 --> 00:03:12,360 dosiero nomata / dev / null. 66 00:03:12,360 --> 00:03:15,160 Kiam io estas skribita al / dev/null-- 67 00:03:15,160 --> 00:03:16,960 aŭ nur devnull por mallongaj - 68 00:03:16,960 --> 00:03:18,950 ĝi estas aŭtomate forĵetita. 69 00:03:18,950 --> 00:03:23,290 Do pensu pri devnull kiel nigra truo por via datumoj. 70 00:03:23,290 --> 00:03:26,070 >> Do nun ni vidis kiel la granda ol signo povas redirekti 71 00:03:26,070 --> 00:03:29,610 stdout, vidu kiel ni povas redirekti normo en - 72 00:03:29,610 --> 00:03:31,250 aŭ s-t-d-in - 73 00:03:31,250 --> 00:03:33,550 la analoga de stdout. 74 00:03:33,550 --> 00:03:36,010 Dum funkcioj kiel printf skribi al la rojo nomata 75 00:03:36,010 --> 00:03:40,500 stdout, GetString kaj similaj funkcioj legis el la rivereto 76 00:03:40,500 --> 00:03:43,770 vokis stdin, kiu, implicite, estas la kurento de 77 00:03:43,770 --> 00:03:46,290 karakterojn tajpita en la klavaro. 78 00:03:46,290 --> 00:03:50,010 Ni povas redirekti stdin uzanta la malpli ol signo, sekvis 79 00:03:50,010 --> 00:03:51,370 per dosiernomo. 80 00:03:51,370 --> 00:03:54,000 Nun, pli ol instigante la uzanto por enigo en la 81 00:03:54,000 --> 00:03:57,870 fina stacio, programo malfermos la dosieron ni specifas kaj uzi 82 00:03:57,870 --> 00:03:59,790 liaj linioj kiel enigo. 83 00:03:59,790 --> 00:04:02,620 >> Ni vidu kio okazos. 84 00:04:02,620 --> 00:04:03,280 Granda. 85 00:04:03,280 --> 00:04:07,590 La unua linio de file.txt estis presita la fina 86 00:04:07,590 --> 00:04:10,160 ĉar ni vokas GetString unufoje. 87 00:04:10,160 --> 00:04:13,170 Se ni havis alian alvokon al GetString en nia programo, la 88 00:04:13,170 --> 00:04:16,149 sekvanta linio de file.txt estus uzata kiel 89 00:04:16,149 --> 00:04:17,990 enigo al tiu alvoko. 90 00:04:17,990 --> 00:04:21,050 Denove, ni ne modifis nian C programon tute ne. 91 00:04:21,050 --> 00:04:23,620 Ni nur ŝanĝas kiel ni ruli ĝin. 92 00:04:23,620 --> 00:04:27,080 Kaj ankaŭ memoras, ni ne nomumata stdout ĉi tiu tempo, 93 00:04:27,080 --> 00:04:28,970 do la eligo de la programo estis ankoraŭ 94 00:04:28,970 --> 00:04:31,040 montrata ĉe la stacio. 95 00:04:31,040 --> 00:04:33,500 Ni povas, kompreneble, alidirektilo ambaŭ stdin 96 00:04:33,500 --> 00:04:37,320 kaj stdout ŝatas tion. 97 00:04:37,320 --> 00:04:43,550 Nun, file2.txt enhavas la unuan linion de file.txt. 98 00:04:43,550 --> 00:04:46,140 >> Do, uzante tiujn operatoroj, ni povis legi kaj 99 00:04:46,140 --> 00:04:48,130 skribi de tekstaj dosieroj. 100 00:04:48,130 --> 00:04:51,890 Nun, ni vidu kiel ni povas uzi la eligo de unu programo kiel 101 00:04:51,890 --> 00:04:54,710 la eniro al alia programo. 102 00:04:54,710 --> 00:04:56,650 Do jen alia simpla C programon mi 103 00:04:56,650 --> 00:05:00,190 ili tie nomas hello.c. 104 00:05:00,190 --> 00:05:02,617 Kiel vi povas vidi, ĉi simple eligas "Saluton 105 00:05:02,617 --> 00:05:04,430 tie! "al la uzanto. 106 00:05:04,430 --> 00:05:08,890 Se mi volas redirekti uzi kiel eniro la eligo de saluton - 107 00:05:08,890 --> 00:05:10,190 alia programo - 108 00:05:10,190 --> 00:05:13,920 Mi povus unue alidirektilo la stdout de saluton al dosiero nomata 109 00:05:13,920 --> 00:05:18,960 input.txt, tiam alidirektilo la stdin de alidirektilo al tiu sama 110 00:05:18,960 --> 00:05:21,190 dosiero - input.txt. 111 00:05:21,190 --> 00:05:26,730 Do mi povas fari. / Saluton> input.txt. 112 00:05:26,730 --> 00:05:28,810 Premu Enter por ekzekuti ĉi. 113 00:05:28,810 --> 00:05:31,910 Sekvata de. / Alidirektilo < 114 00:05:31,910 --> 00:05:35,270 input.txt kaj plenumados tio. 115 00:05:35,270 --> 00:05:38,290 Do ni povas mallongigi tiun iom kun punktokomo, kiu permesas 116 00:05:38,290 --> 00:05:41,360 ni kuri du aŭ pli komandojn sur la sama linio. 117 00:05:41,360 --> 00:05:47,920 Do mi povas diri,. / Saluton> input.txt, punktokomo, 118 00:05:47,920 --> 00:05:50,580 . / Alidirektilo 00:05:56,740 >> Do tiu funkcias, sed ĝi ankoraŭ sentas bela inelegant. 120 00:05:56,740 --> 00:05:59,530 Mi volas diri, ĉu ni vere bezonas tiun intermediario teksta dosiero tio 121 00:05:59,530 --> 00:06:02,520 ne plu necesas post alidirektilo runs? 122 00:06:02,520 --> 00:06:05,780 Bonŝance, ni povas eviti ĉi superflua teksto dosieron per kio 123 00:06:05,780 --> 00:06:07,220 vokis pipon. 124 00:06:07,220 --> 00:06:13,740 Se mi diras,. / Saluton |. / Alidirektilo, tiam la stdout de 125 00:06:13,740 --> 00:06:15,310 la programo sur la maldekstra - 126 00:06:15,310 --> 00:06:16,740 en ĉi tiu kazo, saluton - 127 00:06:16,740 --> 00:06:18,970 estos uzita kiel la norma enigo por la 128 00:06:18,970 --> 00:06:20,370 programo dekstre. 129 00:06:20,370 --> 00:06:24,850 En ĉi tiu kazo, alidirektilo. Do ni kuros ĉi. 130 00:06:24,850 --> 00:06:25,930 >> Tie ni iru. 131 00:06:25,930 --> 00:06:30,080 Ni povas vidi ke la eligo de saluton estis uzata kiel la enigo 132 00:06:30,080 --> 00:06:31,520 por alidirektilo. 133 00:06:31,520 --> 00:06:34,890 Por stringing komandojn kune uzante pipoj, ni formas kio estas 134 00:06:34,890 --> 00:06:38,120 nomata dukto, ekde nia eliro estas esence movas 135 00:06:38,120 --> 00:06:40,590 tra vico de ordonoj. 136 00:06:40,590 --> 00:06:43,570 Uzanta pipoj, ni povas fari iu cool stuff sen bezoni 137 00:06:43,570 --> 00:06:45,870 skribi ajnan kodo ajn. 138 00:06:45,870 --> 00:06:48,760 Ekzemple, ni diras, ke ni volas scii kiom da dosieroj 139 00:06:48,760 --> 00:06:50,630 ene de tiu ĉi dosierujo. 140 00:06:50,630 --> 00:06:55,200 Uzanta pipon, ni povas kombini la ls ordono kun la wc - 141 00:06:55,200 --> 00:06:56,460 aŭ wordcount - 142 00:06:56,460 --> 00:06:57,850 komando. 143 00:06:57,850 --> 00:07:02,230 Ls estos eliro ĉiu dosiero en la dosierujo al stdout, kaj 144 00:07:02,230 --> 00:07:08,040 wc diros al ni, kiom da linioj estis donita al ĝi tra stdin. 145 00:07:08,040 --> 00:07:12,440 Do, se ni diras ls | wc-l - 146 00:07:12,440 --> 00:07:16,800 provizado la-l flagon al wc kaj sciigi al la grafo linioj - 147 00:07:16,800 --> 00:07:19,260 ni povas vidi ĝuste kiom da dosieroj 148 00:07:19,260 --> 00:07:21,940 en la aktuala dosierujo. 149 00:07:21,940 --> 00:07:24,570 >> Do ni rigardu pli ekzemplo. 150 00:07:24,570 --> 00:07:27,740 Mi havas ĉi tie dosieron nomata students.txt, 151 00:07:27,740 --> 00:07:29,600 kun listo de nomoj. 152 00:07:29,600 --> 00:07:32,730 Tamen, ĉi tiuj nomoj ne estas en ajna ordo ĉio, kaj rigardas 153 00:07:32,730 --> 00:07:34,850 kiel kelkaj nomoj estas ripetita. 154 00:07:34,850 --> 00:07:38,510 Kion ni volas estas listo de solaj nomoj laŭ alfabeta 155 00:07:38,510 --> 00:07:42,550 ordo, savis al dosiero nomata final.txt. 156 00:07:42,550 --> 00:07:45,210 Ni povus, kompreneble, skribi C-programo devas fari tion por ni. 157 00:07:45,210 --> 00:07:46,560 Sed tuj akiri nenecese 158 00:07:46,560 --> 00:07:48,560 kompleksa bela rapide. 159 00:07:48,560 --> 00:07:51,740 Ni anstataŭe uzas pipoj kaj iuj korpigita-iloj por solvi 160 00:07:51,740 --> 00:07:53,300 ĉi tiun problemon. 161 00:07:53,300 --> 00:07:57,760 >> La unua afero kiun ni bezonas por fari estas legi la dosieron students.txt. 162 00:07:57,760 --> 00:08:00,530 La kato komando faros ĝuste tion. 163 00:08:00,530 --> 00:08:03,230 Ĝi estos legita en la specifita dosiero kaj skribi 164 00:08:03,230 --> 00:08:05,750 ĝia enhavo al stdout. 165 00:08:05,750 --> 00:08:07,570 Post kiam ni legis la teksta dosiero, ni instruos vin 166 00:08:07,570 --> 00:08:09,490 volas ordigi la nomoj. 167 00:08:09,490 --> 00:08:12,510 La varo komando povas manipuli tiun por ni. 168 00:08:12,510 --> 00:08:16,830 Ordigi estos Eligo la linio provizitaj per stdin al stdout 169 00:08:16,830 --> 00:08:19,310 en ordo ordo. 170 00:08:19,310 --> 00:08:23,450 Por provizi la enhavo de students.txt al 171 00:08:23,450 --> 00:08:29,600 speco de stdin, ni povus uzi pipon kombini kato kaj varo. 172 00:08:29,600 --> 00:08:34,440 Do mi povas ekzekuti kato students.txt | varo kaj 173 00:08:34,440 --> 00:08:35,640 premi Enter. 174 00:08:35,640 --> 00:08:39,309 Kaj nun, ni vidas la enhavon de students.txt en 175 00:08:39,309 --> 00:08:40,909 alfabeta ordo. 176 00:08:40,909 --> 00:08:42,860 >> Do ni aldonas alian komandon - 177 00:08:42,860 --> 00:08:44,730 uniq, aŭ solaj - 178 00:08:44,730 --> 00:08:46,230 al nia dukto. 179 00:08:46,230 --> 00:08:49,810 Kiel vi eble konjektas, uniq, kiam provizitaj de ordo vico de 180 00:08:49,810 --> 00:08:53,650 linioj tra stdin, estos la sola eliro linioj. 181 00:08:53,650 --> 00:08:56,910 Do nun ni havas katon students.txt 182 00:08:56,910 --> 00:09:00,040 | Speco | uniq. 183 00:09:00,040 --> 00:09:03,330 Fine, ni povas savi la eligo de la dukton al 184 00:09:03,330 --> 00:09:09,090 dosiero tra kato students.txt | speco | uniq 185 00:09:09,090 --> 00:09:12,440 > Final.txt. 186 00:09:12,440 --> 00:09:16,260 Do, se ni malfermas final.txt, ni havas precize kion ni estis 187 00:09:16,260 --> 00:09:17,270 serĉas: 188 00:09:17,270 --> 00:09:20,180 listo de unika nomojn en alfabeta ordo, 189 00:09:20,180 --> 00:09:22,150 savis al teksta dosiero. 190 00:09:22,150 --> 00:09:26,020 Cetere, ni ankaux povus esti diris speco < 191 00:09:26,020 --> 00:09:32,290 students.txt | uniq> final.txt fari precize 192 00:09:32,290 --> 00:09:35,400 la sama afero, uzante ĉiu de la operatoroj ni vidis en 193 00:09:35,400 --> 00:09:36,580 ĉi tiu video. 194 00:09:36,580 --> 00:09:39,540 >> Mia nomo estas Tommy, kaj ĉi tiu estas CS50.