ბიბლიოთეკა
00/08 · ~38 წთ
GUIDEDECK · ბრძანების ხაზზე სისწრაფისთვის

Linux & შელი
— პატარა ინსტრუმენტები,
კარგად შეწყობილი.

38-წუთიანი სამუშაო სესია იმ სააზროვნო მოდელზე, რომელიც Unix-ს გასაგებს ხდის: ყველაფერი ფაილია, თითოეული ინსტრუმენტი ერთ საქმეს აკეთებს, პაიპი კი მათ ნებისმიერ რამედ აწებებს. ნავიგაციიდან და უფლებებიდან პროცესებამდე, პაიპებამდე და ტექსტის ინსტრუმენტებამდე, რომლებიც სისწრაფეს გმატებთ.

~38 წთშერეული გუნდიBASH / ZSH
გადაახვიეთ
01 · რატომ შელი 4 წთ

ერთი იდეა ხსნის Unix-ს:
ყველაფერი ფაილია.

გრაფიკული აპლიკაცია საშუალებას გაძლევთ, ერთ დროს ერთი ამოცანა შეასრულოთ დაწკაპუნებით. შელი კი მის ნაცვლად ამოცანების ენას გაძლევთ — რომ შეინახოთ ისინი, ხელახლა გაუშვათ და ერთმანეთს დააკავშიროთ. და ეს ყველაფერი ერთ მარტივ იდეას ეყრდნობა: ფაილები, დირექტორიები, მოწყობილობები და გაშვებული პროგრამებიც კი ერთი და იმავე პაწაწინა გზით მუშავდება.

შელი არის წაკითხვა-გაშვება-დაბეჭდვის ციკლი: თქვენ წერთ ერთ ხაზს, ის უშვებს მას, გაჩვენებთ შედეგს და შემდეგ ხაზს ელოდება. ორი სიტყვა, რომელსაც ხშირად ურევენ: ტერმინალი უბრალოდ ფანჯარაა თქვენს ეკრანზე; შელი კი (პროგრამები, როგორიცაა bash ან zsh) პატარა ინტერპრეტატორია, რომელიც ამ ფანჯრის შიგნით მუშაობს — კითხულობს თქვენს ტექსტს და თქვენთვის ნამდვილ პროგრამას უშვებს.

ტერმინალი vs. შელი vs. პროგრამა

  • ტერმინალი ხატავს ფანჯარას და აჩვენებს ტექსტს — მეტს არაფერს.
  • შელი კითხულობს თქვენ მიერ აკრეფილ ხაზს, ხვდება, რომელი პროგრამა გულისხმობდით, და უშვებს მას.
  • პროგრამის მოსაძებნად შელი გადაათვალიერებს $PATH-ში ჩამოთვლილ დირექტორიებს — ეს უბრალოდ საძებნი დირექტორიების სიაა. აკრიფეთ git და ის თქვენთვის იპოვის /usr/bin/git-ს.

ტერმინალი ფანჯარაა; მის შიგნით მყოფი შელი კითხულობს თქვენს ხაზს და უშვებს პროგრამას.

"ყველაფერი ფაილია"

  • ჩვეულებრივი ფაილი, დირექტორია, თქვენი დისკი, თქვენი კლავიატურა, ქსელური კავშირი — ბირთვი (ოპერაციული სისტემის გული) ყველა მათგანთან წვდომას ერთი და იმავე ოთხი ძირითადი ოპერაციით გაძლევთ: open, read, write, close.
  • სწორედ ამიტომ მუშაობს cat file.txt და cat /dev/null ერთნაირად — ორივე უბრალოდ ბაიტებია, რომელსაც კითხულობთ.
  • ამიტომვე მუშაობს პაიპები: ერთი პროგრამის გამონატანი უბრალოდ ბაიტებია, რომელსაც მეორეს წაკითხვა შეუძლია.

ერთი პატარა API; ყველა რესურსი ბაიტების ნაკადად გამოიყურება.

