[Powered by Google Translate] Tommy: En ĉi tiu video, ni lernos pri
redireccionando kaj tuboj.
Ĝis nun, ni estis uzante funkciojn kiel printf al
eligo datumojn al la terminalo kaj funkcioj kiel GetString
por permesi al la uzanto por havigi enigo al nia
programo uzanta la klavaro.
Ni rapide rigardu programo kiu ricevas linio de
enigo de la uzanto kaj tiam eligas ĝin.
>> Sur la linio 7, ni instigante al la uzanto por kordoj, kaj
tiam la linio 8, ni presi ĝin eksteren.
Ni tradukigi kaj ruli nia programo.
Granda.
La kordoj ni havigis estis eĥita reen
nin al la terminalo.
Ĉi tio okazis ĉar la printf funkcio skribis al
rivereto nomita normo ekster, aŭ s-t-d-out.
Kiam io estas skribita al stdout, estas defaŭlte
montritaj de la terminalo.
>> Do jen ĉio bone, sed kio se, anstataŭ simple
montrante la ĉeno, ni volis savi ĝin al dosiero?
Ekzemple, ni povus volas memori precize kion niaj
programo faris kiam ni donis gxin aparta enigo poste.
Unu proksimigo estus fari tion en nia C programon, uzante
iuj specialaj funkcioj por skribi al dosieroj por ke ni instruos vin
vidi en alia video.
Eĉ pli facila, tamen, estus iel
ridirektanta stdout al dosiero.
Tiu vojo, kiam printf skribas al stdout, la enhavo volo
esti skribita al dosiero anstataŭ
montritaj de la terminalo.
Ni povas fari ĝuste tion per aldono de pli granda ol signo, sekvis
per dosiernomo, al la komando ni uzas por ekzekuti nia programo.
>> Do, anstataŭ simple ekzekuti. / Alidirektilo, ni povas
kuri. / alidirektilo, sekvita de iu pli granda ol signo, sekvita de
dosiernomo, kiel file.txt.
Ni vidu kio okazos.
OK.
Rimarku ke tiu tempo, nenio estis montrata je la fina stacio,
sed ni ne modifis la enhavon de nia
C programon tute ne.
Ni nun ekzameni la enhavon de tiu ĉi dosierujo kun ls.
>> Bone.
Ni nun havas novan dosieron en nia katalogo nomis file.txt,
kiu estas la dosiernomo ni havigis kiam ni kuris nia
Alidirektila programo.
Ni malfermi file.txt.
Kaj tie, ni povas vidi ke la stdout el alidirektilo estis
skribis al la dosiero nomata file.txt.
Do ni kuras la antaŭa komando denove, sed provizado de
malsamaj enigo ĉi tiu tempo.
Okay.
Ni rigardu file.txt nun.
>> Ni povas vidi ĉi tie ke la dosiero estis anstataŭigi, do nia
originalaj enigo ne estas tie plu.
Se ni anstataŭ volas aldonas al ĉi tiu dosiero, metante la novajn
enigo sub la ekzistantaj enhavon de la dosiero, ni povas
uzi du pli grandaj ol signoj anstataŭ nur unu.
Ni provu tion.
Nun, se ni malfermas file.txt denove, ni povas vidi ambaux niaj
enigo linioj.
En iuj kazoj, ni eble volas forĵeti ajna
eligo de nia programo.
Anstataŭ skribi la eliro al dosiero kaj poste forigi
la dosiero kiam ni el tio, ni povas skribi al specialaj
dosiero nomata / dev / null.
Kiam io estas skribita al / dev/null--
aŭ nur devnull por mallongaj -
ĝi estas aŭtomate forĵetita.
Do pensu pri devnull kiel nigra truo por via datumoj.
>> Do nun ni vidis kiel la granda ol signo povas redirekti
stdout, vidu kiel ni povas redirekti normo en -
aŭ s-t-d-in -
la analoga de stdout.
Dum funkcioj kiel printf skribi al la rojo nomata
stdout, GetString kaj similaj funkcioj legis el la rivereto
vokis stdin, kiu, implicite, estas la kurento de
karakterojn tajpita en la klavaro.
Ni povas redirekti stdin uzanta la malpli ol signo, sekvis
per dosiernomo.
Nun, pli ol instigante la uzanto por enigo en la
fina stacio, programo malfermos la dosieron ni specifas kaj uzi
liaj linioj kiel enigo.
>> Ni vidu kio okazos.
Granda.
La unua linio de file.txt estis presita la fina
ĉar ni vokas GetString unufoje.
Se ni havis alian alvokon al GetString en nia programo, la
sekvanta linio de file.txt estus uzata kiel
enigo al tiu alvoko.
Denove, ni ne modifis nian C programon tute ne.
Ni nur ŝanĝas kiel ni ruli ĝin.
Kaj ankaŭ memoras, ni ne nomumata stdout ĉi tiu tempo,
do la eligo de la programo estis ankoraŭ
montrata ĉe la stacio.
Ni povas, kompreneble, alidirektilo ambaŭ stdin
kaj stdout ŝatas tion.
Nun, file2.txt enhavas la unuan linion de file.txt.
>> Do, uzante tiujn operatoroj, ni povis legi kaj
skribi de tekstaj dosieroj.
Nun, ni vidu kiel ni povas uzi la eligo de unu programo kiel
la eniro al alia programo.
Do jen alia simpla C programon mi
ili tie nomas hello.c.
Kiel vi povas vidi, ĉi simple eligas "Saluton
tie! "al la uzanto.
Se mi volas redirekti uzi kiel eniro la eligo de saluton -
alia programo -
Mi povus unue alidirektilo la stdout de saluton al dosiero nomata
input.txt, tiam alidirektilo la stdin de alidirektilo al tiu sama
dosiero - input.txt.
Do mi povas fari. / Saluton> input.txt.
Premu Enter por ekzekuti ĉi.
Sekvata de. / Alidirektilo <
input.txt kaj plenumados tio.
Do ni povas mallongigi tiun iom kun punktokomo, kiu permesas
ni kuri du aŭ pli komandojn sur la sama linio.
Do mi povas diri,. / Saluton> input.txt, punktokomo,
. / Alidirektilo <input.txt.
>> Do tiu funkcias, sed ĝi ankoraŭ sentas bela inelegant.
Mi volas diri, ĉu ni vere bezonas tiun intermediario teksta dosiero tio
ne plu necesas post alidirektilo runs?
Bonŝance, ni povas eviti ĉi superflua teksto dosieron per kio
vokis pipon.
Se mi diras,. / Saluton |. / Alidirektilo, tiam la stdout de
la programo sur la maldekstra -
en ĉi tiu kazo, saluton -
estos uzita kiel la norma enigo por la
programo dekstre.
En ĉi tiu kazo, alidirektilo. Do ni kuros ĉi.
>> Tie ni iru.
Ni povas vidi ke la eligo de saluton estis uzata kiel la enigo
por alidirektilo.
Por stringing komandojn kune uzante pipoj, ni formas kio estas
nomata dukto, ekde nia eliro estas esence movas
tra vico de ordonoj.
Uzanta pipoj, ni povas fari iu cool stuff sen bezoni
skribi ajnan kodo ajn.
Ekzemple, ni diras, ke ni volas scii kiom da dosieroj
ene de tiu ĉi dosierujo.
Uzanta pipon, ni povas kombini la ls ordono kun la wc -
aŭ wordcount -
komando.
Ls estos eliro ĉiu dosiero en la dosierujo al stdout, kaj
wc diros al ni, kiom da linioj estis donita al ĝi tra stdin.
Do, se ni diras ls | wc-l -
provizado la-l flagon al wc kaj sciigi al la grafo linioj -
ni povas vidi ĝuste kiom da dosieroj
en la aktuala dosierujo.
>> Do ni rigardu pli ekzemplo.
Mi havas ĉi tie dosieron nomata students.txt,
kun listo de nomoj.
Tamen, ĉi tiuj nomoj ne estas en ajna ordo ĉio, kaj rigardas
kiel kelkaj nomoj estas ripetita.
Kion ni volas estas listo de solaj nomoj laŭ alfabeta
ordo, savis al dosiero nomata final.txt.
Ni povus, kompreneble, skribi C-programo devas fari tion por ni.
Sed tuj akiri nenecese
kompleksa bela rapide.
Ni anstataŭe uzas pipoj kaj iuj korpigita-iloj por solvi
ĉi tiun problemon.
>> La unua afero kiun ni bezonas por fari estas legi la dosieron students.txt.
La kato komando faros ĝuste tion.
Ĝi estos legita en la specifita dosiero kaj skribi
ĝia enhavo al stdout.
Post kiam ni legis la teksta dosiero, ni instruos vin
volas ordigi la nomoj.
La varo komando povas manipuli tiun por ni.
Ordigi estos Eligo la linio provizitaj per stdin al stdout
en ordo ordo.
Por provizi la enhavo de students.txt al
speco de stdin, ni povus uzi pipon kombini kato kaj varo.
Do mi povas ekzekuti kato students.txt | varo kaj
premi Enter.
Kaj nun, ni vidas la enhavon de students.txt en
alfabeta ordo.
>> Do ni aldonas alian komandon -
uniq, aŭ solaj -
al nia dukto.
Kiel vi eble konjektas, uniq, kiam provizitaj de ordo vico de
linioj tra stdin, estos la sola eliro linioj.
Do nun ni havas katon students.txt
| Speco | uniq.
Fine, ni povas savi la eligo de la dukton al
dosiero tra kato students.txt | speco | uniq
> Final.txt.
Do, se ni malfermas final.txt, ni havas precize kion ni estis
serĉas:
listo de unika nomojn en alfabeta ordo,
savis al teksta dosiero.
Cetere, ni ankaux povus esti diris speco <
students.txt | uniq> final.txt fari precize
la sama afero, uzante ĉiu de la operatoroj ni vidis en
ĉi tiu video.
>> Mia nomo estas Tommy, kaj ĉi tiu estas CS50.