Il comando yes sembra troppo semplice per essere di qualsiasi utilità pratica, ma in questo tutorial ti mostreremo la sua applicazione e come trarre vantaggio dalla sua positività repressa in Linux e macOS.
Sommario:
Il comando sì
Il comando yes è uno dei comandi più semplici in Linux e altri sistemi operativi simili a Unix come macOS. E per semplice intendiamo semplice nel suo utilizzo e nella sua implementazione iniziale. Il codice sorgente della versione originale — rilasciato in System 7 Unix e creato da Ken Thompson—Ammonta a un mero sei righe di codice.
Ma non cancellarlo per essere un semplice piccolo comando. Può essere utilizzato in alcuni modi interessanti e utili.
Cosa fa sì?
Usato senza alcun parametro della riga di comando, il comando yes si comporta come se stessi digitando “y” e premendo Invio, ancora e ancora (e ancora e ancora). Molto velocemente. E continuerà a farlo finché non premi Ctrl + C per interromperlo.
yes
In effetti, sì può essere utilizzato per generare ripetutamente qualsiasi messaggio tu scelga. Digita semplicemente sì, uno spazio, la stringa che desideri utilizzare, quindi premi Invio. Questo è spesso usato per far sì che si generi un flusso di output di stringhe “sì” o “no”.
yes yes
yes anything you like
Ma a cosa serve?
L’output di yes può essere reindirizzato in altri programmi o script.
Questo suona familiare? Inizi un lungo processo in esecuzione e ti allontani, lasciandolo correre. Quando torni al tuo computer, il processo non è stato affatto completato. In tua assenza, ti ha posto una domanda ed è seduto in attesa di una risposta “sì” o “no”.
Se sai in anticipo che tutte le tue risposte saranno positive (“sì” o “y”) o negative (“no” o “n”) puoi usare sì per fornire quelle risposte per te. Il tuo lungo processo verrà quindi eseguito fino al completamento incustodito con sì che fornirà le risposte a tutte le domande che il processo pone.
Utilizzo di sì con gli script
Guarda il seguente script della shell Bash. (Dobbiamo immaginare che questa sia una parte di uno script molto più grande che richiederà molto tempo per essere eseguito.)
#!/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
Questo script pone una domanda e attende una risposta. Il flusso logico all’interno dello script viene deciso dall’input dell’utente.
Un “sì” o “y” indica una risposta positiva.
Qualsiasi altro input è considerato una risposta negativa.
Premendo Invio senza testo di input non ha effetto.
Per verificarlo, copia lo script in un file e salvalo come long_script.sh. Usa chmod per renderlo eseguibile.
chmod +x long_script.sh
Esegui lo script con il seguente comando. Prova a fornire “sì”, “y” e qualsiasi altra cosa come input, inclusa la pressione di Invio senza testo di input.
./long_script.sh
Per ottenere sì per fornire la nostra risposta alla domanda dello script, reindirizza l’output da sì allo script.
yes | ./long_script.sh
Alcuni script sono più rigidi nei loro requisiti e accettano solo la parola completa “sì” come risposta positiva. È possibile fornire “sì” come parametro a sì, come segue:
yes yes | ./long_script.sh
Non dire di sì senza pensarci bene
Devi essere certo che l’input che fornirai allo script o al programma ti darà sicuramente il risultato che ti aspetti. Per poter prendere quella decisione, devi conoscere le domande e quali dovrebbero essere le tue risposte.
La logica nello script, nel comando o nel programma potrebbe non corrispondere alle tue aspettative. Nel nostro script di esempio, la domanda potrebbe essere stata “Vuoi smettere? [y,n]. ” Se fosse stato così, una risposta negativa avrebbe consentito allo script di procedere.
È necessario avere familiarità con lo script, il comando o il programma prima di inserire allegramente sì in esso.
Utilizzo di sì con i comandi
Nella sua infanzia, sì sarebbe stato utilizzato con altri comandi Linux. Da allora, la maggior parte di questi altri comandi Linux ha il proprio modo di funzionare senza interazione umana. sì non è più necessario per raggiungere questo obiettivo.
Prendiamo il gestore di pacchetti di Ubuntu apt-get come esempio. Per installare un’applicazione senza dover premere “y” a metà dell’installazione, sì sarebbe stato utilizzato come segue:
yes | sudo apt-get install fortune-mod
Lo stesso risultato può essere ottenuto usando l’opzione -y (presumo sì) in apt-get:
sudo apt-get -y install fortune-mod
Vedrai che apt-get non ha nemmeno chiesto al solito “Vuoi continuare? [Y/n]”Domanda. Si presumeva che la risposta fosse “sì”.
Su altre distribuzioni Linux, la situazione è la stessa. Su Fedora avresti usato questo tipo di comando del gestore di pacchetti contemporaneamente:
yes | yum install fortune-mod
Il gestore di pacchetti dnf ha sostituito yum e dnf ha la sua opzione -y (presumo di sì).
dnf -y install fortune-mod
Lo stesso vale per cp, fsck e rm. Ciascuno di questi comandi ha le proprie opzioni -f (forza) o -y (si assume sì).
Quindi sembra che il sì sia stato relegato a lavorare solo con gli script? Non proprio. Ci sono ancora alcuni altri trucchi nel vecchio cane.
Alcuni ulteriori trucchi sì
È possibile utilizzare yes con una sequenza di cifre generate da seq per controllare un ciclo di azioni ripetute.
Questo one-liner fa eco alle cifre generate nella finestra del terminale e quindi chiama sleep per un secondo.
Invece di ripetere semplicemente le cifre nella finestra del terminale, puoi chiamare un altro comando o script. Quel comando o script non ha nemmeno bisogno di usare le cifre, e sono lì solo per avviare ogni ciclo del ciclo.
yes "$(seq 1 20)" | while read digit; do echo digit; sleep 1; done
A volte è utile avere un file di grandi dimensioni con cui testare. Forse vuoi esercitarti usando il comando zip, o vuoi avere un file di grandi dimensioni con cui testare i caricamenti FTP.
Puoi generare rapidamente file di grandi dimensioni con yes. Tutto quello che devi fare è dargli una lunga stringa di testo con cui lavorare e reindirizzare l’output in un file. Non fare errori; quei file cresceranno rapidamente. Preparati a premere Ctrl + C entro pochi secondi.
yes long line of meaningless text for file padding > test.txt
ls -lh test.txt
wc test.txt
Il file generato qui ha impiegato circa cinque secondi sulla macchina di prova utilizzata per la ricerca di questo articolo. Segnala che ha una dimensione di 557 Mb e ci dice che ci sono 12,4 milioni di righe.
Possiamo limitare la dimensione del file includendo head nella nostra stringa di comando. Gli diciamo quante righe includere nel file. Il -50 significa che head lascerà passare solo 50 righe al file test.txt.
yes long line of meaningless text for file padding | head -50 > test.txt
Non appena ci sono 50 righe nel file test.txt, il processo si interromperà. Non è necessario utilizzare Ctrl + C. Si arresta graziosamente di sua spontanea volontà.
wc segnala che ci sono esattamente 50 righe nel file, 400 parole e la dimensione è di 2350 byte.
Anche se è ancora utile per alimentare le risposte in script di lunga durata (e alcuni altri trucchi), il comando yes non farà parte del tuo toolkit quotidiano di comandi. Ma quando ne avrai bisogno, scoprirai che è la semplicità stessa, e tutto in sei righe di codice d’oro.