GUI — ხელით და გაუმეორებელი
# resize 200 photos in an image editor: # open each → Image → Resize → 800px → Save… # 200× clicking · no record · can't hand off # did you do #173? who knows.
შელი — გამეორებადი წინადადება
for f in *.jpg; do convert "$f" -resize 800 "out/$f" done # one line · repeatable · scriptable · reviewable

რომელი შელი? bash vs. zsh vs. fish

სამივე ერთსა და იმავე ბრძანებებს უშვებს, რომლებსაც აქ ისწავლით. ისინი ძირითადად იმით განსხვავდებიან, რამდენად სასიამოვნოა მათში ყოველდღიური აკრეფა — რამდენად გეხმარებიან დასრულებაში, ისტორიასა და შემოთავაზებებში.

bash · ნაგულისხმევი

ის, რომელიც ყველგანაა

სტანდარტული შელი თითქმის ყველა Linux სერვერზე და ის, რასაც თითქმის ყველა გაკვეთილი და სკრიპტი გულისხმობს.

  • დადებითი — ყველგან ნაგულისხმევად დაყენებულია, ამიტომ თქვენი სკრიპტები ყველგან სიურპრიზების გარეშე მუშაობს.
  • უარყოფითი — ყუთიდან უბრალოა: ცოცხალი შემოთავაზებები არ აქვს და მისი tab-დასრულება დანარჩენებთან შედარებით მოძველებულად გამოიყურება.
zsh · გაუმჯობესება

bash, ოღონდ უფრო კომფორტული

თქვენს bash ბრძანებებს თითქმის უცვლელად უშვებს, მაგრამ ამატებს ჭკვიან დასრულებას და თემებს (დანამატებით, როგორიცაა Oh My Zsh). ნაგულისხმევია macOS-ზე.

  • დადებითი — კომფორტის დიდი ნახტომი bash-თან თავსებადობის შენარჩუნებით, ამიტომ თითქმის არაფრის ხელახლა სწავლა არ გჭირდებათ.
  • უარყოფითი — საუკეთესო ნაწილებს პლაგინები და კონფიგურაციის ფაილი სჭირდება, სანამ გაბრწყინდება.
fish · მეგობრული

სასარგებლო ნულოვანი მორგებით

შექმნილია იმისთვის, რომ პირველივე გაშვებიდან სასიამოვნო იყოს: აკრეფისას ბრძანებებს გთავაზობთ და ხაზს ფერავს, რომ შეცდომები დაიჭიროთ — კონფიგურაცია არ სჭირდება.

  • დადებითი — ყველაზე მეგობრული გამოცდილება ყუთიდანვე; შესანიშნავია დამწყებთათვის.
  • უარყოფითი — მისი სინტაქსი bash-თან თავსებადი არაა, ამიტომ bash სკრიპტები და კოპირებული ნაწყვეტები უცვლელად არ იმუშავებს.

როგორ ავირჩიოთ  თქვენი სკრიპტები bash-ზე დაწერეთ, რომ ნებისმიერ მანქანაზე იმუშაოს. ყოველდღიური აკრეფისთვის კი zsh ან fish აირჩიეთ უკეთესი გამოცდილებისთვის — ნასწავლი ბრძანებები სამივეზე გადადის.

02 · დისტრიბუციები 4 წთ

ერთი ბირთვი,
ბევრი დისტრიბუცია.

"Linux" სინამდვილეში მხოლოდ ბირთვია. თქვენ კი დისტრიბუციას აყენებთ — იმავე ბირთვს, შეფუთულს პაკეტების მენეჯერით, ნაგულისხმევი ინსტრუმენტებითა და რელიზების პოლიტიკით. აირჩიეთ შეფუთვა, რომელიც თქვენს გუნდს უხდება; ქვემოთ არსებული შელი ყველგან იდენტურია.

დისტრიბუცია ("დისტრო") — Linux-ის ბირთვი + პაკეტების მენეჯერი + შერჩეული ინსტრუმენტების ნაკრები და რელიზების პოლიტიკა, შეფუთული და მხარდაჭერილი ერთ ოპერაციულ სისტემად. ბირთვი საერთოა; დისტროები განსხვავდებიან შეფუთვით, ნაგულისხმევებით, რიტმითა და მხარდაჭერით — და არა იმ ბრძანებებით, რომლებსაც ყოველდღიურად აკრეფთ.
apt · .deb

