Hur man använder ja-kommandot på Linux

Ja-kommandot verkar för enkelt för att vara till någon praktisk användning, men i den här handledningen visar vi dig dess tillämpning och hur du kan dra nytta av dess uppdämda positivitet i Linux och macOS.

Ja-kommandot

Kommandot yes är ett av de enklaste kommandona i Linux och andra Unix-liknande operativsystem som macOS. Och med enkelt menar vi enkel i dess användning och dess initiala implementering. Källkoden för originalversionen – släppt i System 7 Unix och författad av Ken Thompson— uppgår till bara sex rader kod.

Men skriv inte av det för att det är ett enkelt litet kommando. Det kan användas på några intressanta och användbara sätt.

Vad gör ja?

Används utan några kommandoradsparametrar, fungerar yes-kommandot som om du skriver ”y” och trycker på Enter, om och om igen (och om och om igen) igen. Väldigt snabbt. Och det kommer att fortsätta att göra det tills du trycker på Ctrl+C för att avbryta det.

yes

Faktum är att ja kan användas för att upprepade gånger generera vilket meddelande du väljer. Skriv bara ja, ett mellanslag, strängen du vill använda och tryck sedan på Enter. Detta används ofta för att få ja att generera en utström av ”ja” eller ”nej”-strängar.

yes yes

yes anything you like

Men vad tjänar det till?

Utdata från yes kan överföras till andra program eller skript.

Låter detta bekant? Du startar en lång process igång och går iväg och låter den köras. När du återvänder till din dator har processen inte slutförts alls. I din frånvaro har den ställt en fråga till dig och väntar på ett ”ja” eller ”nej” svar.

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 ja för att ge dig dessa svar. Din långa process kommer sedan att slutföras utan uppsikt och ja ger svar på alla frågor som processen ställer.

Använder ja med skript

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

#!/bin/bash

# ...
# in the middle of some long script
# obtain a response from the user
# ...

echo "Are you happy to proceed? [y,n]"
read input

# did we get an input value?
if [ "$input" == "" ]; then

   echo "Nothing was entered by the user"

# was it a y or a yes?
elif [[ "$input" == "y" ]] || [[ "$input" == "yes" ]]; then

   echo "Positive response: $input"

# treat anything else as a negative response
else

   echo "negative response: $input"

fi

Det här skriptet ställer en fråga och väntar på ett svar. Det logiska flödet i skriptet bestäms av indata från användaren.

Ett ”ja” eller ”y” indikerar ett positivt svar.
All annan inmatning anses vara ett negativt svar.
Att trycka på Enter utan inmatningstext gör 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 det körbart.

chmod +x long_script.sh

Kör skriptet med följande kommando. Prova att ange ”ja”, ”y” och allt annat som inmatning, inklusive att trycka på Retur utan inmatningstext.

./long_script.sh

För att få ja att ge vårt svar på skriptets fråga, skicka utdata från ja till skriptet.

yes | ./long_script.sh

Vissa skript är mer stela i sina krav och accepterar bara hela ordet ”ja” som ett positivt svar. Du kan ange ”ja” som en parameter till ja, enligt följande:

yes yes | ./long_script.sh

Säg inte ja utan att tänka igenom det

Du måste vara säker på att den input du kommer att mata in i manuset eller programmet definitivt kommer att ge dig det resultat du förväntar dig. För att kunna fatta det beslutet måste du känna till frågorna och vad dina svar bör vara.

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

Du måste vara bekant med skriptet, kommandot eller programmet innan du glatt släpper in ja i det.

Använder ja med kommandon

I sin linda skulle ja användas med andra Linux-kommandon. Sedan dess har de flesta av de andra Linux-kommandona sitt eget sätt att köras utan mänsklig interaktion. ja krävs inte längre för att uppnå det.

Låt oss ta Ubuntu-pakethanteraren apt-get som ett exempel. För att installera en applikation utan att behöva trycka på ”y” halvvägs genom installationen, skulle ja ha använts enligt följande:

yes | sudo apt-get install fortune-mod

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

sudo apt-get -y install fortune-mod

Du kommer att se att apt-get inte ens frågade sitt vanliga ”Vill du fortsätta? [Y/n]” fråga. Det antog bara att svaret skulle vara ”ja”.

På andra Linux-distributioner är situationen densamma. På Fedora skulle du ha använt den här typen av pakethanterarkommando på en gång:

yes | yum install fortune-mod

dnf-pakethanteraren har ersatt yum och dnf har sitt eget -y (antar ja)-alternativ.

dnf -y install fortune-mod

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

Så verkar det som att yes har hänvisats till att bara arbeta med manus? Inte riktigt. Det finns några fler knep i den gamla hunden ännu.

Några ytterligare ja-tricks

Du kan använda ja med en sekvens av siffror som genereras av seq för att styra en slinga av upprepade åtgärder.

Denna one-liner ekar de genererade siffrorna till terminalfönstret och anropar sedan viloläge i en sekund.

Istället för att bara eka siffrorna till terminalfönstret kan du anropa ett annat kommando eller skript. Det kommandot eller skriptet behöver inte ens använda siffrorna, och de är bara där för att kickstarta varje cykel i slingan.

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

Ibland är det bra att ha en stor fil att testa med. Kanske vill du öva på att använda zip-kommandot, eller så vill du ha en stor fil att testa FTP-uppladdningar med.

Du kan snabbt skapa stora filer med yes. Allt du behöver göra är att ge den en lång textsträng att arbeta med och omdirigera utdata till en fil. Gör inga misstag; dessa filer kommer att växa snabbt. Var redo att trycka på Ctrl+C inom några sekunder.

yes long line of meaningless text for file padding > test.txt
ls -lh test.txt
wc test.txt

Filen som genererades här tog ungefär fem sekunder på testmaskinen som användes för att undersöka den här artikeln. ls rapporterar att den är 557 Mb stor, och vi berättar att det finns 12,4 miljoner linjer i den.

Vi kan begränsa storleken på filen genom att inkludera head i vår kommandosträng. Vi berättar hur många rader som ska inkluderas i filen. -50 betyder att huvudet bara släpper igenom 50 rader till test.txt-filen.

yes long line of meaningless text for file padding | head -50 > test.txt

Så snart det finns 50 rader i test.txt-filen kommer processen att stoppas. Du behöver inte använda Ctrl+C. Det kommer till ett graciöst stopp av egen vilja.

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 knep), kommer ja-kommandot inte att vara en del av din dagliga verktygslåda med kommandon. Men när du behöver det kommer du att upptäcka att det är enkelheten i sig – och allt i sex rader med gyllene kod.