Hur man använder ja-kommandot på Linux

By rik

Kommandot ”ja” kan vid första anblicken verka onödigt enkelt, men i den här genomgången ska vi utforska dess användningsområden och visa hur du kan utnyttja dess förmåga till upprepning i Linux och macOS.

Kommandot ja

Kommandot ”yes” är ett av de mest grundläggande kommandona som finns i Linux och andra Unix-baserade system, såsom macOS. När vi säger ”grundläggande” menar vi att det är enkelt både att använda och att förstå dess ursprungliga konstruktion. Källkoden för den första versionen, som släpptes i System 7 Unix och skapades av Ken Thompson, består av enbart sex rader kod.

Men låt dig inte luras av dess enkelhet. Detta lilla kommando kan användas på flera överraskande praktiska sätt.

Vad gör ”ja”?

Om du kör kommandot ”yes” utan några argument, kommer det att agera som om du skrev ”y” och tryckte på Enter, om och om igen. Och det gör det väldigt fort. Det kommer att fortsätta med det tills du avbryter processen med Ctrl+C.

yes

I själva verket kan du få ”yes” att kontinuerligt generera vilken textsträng du vill. Du behöver bara skriva ”yes”, ett mellanslag och sedan den textsträng du önskar, och trycka på Enter. Detta används ofta för att låta ”yes” skapa en ström av ”ja” eller ”nej”-strängar.

yes ja

yes vilken text som helst

Men vad är poängen?

Resultatet från ”yes” kan skickas vidare till andra program eller skript.

Känner du igen detta? Du startar en tidskrävande process och går ifrån datorn. När du kommer tillbaka har processen inte avslutats. Under din frånvaro har processen ställt en fråga och väntar på att du ska svara ”ja” eller ”nej”.

Om du i förväg vet att alla dina svar kommer att vara positiva (”ja” eller ”y”) eller negativa (”nej” eller ”n”), kan du använda ”yes” för att mata in dessa svar automatiskt. Din långa process kan då köras klart utan att du behöver övervaka den, eftersom ”yes” svarar på alla frågor.

Använda ”ja” med skript

Titta på följande Bash-skal skript. (Vi antar att detta är en del av ett mycket större skript som kommer att ta lång tid att köra.)

#!/bin/bash

# ...
# mitt i ett långt skript
# får ett svar från användaren
# ...

echo "Vill du fortsätta? [j,n]"
read input

# fick vi ett värde från användaren?
if [ "$input" == "" ]; then

   echo "Användaren skrev inget"

# var det ett j eller ja?
elif [[ "$input" == "j" ]] || [[ "$input" == "ja" ]]; then

   echo "Positivt svar: $input"

# tolka allt annat som ett negativt svar
else

   echo "Negativt svar: $input"

fi

Det här skriptet ställer en fråga och väntar på ett svar. Skriptets fortsättning beror på användarens inmatning.

Ett ”ja” eller ”j” indikerar ett positivt svar.
All annan inmatning betraktas som ett negativt svar.
Om du trycker på Enter utan att ange någon text händer ingenting.

För att testa detta, kopiera skriptet till en fil, och spara det som long_script.sh. Använd chmod för att göra den körbar.

chmod +x long_script.sh

Kör skriptet med följande kommando. Prova att skriva in ”ja”, ”j” och allt annat, inklusive att trycka på Enter utan text.

./long_script.sh

För att få ”yes” att ge svaret på skriptets fråga, skickar vi utdata från ”yes” till skriptet.

yes | ./long_script.sh

Vissa skript är mer strikta i sina krav och accepterar bara hela ordet ”ja” som ett positivt svar. Du kan ange ”ja” som en parameter till ”yes” på följande sätt:

yes ja | ./long_script.sh

Tänk efter innan du säger ja

Du måste vara säker på att den input du matar in i skriptet eller programmet definitivt kommer att ge dig det resultat du förväntar dig. För att kunna fatta det beslutet måste du förstå vilka frågor som kommer att ställas och vilka svar som ska ges.

