Како користити команду иес на Линук-у

Komanda `yes` deluje previše jednostavno da bi bila od neke praktične koristi, ali u ovom uputstvu ćemo vam pokazati njenu primenu i kako da iskoristite njenu neprekidnu pozitivnost u Linuxu i macOS-u.

Komanda `yes`

Komanda `yes` je jedna od najosnovnijih komandi dostupnih u Linuxu i drugim operativnim sistemima koji su slični Unix-u, poput macOS-a. Pod „osnovna“ mislimo na jednostavnost njene upotrebe, kao i na inicijalnu implementaciju. Izvorni kod za originalnu verziju, koju je objavio Ken Thompson u System 7 Unix-u, sastoji se od svega šest linija koda.

Ipak, nemojte je odbacivati samo zato što je mala i jednostavna. Može se koristiti na nekoliko zanimljivih i korisnih načina.

Šta radi `yes`?

Kada se koristi bez parametara komandne linije, komanda `yes` se ponaša kao da neprestano kucate slovo „y“ i pritiskate Enter. Veoma brzo. I nastaviće to da radi sve dok je ne zaustavite kombinacijom tastera Ctrl+C.

yes

Zapravo, `yes` se može koristiti za neprekidno generisanje bilo koje poruke koju izaberete. Jednostavno otkucajte `yes`, razmak, pa tekst koji želite da se ponavlja, i pritisnite Enter. Ovo se često koristi za generisanje niza reči „yes“ ili „no“.

yes yes

yes bilo šta što želite

U čemu je korist?

Izlaz komande `yes` može se proslediti drugim programima ili skriptama.

Da li vam ovo zvuči poznato? Pokrećete dugotrajan proces i udaljavate se od računara, ostavljajući ga da radi. Kada se vratite, proces još uvek nije završen. U vašem odsustvu, proces je postavio pitanje i čeka odgovor „da“ ili „ne“.

Ako unapred znate da će svi vaši odgovori biti potvrdni („da“ ili „y“) ili negativni („ne“ ili „n“), možete upotrebiti `yes` da automatski date te odgovore. Vaš dugotrajan proces će se potom odvijati do kraja bez vašeg nadzora, automatski odgovarajući na sva pitanja koja se pojave tokom procesa.

Korišćenje `yes` sa skriptama

Pogledajte sledeću Bash shell skriptu. (Zamislite da je ovo deo mnogo veće skripte kojoj je potrebno dosta vremena da se izvrši.)

#!/bin/bash

# ...
# u sredini neke duge skripte
# dobijamo odgovor od korisnika
# ...

echo "Da li ste zadovoljni da nastavimo? [y,n]"
read input

# da li smo dobili neku vrednost?
if [ "$input" == "" ]; then

   echo "Korisnik nije uneo ništa"

# da li je odgovor y ili yes?
elif [[ "$input" == "y" ]] || [[ "$input" == "yes" ]]; then

   echo "Potvrdan odgovor: $input"

# sve ostalo tretiramo kao negativan odgovor
else

   echo "Negativan odgovor: $input"

fi

Ova skripta postavlja pitanje i čeka na odgovor. Logički tok skripte se odlučuje na osnovu korisnikovog unosa.

„Da“ ili „y“ označava potvrdan odgovor.
Bilo koji drugi unos se tretira kao negativan odgovor.
Pritiskom na Enter bez unosa teksta, neće se ništa desiti.

Da biste ovo testirali, kopirajte skriptu u datoteku i sačuvajte je kao `long_script.sh`. Koristite `chmod` da biste je učinili izvršnom.

chmod +x long_script.sh

Pokrenite skriptu sledećom komandom. Pokušajte da unesete „da“, „y“ i bilo šta drugo kao unos, uključujući i pritisak na Enter bez unosa teksta.

./long_script.sh

Da biste automatski odgovorili na pitanje u skripti, prosledite izlaz `yes` komande skripti.

yes | ./long_script.sh

Neke skripte su strožije u svojim zahtevima i prihvataju samo punu reč „da“ kao potvrdan odgovor. Možete da navedete „da“ kao parametar za `yes`, na sledeći način:

yes yes | ./long_script.sh

Nemojte bez razmišljanja koristiti `yes`

Morate biti sigurni da će unos koji prosleđujete skripti ili programu sigurno dati željeni rezultat. Da biste doneli tu odluku, morate da znate koja pitanja će biti postavljena i šta treba da odgovorite.