Debian / Ubuntu

მეგობრული ნაგულისხმევი არჩევანი. უზარმაზარი საზოგადოება, პაკეტების უამრავი ნაკრები, კლდესავით მყარი. Ubuntu ამატებს კომერციულ მხარდაჭერას (Canonical) და პროგნოზირებად LTS რელიზებს — უსაფრთხო არჩევანი სერვერებისა და დესკტოპების უმეტესობისთვის.

dnf · .rpm

RHEL / Fedora / Rocky

საწარმოო შტო. RHEL გთავაზობთ ფასიან გრძელვადიან მხარდაჭერას; Rocky & Alma უფასო, ბაგ-ბაგზე გადაწყობილი ასლებია; Fedora კი სწრაფად მოძრავი წყაროა. აირჩიეთ იქ, სადაც მხარდაჭერა და სერტიფიცირებული სტაბილურობა მნიშვნელოვანია.

pacman · უწყვეტი

Arch

მინიმალური და თვითნაკეთი — სისტემას თავად აწყობთ და ის უწყვეტად ახლდება (rolling release). უახლესი და შესანიშნავად დოკუმენტირებული (Arch Wiki). შესანიშნავია კონტროლისთვის და იმის სასწავლად, როგორ ეწყობა Linux ერთმანეთს.

apk · musl

Alpine

პაწაწინა და უსაფრთხოებაზე ორიენტირებული (~5 MB). აგებულია musl libc-სა და busybox-ზე — ფაქტობრივი საბაზისო იმიჯი კონტეინერებისთვის, სადაც ყოველი მეგაბაიტი და CVE ითვლება.

ერთი და იგივე განზრახვა, სხვადასხვა მენეჯერი

# nginx-ის დაყენება — ერთი იდეა, ოთხი მენეჯერი apt install nginx # Debian / Ubuntu (.deb) dnf install nginx # RHEL / Fedora / Rocky (.rpm) pacman -S nginx # Arch apk add nginx # Alpine (კონტეინერები)

ჰგავს  სხვადასხვა სასურსათო ქსელს: საკვები ერთი და იგივეა, მხოლოდ თაროები და სალარო განსხვავდება.

როგორ ავირჩიოთ

  • სერვერის / გუნდის ნაგულისხმევი → Ubuntu LTS ან Debian: ყველგანაა, სტაბილურია, ადვილია ადამიანების დაქირავება.
  • საწარმო & მხარდაჭერის კონტრაქტები → RHEL (ან უფასო Rocky / Alma) გრძელი, სერტიფიცირებული სასიცოცხლო ციკლისთვის.
  • კონტეინერები → Alpine ან distroless ბაზა — მცირე ზედაპირი, სწრაფი ჩამოტვირთვა.
  • სწავლა / სრული კონტროლი → Arch: თავად აწყობთ და ყოველ ნაწილს იგებთ.
  • წესი: დისტრო წყვეტს შეფუთვას, რიტმსა და მხარდაჭერას — და არა თქვენს შელის უნარებს. ისინი ყველგან გადადის.
03 · ფაილები და ნავიგაცია 5 წთ

ერთი ხე, ფესვით /-ში.
ისწავლეთ მასში მოძრაობა.

დისკის ასოები არ არსებობს. ყოველი დისკი, USB მეხსიერება და ქსელური მონტაჟი ერთ ხეზე ეკიდება, რომელიც /-დან იწყება. აითვისეთ რამდენიმე მოძრაობა და აღარ იფიქრებთ, რა სად არის.

ფაილთა სისტემა ერთი იერარქიაა / (root) ფესვით. გზა ამ ხეში მისამართია. აბსოლუტური გზები /-დან იწყება (/etc/hosts); ფარდობითი გზები კი იქიდან, სადაც დგახართ — თქვენი სამუშაო დირექტორიიდან (pwd).

ყველაფერი /-დან მოდის. ~ მალსახმობია თქვენს /home/<you>-ზე.