Logiken i skriptet, kommandot eller programmet kanske inte stämmer överens med dina förväntningar. I vårt exempel-skript kan frågan ha varit ”Vill du sluta? [j,n]”. Om så hade varit fallet, skulle ett negativt svar ha gjort det möjligt för skriptet att fortsätta.

Du behöver bekanta dig med skriptet, kommandot eller programmet innan du använder ”yes”.

Använda ”ja” med kommandon

Förr användes ”yes” ofta tillsammans med andra Linux-kommandon. Numera har de flesta av dessa kommandon utvecklat sina egna sätt att köras utan interaktion. ”yes” är inte längre nödvändigt för att uppnå detta.

Låt oss ta Ubuntus pakethanterare ”apt-get” som ett exempel. För att installera en applikation utan att behöva trycka på ”y” mitt i installationen, kunde man använda ”yes” på följande sätt:

yes | sudo apt-get install fortune-mod

Samma sak kan uppnås med alternativet -y (anta ja) i apt-get:

sudo apt-get -y install fortune-mod

Du ser att ”apt-get” inte ens ställde sin vanliga fråga ”Vill du fortsätta? [Y/n]”. Den antog helt enkelt att svaret skulle vara ”ja”.

På andra Linux-distributioner är det samma situation. På Fedora brukade man använda pakethanterarkommandot på detta vis:

yes | yum install fortune-mod

Nu har ”dnf”-pakethanteraren ersatt ”yum”, och ”dnf” har sitt eget alternativ -y (anta ja).

dnf -y install fortune-mod

Detsamma gäller ”cp”, ”fsck” och ”rm”. Dessa kommandon har alla sina egna alternativ -f (force) eller -y (anta ja).

Så, verkar det som att ”yes” bara är användbart för att arbeta med skript? Inte riktigt. Det finns några fler tricks kvar i den gamla hunden.

Några fler ”ja”-tricks

Du kan använda ”yes” med en serie nummer som genereras av ”seq” för att styra en loop av upprepade åtgärder.

Denna enradskod skriver ut de genererade siffrorna till terminalen och pausar sedan i en sekund.

Istället för att bara skriva ut siffrorna kan du anropa ett annat kommando eller skript. Detta kommando eller skript behöver inte ens använda siffrorna; de är bara där för att starta varje cykel i loopen.

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

Ibland kan det vara bra att ha en stor fil att testa med. Du kanske vill öva på att använda ”zip”-kommandot, eller så behöver du en stor fil för att testa FTP-uppladdningar med.

Du kan snabbt skapa stora filer med ”yes”. Allt du behöver göra är att ge det en lång textsträng att arbeta med och omdirigera utdata till en fil. Men var försiktig, dessa filer växer fort. Var beredd att trycka på Ctrl+C inom några sekunder.

yes lång rad med meningslös text för filutfyllnad > test.txt
ls -lh test.txt
wc test.txt

Filen som skapades här tog ungefär fem sekunder på testmaskinen som användes för den här artikeln. ”ls” rapporterar att den är 557 MB stor, och ”wc” berättar att det finns 12,4 miljoner rader i den.

Vi kan begränsa filens storlek genom att inkludera ”head” i vår kommandorad. Vi anger hur många rader som ska inkluderas i filen. ”-50” betyder att ”head” bara släpper igenom 50 rader till ”test.txt”-filen.

yes lång rad med meningslös text för filutfyllnad | head -50 > test.txt

Så snart det finns 50 rader i ”test.txt”-filen kommer processen att stoppas. Du behöver inte trycka på Ctrl+C. Den stannar fint av sig själv.

”wc” rapporterar att det finns exakt 50 rader i filen, 400 ord och att den är 2350 byte stor.

Även om det fortfarande är användbart för att mata in svar i långa skript (och några andra tricks), kommer kommandot ”yes” antagligen inte att vara en del av din dagliga verktygslåda. Men när du behöver det kommer du att upptäcka att det är genialt i sin enkelhet – och allt i sex rader med vacker kod.