Logika unutar skripte, komande ili programa možda se neće poklapati sa vašim očekivanjima. U našem primeru skripte, pitanje je moglo biti „Da li želite da prekinete? [y,n]“. Da je to bio slučaj, negativan odgovor bi omogućio nastavak skripte.

Morate biti upoznati sa skriptom, komandom ili programom pre nego što bezumno prosledite automatske odgovore pomoću komande `yes`.

Korišćenje `yes` sa komandama

U prošlosti, `yes` se često koristio sa drugim Linux komandama. Od tada, većina tih Linux komandi ima svoje načine rada bez ljudske interakcije. Upotreba komande `yes` nije više neophodna za postizanje istog efekta.

Uzmimo za primer Ubuntu menadžer paketa `apt-get`. Da biste instalirali aplikaciju bez pritiskanja „y“ na pola puta tokom instalacije, `yes` se koristilo na sledeći način:

yes | sudo apt-get install fortune-mod

Isti rezultat se može postići korišćenjem opcije `-y` (pretpostavi da) u komandi `apt-get`:

sudo apt-get -y install fortune-mod

Videćete da `apt-get` nije čak ni postavio svoje uobičajeno pitanje „Da li želite da nastavite? [Y/n]“. Jednostavno se pretpostavilo da će odgovor biti „da“.

Situacija je ista i na drugim Linux distribucijama. Na Fedori, nekada ste koristili ovaj tip komande menadžera paketa:

yes | yum install fortune-mod

Menadžer paketa `dnf` je zamenio `yum`, a `dnf` ima sopstvenu opciju `-y` (pretpostavi da).

dnf -y install fortune-mod

Isto važi i za `cp`, `fsck` i `rm`. Svaka od ovih komandi ima svoje opcije `-f` (force) ili `-y` (pretpostavi da).

Dakle, da li se čini da je upotreba `yes` ograničena samo na rad sa skriptama? Ne baš. Ova komanda još uvek ima nekoliko trikova.

Neki dodatni `yes` trikovi

Možete koristiti `yes` sa nizom cifara koje generiše komanda `seq` da biste kontrolisali petlju ponovljenih radnji.

Ovaj jednolinijski kod ispisuje generisane cifre u terminal, a zatim poziva stanje mirovanja (pauzu) od jedne sekunde.

Umesto jednostavnog ponavljanja cifara u terminal, možete pozvati drugu komandu ili skriptu. Ta komanda ili skripta čak ne moraju ni da koriste cifre; one su tu samo da pokrenu svaki ciklus petlje.

yes "$(seq 1 20)" | while read digit; do echo digit; sleep 1; done

Ponekad je korisno imati veliku datoteku za testiranje. Možda želite da vežbate korišćenje komande `zip` ili želite da imate veliku datoteku za testiranje FTP otpremanja.

Možete brzo da generišete velike datoteke pomoću komande `yes`. Sve što treba da uradite je da joj date dugačak niz teksta i preusmerite izlaz u datoteku. Budite oprezni; te datoteke će brzo rasti. Budite spremni da pritisnete Ctrl+C u roku od nekoliko sekundi.

yes duga linija besmislenog teksta za popunjavanje fajla > test.txt
ls -lh test.txt
wc test.txt

Datoteci generisanoj na ovaj način je trebalo oko pet sekundi na test mašini koja je korišćena za pisanje ovog članka. Komanda `ls` je prijavila da je veličine 557 MB, a `wc` nam govori da ima 12,4 miliona redova.

Možemo ograničiti veličinu datoteke tako što ćemo uključiti `head` u naš niz komandi. Na taj način, specificiramo koliko redova treba uključiti u datoteku. `-50` znači da će `head` proslediti samo 50 redova u datoteku `test.txt`.

yes duga linija besmislenog teksta za popunjavanje fajla | head -50 > test.txt

Čim u datoteci `test.txt` bude 50 redova, proces će se zaustaviti. Ne morate koristiti Ctrl+C. Dolazi do zaustavljanja svojom voljom.

Komanda `wc` izveštava da se u datoteci nalazi tačno 50 redova, 400 reči i da je veličine 2350 bajtova.

Iako je i dalje korisna za automatsko unošenje odgovora u dugotrajne skripte (i nekoliko drugih trikova), komanda `yes` neće biti deo vašeg svakodnevnog skupa komandi. Ali kada vam zatreba, videćete da je sama jednostavnost – i sve to u šest redova izvornog koda.