ხუთი მალსახმობი, რომელსაც მნიშვნელობა აქვს

  • . — აქ (მიმდინარე დირექტორია).
  • .. — ერთი დონით ზემოთ.
  • ~ — თქვენი საშინაო დირექტორია.
  • - — დირექტორია, სადაც წეღან იყავით.
  • Tab — სახელების ავტოდასრულება; ყველაზე ნაკლებად გამოყენებული ღილაკი.

pwd გეუბნებათ სად ხართ, ls გაჩვენებთ რა არის აქ, cd კი გადაგაადგილებთ.

მისამართის ხელახლა აკრეფა
cd /home/maria/projects/api/src/handlers # …go look at something else, then: cd /home/maria/projects/api/src/handlers # type the same 40 characters again
ფარდობითი ნაბიჯი + მალსახმობი
cd ~/projects/api # ~ = your home cd src/handlers # relative to here cd .. # back up one level cd - # jump to the previous dir
ls — ნახეთ რა არის აქ

წაიკითხეთ ჩამონათვალი

უბრალო ls დეტალებს მალავს. ფლაგები, რომლებშიც იცხოვრებთ: -l გრძელი ფორმა, -a დამალულების ჩათვლით (წერტილიანი ფაილები), -h ადამიანური ზომები, -t ახლები პირველად.

ls -lah # -rw-r--r-- 1 maria web 2.4K config.yml # perms links owner group size name
globbing — შაბლონით ძებნა

დაე, შელმა გაშალოს სახელები

შელი *, ? და […] სიმბოლოებს შესაბამის ფაილთა სახელებად შლის მანამ, სანამ ბრძანება გაეშვება — ასე ნებისმიერი ბრძანება უფასოდ იღებს შაბლონურ ძებნას.

ls *.log # every .log here ls **/*.test.ts # recursive (globstar) ls report-?.csv # one char: report-1.csv… rm draft-[0-9].md # a character class
04 · უფლებები და მფლობელობა 5 წთ

ვის შეუძლია კითხვა, წერა
და გაშვება — და პასუხი თითო ფაილზე.

ყოველ ფაილს აქვს მფლობელი, ჯგუფი და უფლებების სამი ნაკრები — მფლობელისთვის, ჯგუფისთვის და ყველა დანარჩენისთვის. როცა rwxr-xr-x-ს ერთი შეხედვით წაიკითხავთ, უფლებები საშიში აღარ იქნება.

უფლებები პასუხობს კითხვას, ვის რა შეუძლია ფაილთან. სამი ქმედება — read (კითხვა), write (წერა), execute (გაშვება) — ენიჭება სამ აუდიტორიას: მომხმარებელს (მფლობელს), ჯგუფს და დანარჩენებს. სწორედ ესაა ცხრა ასო rwxr-xr-x-ში.
-
rwx
r-x
r--
ტიპი
მფლობელი
ჯგუფი
სხვები
7
5
4
4+2+1
4+0+1
4+0+0

-rwxr-xr-x = 755. რვაობითი უბრალოდ r=4, w=2, x=1-ის ჯამია თითო აუდიტორიისთვის.

chmod — რეჟიმის შეცვლა

რვაობითი ან სიმბოლური

დააყენეთ ბიტები რიცხობრივად (755) ან შეასწორეთ ასოებით (+x, g-w). დირექტორიებზე x ნიშნავს "შესვლის უფლებას", და არა "გაშვების უფლებას".

chmod 644 config.yml # rw- r-- r-- chmod +x deploy.sh # make runnable chmod g-w report.txt # group: drop write
chown — მფლობლის შეცვლა

მფლობელი და ჯგუფი

chown user:group ფაილს ახალ მფლობელს და/ან ჯგუფს გადასცემს. -R რეკურსიულად გადის დირექტორიის ხეს. ჩვეულებრივ sudo სჭირდება.

chown maria config.yml chown maria:web config.yml chown -R maria:web /srv/app
root & sudo

სუპერმომხმარებელი

root უფლებების ყველა შემოწმებას გვერდს უვლის. sudo ერთ ბრძანებას უშვებს root-ის სახელით — ისესხეთ ძალა და დააბრუნეთ. ის ჯობია, ვიდრე root-ით შესვლა.

