IlmHamroh
JavaScript Full-stack/1-qism. Kompyuter, fayllar va terminal23/40-dars16 daqiqa
Mundarija (37)

Oqimlar, pipe va yo'naltirish: stdin, stdout, stderr

Qisqacha: Har bir terminal buyrug'i uchta "quvur" bilan ishlaydi: kirish (stdin), oddiy natija (stdout) va xatolar (stderr). > natijani faylga yozadi (eskisini o'chirib), >> fayl oxiriga qo'shadi, 2> esa faqat xatolarni ajratadi. Pipe | bir buyruq natijasini keyingisiga uzatadi: sort buyurtmalar.txt | uniq -c — takrorlarni sanaydi.

Bu darsda

  • Har bir buyruqning uchta oqimi — stdin, stdout, stderr — nima ekanini tushuntira olasiz.
  • Natijani faylga yozasiz (>) va fayl oxiriga qo'shasiz (>>), farqini aniq bilasiz.
  • Xato xabarlarini alohida faylga yoki "hech qayerga" (/dev/null) yo'naltirasiz.
  • Pipe (|) bilan buyruqlarni zanjir qilib ulaysiz.
  • wc, sort, uniq, head bilan matnli ma'lumotni sanaysiz va tartiblaysiz.

Oldin bilishingiz kerak: Fayl va papkalar bilan ishlash, Fayl va matn qidirish, Qator oxiri, inode va symlink (fayl deskriptori qismi).

1. Nega bu kerak?

Choyxona egasi sizdan so'radi: "Bugun qaysi taom eng ko'p buyurtma qilindi?" Buyurtmalar ro'yxati faylda, har qatorda bitta taom. Qatorlar esa yuzlab.

Terminalda buni hal qiladigan bitta "hamma ishni qiladigan" dastur yo'q. Lekin kichik vositalar bor: biri qatorlarni tartiblaydi, biri takrorlarni sanaydi, biri birinchi qatorni oladi. Ularni bir-biriga ulasangiz — javob tayyor:

bash
sort buyurtmalar.txt | uniq -c | sort -rn | head -n 1
text
      3 choy

Bu darsning oxirida shu qatorning har bir bo'lagini tushunasiz.

Bu Unix dunyosining eski tamoyili: "Har bir dastur bitta ishni yaxshi qilsin. Dasturlar esa bir-biriga ulana olsin." Ulash uchun esa avval oqim nima ekanini bilish kerak.

2. Uchta standart oqim

2.1 Dastur qayerdan o'qiydi, qayerga yozadi?

Qator oxiri va inode darsida fayl deskriptorlarini ko'rgan edik: 0, 1, 2 raqamlari har bir dasturda doim band. Endi ular nima uchun kerakligini ko'ramiz.

Oqim (stream) — dasturga ma'lumot kiradigan yoki undan chiqadigan kanal. Suv quvurini tasavvur qiling: bir uchidan suv kiradi, ikkinchi uchidan chiqadi. Suv o'rnida — matn.

Har bir dastur ishga tushganda operatsion tizim unga uchta tayyor quvur beradi:

Raqam Nomi Nima oqadi Odatda qayerga ulangan
0 stdin (standart kirish) Dasturga kiradigan ma'lumot Klaviatura
1 stdout (standart chiqish) Oddiy natija Terminal ekrani
2 stderr (standart xato) Xato xabarlari Terminal ekrani

"std" — "standard" so'zining qisqartmasi. "in" — kirish, "out" — chiqish, "err" — xato (error).

flowchart LR
  K["Klaviatura"] -- "0: stdin" --> D["Dastur, masalan ls"]
  D -- "1: stdout" --> E1["Ekran: natija"]
  D -- "2: stderr" --> E2["Ekran: xatolar"]

2.2 Nega ikkita chiqish?

Ekranda natija ham, xato ham bir xil ko'rinadi. Shuning uchun ular aslida ikki xil quvurdan kelayotganini sezmaysiz. Buni ko'rish uchun bitta buyruqqa ham bor, ham yo'q faylni beramiz:

bash
ls xabar.txt yoq.txt
text
ls: cannot access 'yoq.txt': No such file or directory
xabar.txt

Ekranda ikki qator (buni 4-bo'limda o'zingiz sinab ko'rasiz). Lekin xabar.txt — stdout'dan, ls: cannot access... esa stderr'dan keldi. Ular aralashib ko'rinyapti, xolos.

Nega ajratilgan? Tasavvur qiling: natijani faylga saqlayapsiz. Agar xato xabarlari ham o'sha faylga tushsa, fayl "iflos" bo'ladi. Keyingi dastur uni o'qiganda ls: cannot access degan qatorni ham fayl nomi deb o'ylaydi. Ikki quvur bo'lgani uchun natijani faylga, xatoni esa ekranga yo'naltirish mumkin.

Tekshirib ko'ring: grep "narx" yoq.js yozdingiz va ekranda grep: yoq.js: No such file or directory chiqdi. Bu qator qaysi oqimdan keldi?

Javob

stderr'dan (2-oqim). Bu — xato xabari: fayl topilmadi. Agar grep so'zni topganda, topilgan qatorlar stdout'ga (1-oqim) chiqqan bo'lardi.

3. Natijani faylga yozish: > va >>

3.1 Mashq papkasi

Yangi papka yarating va unga kiring:

bash
mkdir -p oqim
cd oqim

3.2 > — faylga yozish (eskisini o'chirib)

Qidiruv darsida > va >> ni "hozircha shunchaki nusxalang" degan edik. Endi ularni ochamiz.

Odatda echo matnni ekranga chiqaradi. > belgisi esa stdout quvurini ekrandan faylga buradi:

bash
echo "Salom, Toshkent" > xabar.txt
cat xabar.txt
text
Salom, Toshkent

Birinchi qator ekranga hech narsa chiqarmadi — matn to'g'ridan-to'g'ri xabar.txt ga ketdi. Fayl yo'q edi — > uni o'zi yaratdi. cat bilan ichini ko'rdik.

Endi xuddi shu faylga boshqa matn yozamiz:

bash
echo "Salom, Buxoro" > xabar.txt
cat xabar.txt
text
Salom, Buxoro

"Toshkent" qatori yo'qoldi. > faylni har safar noldan yozadi: avval ichini tozalaydi, keyin yangi matnni yozadi.

Diqqat: > hech narsa so'ramaydi. Muhim fayl nomini adashtirib yozsangiz, uning ichi darhol o'chadi va savatga tushmaydi — xuddi rm kabi.

3.3 >> — fayl oxiriga qo'shish

Eski matnni saqlab, yangisini oxiriga qo'shish uchun ikkita burchak — >>:

bash
echo "Salom, Samarqand" >> xabar.txt
cat xabar.txt
text
Salom, Buxoro
Salom, Samarqand

Eslab qolish usuli: bitta > — "o'rniga yoz", ikkita >> — "ustiga qo'sh". Kundalik daftarga har kuni yangi qator qo'shgandek.

3.4 Istalgan buyruq natijasini saqlash

> faqat echo bilan emas, stdout'ga yozadigan har qanday buyruq bilan ishlaydi:

bash
ls > royxat.txt
cat royxat.txt
text
royxat.txt
xabar.txt

Qiziq: ro'yxatda royxat.txt ning o'zi ham bor. Sababi — shell > ni ko'rib, avval faylni yaratadi, keyin ls ni ishga tushiradi. ls papkaga qaraganda fayl allaqachon turgan edi.

Tekshirib ko'ring: Quyidagi uch buyruqdan keyin kun.txt ichida nima bo'ladi?

bash
echo "dushanba" > kun.txt
echo "seshanba" >> kun.txt
echo "chorshanba" > kun.txt
Javob

Faqat chorshanba. Birinchi ikki buyruqdan keyin faylda ikki qator bor edi. Uchinchi buyruq bitta > bilan yozildi — u faylni tozalab, faqat yangi matnni yozdi.

4. Xatolarni yo'naltirish: 2>, 2>&1, /dev/null

4.1 > xatolarni ushlamaydi

Yo'q faylni ls qilib, natijani faylga yozamiz:

bash
ls yoq.txt > natija.txt
text
ls: cannot access 'yoq.txt': No such file or directory

Xato baribir ekranga chiqdi, natija.txt esa bo'sh qoldi. Chunki > — aslida 1> ning qisqa shakli. U faqat 1-quvurni (stdout) buradi. Xato esa 2-quvurdan (stderr) kelyapti.

4.2 2> — faqat xatolarni faylga

Xatolarni burish uchun quvur raqamini aniq yozamiz — 2>:

bash
ls yoq.txt 2> xatolar.txt
cat xatolar.txt
text
ls: cannot access 'yoq.txt': No such file or directory

Endi ekran toza, xato esa faylda. Ikkalasini birga ham ishlatish mumkin — natija bir faylga, xato boshqasiga:

bash
ls xabar.txt yoq.txt > natija.txt 2> xatolar.txt

natija.txt da — xabar.txt, xatolar.txt da — xato xabari. Ekranga hech narsa chiqmaydi.

2> va > orasida bo'sh joy bo'lmaydi: 2 > deb yozsangiz, shell 2 ni oddiy argument deb o'ylaydi.

4.3 2>&1 — ikkalasini bitta faylga

Ba'zan hamma narsani bitta faylga yig'ish kerak — masalan, keyin o'qish uchun jurnal (log). Buning uchun:

bash
ls xabar.txt yoq.txt > hammasi.txt 2>&1
cat hammasi.txt
text
ls: cannot access 'yoq.txt': No such file or directory
xabar.txt

2>&1 ni bo'laklab o'qiymiz: "2 ni (stderr) — &1 ga (stdout qayerga ketayotgan bo'lsa, o'sha joyga) bur". & belgisi bu yerda "1 — fayl nomi emas, quvur raqami" degan ishora. & siz 2>1 deb yozsangiz, xatolar 1 degan faylga yoziladi.

Diqqat: Tartib muhim. > hammasi.txt 2>&1 — to'g'ri. 2>&1 > hammasi.txt — xato ekranda qoladi. Shell yo'naltirishlarni chapdan o'ngga bajaradi: ikkinchi holatda stderr stdout'ga ulanganda, stdout hali ekranga qarab turgan edi. Bash'da qisqa shakl ham bor: &> hammasi.txt — ikkalasi bitta faylga.

4.4 /dev/null — "qora tuynuk"

Linux va macOS'da (Git Bash'da ham) /dev/null degan maxsus "fayl" bor. Unga yozilgan hamma narsa izsiz yo'qoladi. Kerak bo'lmagan xabarlarni jim qilish uchun ishlatiladi:

bash
ls xabar.txt yoq.txt 2> /dev/null
text
xabar.txt

Xato xabari yo'qoldi, natija qoldi. Hamma narsani jim qilish uchun: buyruq > /dev/null 2>&1. Windows PowerShell'da uning o'rnida $null ishlatiladi: buyruq 2> $null.

Tekshirib ko'ring: ls xabar.txt yoq.txt > /dev/null yozilsa, ekranda nima qoladi?

Javob

Faqat xato xabari: ls: cannot access 'yoq.txt': .... > faqat stdout'ni (xabar.txt qatorini) /dev/null ga yubordi. stderr esa yo'naltirilmadi, shuning uchun ekranda qoldi.

5. Pipe |: buyruqlarni ulash

5.1 G'oya

Hozirgacha stdout'ni faylga burdik. Pipe esa uni boshqa buyruqqa buradi. Pipe (quvur) — tik chiziq | belgisi. U chapdagi buyruqning stdout'ini o'ngdagi buyruqning stdin'iga to'g'ridan-to'g'ri ulaydi. Oraliq fayl kerak emas.

Klaviaturada | odatda Enter tepasidagi \ tugmasida turadi — Shift bilan bosiladi.

Zavod konveyerini tasavvur qiling: birinchi ishchi detalni yasab, lentaga qo'yadi. Lenta uni ikkinchi ishchiga olib boradi, u bo'yaydi. Uchinchisi qadoqlaydi. Pipe — o'sha lenta.

5.2 Mashq fayli

Choyxonaning bugungi buyurtmalarini faylga yozamiz. printf — echo ga o'xshash buyruq, lekin \n ni yangi qatorga aylantiradi (qator oxiri darsidan eslang: \n — LF belgisi):

bash
printf "choy\nosh\nsomsa\nchoy\nmanti\nosh\nchoy\n" > buyurtmalar.txt
cat buyurtmalar.txt
text
choy
osh
somsa
choy
manti
osh
choy

Yetti qator, yetti buyurtma.

5.3 wc — sanash

wc (word count — so'zlarni sanash) qator, so'z va baytlarni sanaydi. Bizga ko'pincha faqat qatorlar kerak — -l (lines):

bash
wc -l buyurtmalar.txt
text
7 buyurtmalar.txt

Endi birinchi pipe. grep choy qatorlarini topadi, wc -l ularni sanaydi:

bash
grep "choy" buyurtmalar.txt | wc -l
text
3

Nima bo'ldi, qadamma-qadam:

  1. grep "choy" buyurtmalar.txt uchta qatorni topdi va ularni stdout'ga yozdi.
  2. | bu uch qatorni ekranga emas, wc -l ning stdin'iga uzatdi.
  3. wc -l kirgan qatorlarni sanadi va 3 ni ekranga chiqardi.

E'tibor bering: wc ga fayl nomi bermadik. Fayl berilmasa, u stdin'dan o'qiydi — pipe aynan shunga ulangan.

Maslahat: ls | wc -l — papkadagi fayllar sonini chiqaradi. Oddiy, lekin juda ko'p ishlatiladi.

5.4 sort — tartiblash

sort qatorlarni alifbo bo'yicha tartiblaydi:

bash
sort buyurtmalar.txt
text
choy
choy
choy
manti
osh
osh
somsa

Foydali flaglar: -r — teskari tartib (reverse), -n — sonlar bo'yicha (numeric). -n nega kerak? Oddiy sort sonlarni ham harf kabi solishtiradi:

bash
printf "15000\n8000\n120000\n9000\n" > narxlar.txt
sort narxlar.txt
text
120000
15000
8000
9000

120000 birinchi — chunki u 1 bilan boshlanadi, 8000 esa 8 bilan. Lug'atda "a" "b" dan oldin kelgani kabi. sort -n esa sonlarni qiymati bo'yicha tartiblaydi:

bash
sort -n narxlar.txt
text
8000
9000
15000
120000

5.5 uniq — takrorlarni olib tashlash

uniq (unique — yagona) bir xil qatorlardan bittasini qoldiradi. Lekin bitta shart bor. Tartiblanmagan faylga ishlatib ko'ring:

bash
uniq buyurtmalar.txt
text
choy
osh
somsa
choy
manti
osh
choy

Hech narsa o'zgarmadi! uniq faqat yonma-yon turgan bir xil qatorlarni birlashtiradi. Bu faylda ikkita choy hech qayerda yonma-yon emas.

Shuning uchun avval sort — u bir xil qatorlarni yonma-yon qo'yadi. Keyin uniq:

bash
sort buyurtmalar.txt | uniq
text
choy
manti
osh
somsa

To'rt xil taom. uniq -c (count — sanash) esa har biri necha marta uchraganini ham yozadi:

bash
sort buyurtmalar.txt | uniq -c
text
      3 choy
      1 manti
      2 osh
      1 somsa

Raqam oldidagi bo'sh joylar — uniq ning odatdagi ko'rinishi, xato emas.

5.6 Hammasini birga: eng mashhur taom

Endi 1-bo'limdagi savolga qaytamiz:

bash
sort buyurtmalar.txt | uniq -c | sort -rn | head -n 1
text
      3 choy

To'rt bosqichli konveyer:

flowchart LR
  A["sort<br/>bir xillarni yonma-yon qo'yadi"] --> B["uniq -c<br/>sanaydi: 3 choy, 1 manti..."]
  B --> C["sort -rn<br/>son bo'yicha, kattasi tepada"]
  C --> D["head -n 1<br/>faqat birinchi qator"]

head -n 1 ni fayllar bilan ishlash darsidan bilasiz — u birinchi qatorlarni oladi. U ham fayl berilmasa, stdin'dan o'qiydi.

Konveyerni bo'lakma-bo'lak quring. Avval sort buyurtmalar.txt ni ishga tushiring va natijaga qarang. Keyin | uniq -c qo'shing, yana qarang. Shunda har bosqich nima qilayotgani ko'rinib turadi va xato bo'lsa — qayerdaligini darhol bilasiz.

Tekshirib ko'ring: sort buyurtmalar.txt | uniq | wc -l nima chiqaradi va bu qaysi savolga javob?

Javob

4. sort | uniq takrorlarsiz ro'yxat beradi (choy, manti, osh, somsa), wc -l esa uni sanaydi. Savol: "Bugun nechta xil taom buyurtma qilindi?"

6. Yana ikki qulay vosita

6.1 < — fayldan stdin'ga

> natijani faylga chiqaradi. Teskari yo'nalish ham bor: < faylni buyruqning stdin'iga beradi.

bash
wc -l < buyurtmalar.txt
text
7

Farqqa qarang: wc -l buyurtmalar.txt — 7 buyurtmalar.txt chiqargan edi. Bu safar fayl nomi yo'q, chunki wc faylni o'zi ochmadi — u shunchaki stdin'dan qatorlar oldi va nomini bilmaydi. Faqat sonni olish kerak bo'lganda qulay.

6.2 tee — ham faylga, ham davomiga

Ba'zan natijani faylga saqlash va ekranda ko'rish (yoki keyingi buyruqqa uzatish) kerak bo'ladi. tee shu ishni qiladi. Nomi "T" harfidan — suv quvurining T shaklidagi ayrisi: oqim ikkiga bo'linadi.

bash
sort buyurtmalar.txt | uniq -c | tee hisobot.txt
text
      3 choy
      1 manti
      2 osh
      1 somsa

Natija ekranga chiqdi va bir vaqtda hisobot.txt ga ham yozildi. tee -a — faylni o'chirmasdan oxiriga qo'shadi (xuddi >> kabi).

tee konveyerning o'rtasida ham turishi mumkin. Unda u nusxani faylga yozadi, oqimni esa ekranga emas, keyingi buyruqqa uzatadi.

Tekshirib ko'ring: sort -u buyurtmalar.txt | tee turlar.txt | wc -l dan keyin ekranda nima chiqadi, turlar.txt ichida nima bo'ladi? (sort -u — tartiblab, takrorlarni olib tashlaydi.)

Javob

Ekranda faqat 4. turlar.txt ichida esa to'rt qator: choy, manti, osh, somsa. tee to'rt qatorni faylga yozdi va xuddi shu qatorlarni wc -l ga uzatdi. Ekranga faqat oxirgi buyruq — wc -l ning natijasi chiqdi.

7. Ko'p uchraydigan xatolar

7.1 >> o'rniga > yozish

echo "yangi buyurtma" > buyurtmalar.txt — va bir kunlik ro'yxat yo'qoldi, faylda bitta qator qoldi. Xato xabari ham chiqmaydi. Qoida: mavjud faylga qo'shayotgan bo'lsangiz — doim >>. Yozishdan oldin bir soniya to'xtab, belgilarni sanang.

7.2 Faylni o'zi ichiga yo'naltirish

Faylni tartiblab, o'shaning o'ziga saqlamoqchi bo'ldingiz:

bash
sort buyurtmalar.txt > buyurtmalar.txt

Natija — fayl butunlay bo'sh (0 qator). Xato chiqmaydi. Nega? royxat.txt misolidagi qoidani eslang: shell > ni ko'rib, sort ishga tushishidan oldin faylni tozalaydi. sort o'qishni boshlaganda fayl allaqachon bo'sh.

Tuzatish: boshqa faylga yozing, keyin nomini almashtiring:

bash
sort buyurtmalar.txt > tartiblangan.txt
mv tartiblangan.txt buyurtmalar.txt

7.3 sort siz uniq

uniq buyurtmalar.txt — takrorlar o'z joyida qoldi, buni yuqorida ko'rdik. uniq faqat yonma-yon qatorlarni ko'radi. Qoida: doim sort | uniq. Yoki qisqasi: sort -u buyurtmalar.txt — tartiblaydi va takrorlarni olib tashlaydi.

7.4 Pipe xatolarni uzatmaydi

bash
ls yoq.txt | wc -l
text
ls: cannot access 'yoq.txt': No such file or directory
0

wc 0 dedi, xato esa ekranga chiqdi. Chunki pipe ham > kabi faqat stdout'ni uzatadi. Xatoni ham uzatish kerak bo'lsa: ls yoq.txt 2>&1 | wc -l — bu safar 1.

7.5 PowerShell'dagi > boshqacha yozadi

Windows PowerShell 5.1 (Windows'da tayyor keladigan versiya) > bilan faylni UTF-16 kodlashda yozadi. Masalan, "Salom" > x.txt dan keyin fayl boshida FF FE baytlari paydo bo'ladi, har harfdan keyin esa 00 bayti turadi. Matn kodlash darsidan bilasizki, ko'p dasturlar UTF-8 kutadi. Bunday faylni ular "g'alati belgilar" bilan o'qiydi.

Tuzatish: bu darsdagi buyruqlarni Git Bash yoki WSL'da bajaring. PowerShell'da faylga yozish kerak bo'lsa, kodlashni aniq ko'rsating: "Salom" | Out-File x.txt -Encoding utf8. Batafsil — PowerShell darsida.

8. Mashqlar

Mashqlarni oqim papkasida bajaring.

1-mashq (oson): Belgini tanlang

Bo'sh joylarga >, >>, 2> yoki | dan birini qo'ying:

  • mehmonlar.txt ga Ali ni yozish (fayl yangi): echo "Ali" mehmonlar.txt
  • Shu faylga Malika ni qo'shish (Ali qolsin): echo "Malika" mehmonlar.txt
  • Mehmonlar sonini sanash: cat mehmonlar.txt wc -l
  • Faqat xatoni faylga yozish: ls yoq.txt xato.txt
Yechim
bash
echo "Ali" > mehmonlar.txt
echo "Malika" >> mehmonlar.txt
cat mehmonlar.txt | wc -l
ls yoq.txt 2> xato.txt
text
2

Birinchisi faylni yaratadi, ikkinchisi oxiriga qo'shadi. Uchinchisida cat fayl matnini stdout'ga chiqaradi, pipe esa uni wc -l ga uzatadi — 2. (Qisqaroq yo'li ham bor: wc -l < mehmonlar.txt.) To'rtinchisida faqat 2-oqim faylga ketadi.

2-mashq (o'rta): Nechta xil?

Taksi haydovchisi Jasur kun davomida qayerga borganini yozib bordi:

bash
printf "Chilonzor\nYunusobod\nChilonzor\n" > manzillar.txt
printf "Sergeli\nYunusobod\nChilonzor\n" >> manzillar.txt

Ikkinchi qatorda >> — birinchi uch manzil o'chib ketmasligi uchun.

Bitta konveyer bilan javob toping:

  1. Jami nechta safar bo'lgan?
  2. Nechta xil tumanga borgan?
  3. Har bir tumanga necha marta borgan?
Yechim
bash
wc -l < manzillar.txt
sort manzillar.txt | uniq | wc -l
sort manzillar.txt | uniq -c
text
6
3
      3 Chilonzor
      1 Sergeli
      2 Yunusobod
  1. Har qator — bitta safar, wc -l sanaydi: 6.
  2. sort | uniq takrorsiz ro'yxat beradi, wc -l uni sanaydi: 3.
  3. uniq -c har biriga son yozadi. sort siz ishlatsangiz, Chilonzor bir necha marta alohida chiqib qolardi.

3-mashq (qiyin): Hisobot

Quyidagi natijani beradigan konveyer yozing. U bir vaqtda top.txt fayliga ham saqlansin:

text
      3 Chilonzor
      2 Yunusobod

Ya'ni: eng ko'p borilgan ikkita tuman, kattasi tepada. Ishora: sort -rn — sonlar bo'yicha teskari, head -n 2 — birinchi ikki qator, tee — ham ekranga, ham faylga.

Yechim
bash
sort manzillar.txt | uniq -c | sort -rn |
  head -n 2 | tee top.txt

Buyruq ikki qatorga bo'lindi — telefonda o'qish oson bo'lsin deb. Qator | bilan tugasa, bash buyruq davom etishini tushunadi va Enter'dan keyin ham kutadi. Terminalda bitta qatorda yozsangiz ham bo'ladi.

Bosqichlar:

  1. sort — bir xil tumanlarni yonma-yon qo'yadi.
  2. uniq -c — sanaydi: 3 Chilonzor, 1 Sergeli, 2 Yunusobod.
  3. sort -rn — qator boshidagi son bo'yicha, kattasi tepada. -n siz ham bu yerda to'g'ri chiqardi, lekin 10 va 9 kabi sonlarda xato tartiblardi.
  4. head -n 2 — faqat ikki qator.
  5. tee top.txt — natijani faylga yozadi va ekranga ham chiqaradi.

cat top.txt bilan faylni tekshiring — ichida ekrandagi ikki qator bo'ladi.

9. Real ishda

  • Loglarni saqlash. Serverda dastur ishga tushganda uning barcha xabarlari faylga yig'iladi: node server.js >> server.log 2>&1. node — JavaScript'ni ishga tushiradigan dastur, uni Node.js darsida o'rnatasiz.
  • Tahlil. "Bugun saytga qaysi sahifa eng ko'p ochildi?" — server jurnalidan grep, sort, uniq -c, sort -rn, head konveyeri bilan bir daqiqada javob.
  • Jim ishlaydigan skriptlar. Avtomatik skriptlarda keraksiz xabarlar > /dev/null bilan o'chiriladi — faqat xato bo'lsa ko'rinadi.
  • Boshqa dasturlarga uzatish. Keyingi darslarda ko'rasiz: curl bilan internetdan olingan ma'lumot pipe orqali JSON'ni chiroyli ko'rsatadigan jq ga uzatiladi.
  • Intervyu. "> va >> farqi?", "2>&1 nima qiladi?" — Linux bo'yicha klassik savollar.

Xulosa

  • Har bir buyruqda uchta oqim bor: stdin (0, kirish), stdout (1, natija), stderr (2, xatolar).
  • > — faylga yozadi (eskisini o'chiradi), >> — oxiriga qo'shadi, < — fayldan stdin'ga beradi.
  • 2> — faqat xatolar; > fayl 2>&1 — ikkalasi bitta faylga; /dev/null — keraksizini yo'q qilish.
  • Pipe | chapdagi buyruq natijasini o'ngdagiga uzatadi; faqat stdout'ni, xatolarni emas.
  • wc -l sanaydi, sort (-n, -r) tartiblaydi, uniq (-c) takrorlarni birlashtiradi — faqat sort dan keyin.
  • Faylni o'zining ichiga yo'naltirmang: sort f > f faylni bo'shatadi.

Keyingi dars: Exit code va buyruqlarni zanjirlash — buyruq muvaffaqiyatli tugadimi yoki xato bilan, buni qanday bilish va shunga qarab keyingi buyruqni ishga tushirish (&&, ||) ni o'rganamiz.

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
Oqimlar, pipe va yo'naltirish: stdin, stdout, stderr — IlmHamroh