sudo systemctl restart nginx # run a single command as root # then you're back to being you
chmod 777 — კლასიკური ხვრელი
chmod 777 deploy.sh # rwx for EVERYONE — anyone can rewrite # the script your server runs as root chmod -R 777 /var/www # …now any process can tamper with the site
მინიმალური პრივილეგია — მიეცით მინიმუმი
chmod 755 deploy.sh # you: rwx · others: r-x chmod 644 config.yml # you: rw- · others: r-- chmod 600 .env # secrets: only you chown maria:web config.yml

ჰგავს  ოფისს: მფლობელს გასაღები აქვს (rwx), მის გუნდს ოთახში შესვლა შეუძლია (r-x), საზოგადოებას კი მხოლოდ კარზე დაკიდებული ტაბულის წაკითხვა (r--). 777 ყველა კარს ღიად ტოვებს.

05 · პროცესები, ჯობები, სიგნალები 5 წთ

ყოველი ბრძანება პროცესია.
შეგიძლიათ უყუროთ, შეაჩეროთ და ესაუბროთ.

გაშვებული პროგრამა არის პროცესი რიცხვითი PID-ით. პროცესებს სიგნალების — პატარა, დასახელებული შეტყობინებების — გაგზავნით მართავთ, ხოლო რამდენიმეს ერთდროულად ჯობებით ახერხებთ.

პროცესი არის პროგრამის გაშვებული ეგზემპლარი — მას აქვს მეხსიერების საკუთარი ნაწილი, საკუთარი გახსნილი ფაილები და საიდენტიფიკაციო ნომერი, სახელად PID. სიგნალი ერთსიტყვიანი შეტყობინებაა, რომელსაც ბირთვი მას აწვდის: SIGTERM (გაჩერდი, თუ შეიძლება), SIGKILL (გაჩერდი ახლავე, კითხვების გარეშე), SIGINT (Ctrl-C), SIGHUP (ტერმინალი დაიხურა).

SIGTERM თავაზიანად ითხოვს და პროცესს დასუფთავების საშუალებას აძლევს. SIGKILL-ის დაჭერა შეუძლებელია — მხოლოდ უკიდურეს შემთხვევაში.

ჯერ დახედეთ, მერე ახტით

  • ps aux — ყოველი პროცესის სურათი (მფლობელი, PID, CPU, მეხსიერება, ბრძანება).
  • top / htop — ცოცხალი ხედი; დაალაგეთ CPU-თი ან მეხსიერებით.
  • pgrep nginx — იპოვეთ PID-ები სახელით; pkill nginx მათ სიგნალს უგზავნის.
  • kill -l — ჩამოთვლის ყველა სიგნალს და მის ნომერს.
ps aux | grep node # maria 4821 3.1 1.2 node server.js kill 4821 # ნაგულისხმევად SIGTERM
პირველად kill -9-ის გამოყენება
kill -9 4821 # SIGKILL: the process dies mid-write # → half-flushed files, stale lock files, # orphaned children, corrupt state
ჯერ თხოვეთ, საჭიროებისას აიძულეთ
kill 4821 # SIGTERM (15): "please shut down" # …let it flush buffers + release locks… kill -9 4821 # SIGKILL only if it's truly stuck
jobs — ბევრი საქმე, ერთი ტერმინალი

წინა & უკანა პლანი

& ბრძანებას უკანა პლანზე უშვებს. Ctrl-Z წინა პლანზე მყოფს აჩერებს; bg/fg კი მას უკან ან წინ აგრძელებს.

./backup.sh & # run in the background jobs # [1]+ Running ./backup.sh fg %1 # pull job 1 to the front
გადარჩენა გათიშვისას

გაგრძელდეს გასვლის შემდეგაც

ტერმინალის დახურვა მის შვილებს SIGHUP-ს უგზავნის. nohup (ან ტერმინალის მულტიპლექსორი, როგორიცაა tmux) ამოცანას ტერმინალისგან წყვეტს, რომ მან მუშაობა განაგრძოს.

nohup ./long-import.sh & # immune to SIGHUP; logs to nohup.out # for real work, prefer tmux / screen
06 · პაიპები და რედირექტი 5 წთ

პატარა ინსტრუმენტები, |-ით შეწებებული.
ტექსტი უნივერსალური ინტერფეისია.

ყოველ პროგრამას სამი ნაკადი აქვს: stdin, stdout და stderr. გადამისამართება ცვლის, სად მიდიან ისინი; პაიპი კი ერთი პროგრამის გამონატანს პირდაპირ მეორის შემონატანში აერთებს. ესაა Unix-ის მთელი სუპერძალა.

სამი ნაკადი — ყოველი პროცესი იბადება stdin (0), stdout (1) და stderr (2) ნაკადებით. ნაგულისხმევად stdin თქვენი კლავიატურაა, stdout/stderr კი თქვენი ეკრანი. შელი საშუალებას გაძლევთ, ნებისმიერი მათგანი სხვაგან მიმართოთ.

პაიპი აერთებს stdout → stdin-ს. გაითვალისწინეთ: stderr ნაგულისხმევად არ გადადის პაიპში — გავრცელებული ხაფანგია.

რედირექტი — > >> < 2>

მიმართეთ ნაკადი ფაილში

cmd > out.txt # stdout → file (overwrite) cmd >> out.txt # stdout → file (append) cmd 2> err.txt # stderr → file cmd > all 2>&1 # both → same file cmd < input.txt # file → stdin cmd > /dev/null # discard output entirely
შემაერთებლები

tee, xargs & კომპანია

tee ნაკადს ყოფს ფაილში და შემდგომაც. xargs stdin-ს ბრძანების არგუმენტებად აქცევს — ხიდი იმ ინსტრუმენტებისთვის, რომლებიც არგუმენტებს კითხულობენ და არა stdin-ს.

make 2>&1 | tee build.log # watch it AND save it find . -name "*.tmp" | xargs rm # feed each result as an argument to rm
დროებითი ფაილი ყოველ ნაბიჯზე
grep ERROR app.log > tmp1 sort tmp1 > tmp2 uniq -c tmp2 > tmp3 rm tmp1 tmp2 tmp3 # bookkeeping + disk churn
ერთი ნაკადი, ბოლომდე
grep ERROR app.log | sort | uniq -c # data flows through memory — # no temp files, no cleanup, # each tool does exactly one job
07 · ტექსტის ხელსაწყოები 6 წთ

ოთხი ინსტრუმენტი ფარავს
ყოველდღიური ტექსტური სამუშაოს უმეტესობას.

grep პოულობს ხაზებს, sed არედაქტირებს ნაკადებს, awk სვეტებში მუშაობს, find კი ხეს გადის. ისწავლეთ მათი ძირითადი ფლაგები და თითქმის ნებისმიერ "სად / რა / რამდენი" კითხვას სკრიპტის დაწერის გარეშე უპასუხებთ.

ესენი ფილტრებია: თითოეული კითხულობს ტექსტს stdin-ზე (ან ფაილებიდან), გარდაქმნის მას და stdout-ში წერს — ამიტომ ისინი პაიპებით ერთმანეთს ებმის. აითვისეთ თითო ფლაგების ნაკრები ცალ-ცალკე; ერთდროულად ყველა იშვიათად გჭირდებათ.

grep — იპოვეთ ხაზები, რომლებიც ემთხვევა

grep -r "TODO" src/ # დირექტორიის რეკურსია grep -i "error" app.log # რეგისტრის უგულებელყოფა grep -n "port" config.* # ხაზების ნომრები grep -c "200 " access.log # დამთხვევების დათვლა grep -v "DEBUG" app.log # ინვერსია: ხაზები მის გარეშე grep -E "4[0-9]{2}" log # გაფართოებული regex: 4xx კოდები
მიმართეთ, როცა
გჭირდებათ რაღაცის პოვნა — სტრინგის, შაბლონის, შეცდომის — ფაილებში ან ნაკადში.
დაიმახსოვრეთ
-r რეკურსია, -i რეგისტრის უგულებელყოფა, -n ხაზების ნომრები, -v ინვერსია.

sed — დაარედაქტირეთ ნაკადი, ხაზ-ხაზ

sed 's/foo/bar/' file # შეცვლის პირველს თითო ხაზში sed 's/foo/bar/g' file # შეცვლის ყველას (გლობალურად) sed -i 's/v1/v2/g' *.yml # ფაილების ადგილზე რედაქტირება sed -n '10,20p' file # დაბეჭდავს მხოლოდ ხაზებს 10–20 sed '/^#/d' conf # წაშლის კომენტარის ხაზებს
მიმართეთ, როცა
გინდათ პოვნა-და-ჩანაცვლება ბევრ ფაილში ან ხაზების დიაპაზონის ამოღება, ინტერაქციის გარეშე.
ფრთხილად
-i ფაილებს გადაწერს — ჯერ მის გარეშე გატესტეთ ან სარეზერვო ასლი შეინახეთ (-i.bak).

awk — იფიქრეთ სვეტებით

awk '{print $1}' access.log # პირველი ველი awk -F: '{print $1}' /etc/passwd # : როგორც გამყოფი awk '$3 > 500' sizes.txt # ფილტრი სვეტზე awk '{s += $2} END {print s}' data # სვეტის ჯამი awk '/ERROR/ {print $1, $5}' log # დამთხვევა + შერჩევა
მიმართეთ, როცა
მონაცემები ჰარეებით ან გამყოფითაა დაყოფილი და გინდათ კონკრეტული სვეტი, ფილტრი ან სწრაფი ჯამი/საშუალო.
სააზროვნო მოდელი
$0 მთელი ხაზია; $1…$n ველებია; -F გამყოფს აყენებს.

find — გაიარეთ ხე კრიტერიუმებით

find . -name "*.log" # სახელით find . -type f -mtime -1 # ფაილები, შეცვლილი < 1 დღეში find . -size +100M # 100 MB-ზე დიდი find . -name "*.tmp" -delete # დამთხვევა, შემდეგ წაშლა find . -name "*.js" -exec wc -l {} \;
მიმართეთ, როცა
გჭირდებათ ფაილები ატრიბუტით — სახელი, ტიპი, ზომა, ასაკი — ხის ნებისმიერ ადგილას, შემდეგ კი თითოეულზე მოქმედება.
ერწყმის
-exec … ან | xargs, რომ თითო დამთხვევაზე ბრძანება გაუშვათ.

წებო: sort, uniq, cut, wc

cut -d, -f1,3 data.csv # CSV-ის სვეტები 1 & 3 sort access.log | uniq -c # დუბლიკატი ხაზების დათვლა sort -rn -k2 sizes.txt # რიცხობრივი, კლებადი, სვეტი 2 wc -l *.log # ხაზების დათვლა თითო ფაილში cut -d' ' -f1 access.log | sort | uniq -c | sort -rn
შაბლონი
ბოლო ხაზი Unix-ის მთავარი ხრიკია: ამოღება → დალაგება → დათვლა → რანჟირება. ტოპ IP-ები, ყველაზე დატვირთული ენდპოინტები, ყველაზე ხმაურიანი შეცდომები — ყველა ერთი და იგივე პაიპლაინია.
შენიშვნა
uniq მხოლოდ მეზობელ დუბლიკატებს კუმშავს, ამიტომ sort ყოველთვის წინ მოდის.

tail & head — უყურეთ ლოგს რეალურ დროში

tail -n 50 app.log # ბოლო 50 ხაზი head -n 20 app.log # პირველი 20 ხაზი tail -f app.log # გაყევი: ახალი ხაზები ცოცხლად tail -F /var/log/app.log # გაყევი როტაციის შემდეგაც tail -f app.log | grep -i error # ცოცხალი, გაფილტრული ნაკადი
მიმართეთ, როცა
გინდათ ლოგის რეალურ დროში ხედვა — უყუროთ მოთხოვნებს, შეცდომებს ან დეპლოის ნაკადს მათი მოვლენისთანავე, cat-ის ხელახლა გაშვების ნაცვლად.
დაიმახსოვრეთ
-f მიჰყვება ფაილს; -F ლოგის როტაციასაც გადაიტანს; გაატარეთ grep-ში, რომ მხოლოდ მნიშვნელოვანს მიჰყვეთ. გასაჩერებლად Ctrl-C.
08 · დღიური რეცეპტები, შეჯამება 4 წთ

პატარა ჩვევები, რომლებიც
სისწრაფესა და უსაფრთხოებას გინარჩუნებთ.

რამდენიმე ცუდი → კარგი ჩანაცვლება, რომელიც ყველას ისტორიაში გვხვდება, შემდეგ კი ხუთი წესი, რომელსაც თან წაიღებთ.

ზედმეტი cat
cat app.log | grep ERROR # an extra process for nothing
grep თავად კითხულობს ფაილს
grep ERROR app.log # one process, same result
ls-ის პარსინგი
for f in $(ls); do … # breaks on spaces & newlines
დაე, გლობმა გააკეთოს
for f in *.txt; do … # safe with any filename
დაუცველი, უბრჭყალო rm
rm -rf $DIR/ # if $DIR is empty → rm -rf / (disaster)
ბრჭყალი, ადრე ვარდნა
set -u # unset var = error rm -rf "${DIR:?}/" # refuse if empty
1ყველაფერი ფაილია. ერთი API ფაილებისთვის, დირექტორიებისთვის, მოწყობილობებისა და პაიპებისთვის — სწორედ ამიტომ ეწყობა ინსტრუმენტები ერთმანეთს.
2შეაწყვეთ პატარა ინსტრუმენტები. თითოს ერთი საქმე, შეერთებული |-ით. ტექსტი მათ შორის უნივერსალური ინტერფეისია.
3მინიმალური პრივილეგია. მიეცით მინიმუმი (644/755); არასდროს chmod 777.
4სიგნალი თავაზიანად. SIGTERM პროცესს დასუფთავების საშუალებას აძლევს; SIGKILL (-9) ნამდვილი გაჭედვისთვის შემოინახეთ.
5თუ ორჯერ აკრიფეთ, დაასკრიპტეთ. შელი პროგრამირების ენაა — ჩასვით ცვლადები ბრჭყალებში და აიძულეთ, თქვენთვის იმუშაოს.

გააგრძელეთ

  • The Linux Command Line — William Shotts (უფასო PDF, linuxcommand.org)
  • explainshell.com — ჩასვით ნებისმიერი ბრძანება და იხილეთ ყოველი ფლაგის ახსნა
  • man & tldr — სახელმძღვანელო და მისი მეგობრული, მაგალითებით დაწყებული ვერსია
  • ShellCheck — ლინტერი, რომელიც ზემოთ ნახსენებ ბრჭყალების ბაგებს იჭერს

ყოველი სკრიპტი დაიწყეთ set -euo pipefail-ით: გამოსვლა შეცდომებზე (-e), დაუყენებელი ცვლადების შეცდომად ჩათვლა (-u) და პაიპლაინის ჩავარდნა, თუ რომელიმე საფეხური ჩავარდა (-o pipefail). ეს ჩუმ გაფუჭებას ხმამაღალ, ადრეულ გაჩერებად აქცევს.

ერთი წინადადება დასამახსოვრებლად

"წერეთ პროგრამები, რომლებიც ერთ საქმეს კარგად აკეთებენ. წერეთ პროგრამები, რომლებიც ერთად მუშაობენ. აქციეთ ტექსტი უნივერსალურ ინტერფეისად."

— Doug McIlroy, Unix-ის ფილოსოფია

ცოდნის შემოწმება

დაგამახსოვრდათ?

ხუთი სწრაფი კითხვა შელზე, უფლებებზე, პროცესებზე, პაიპებსა და ტექსტის ხელსაწყოებზე — მყისიერი უკუკავშირი, ავტორიზაციის გარეშე.

შეაფასეთ ეს დასტა
იყავით პირველი

ნავიგაცია ← → ღილაკებით ან სქროლით · ბიბლიოთეკაში დაბრუნება