Jak korzystać z polecenia yes w systemie Linux

Polecenie tak wydaje się zbyt proste, aby miało jakiekolwiek praktyczne zastosowanie, ale w tym samouczku pokażemy Ci jego zastosowanie i jak skorzystać z jego stłumionej pozytywności w systemie Linux i macOS.

Polecenie tak

Polecenie tak jest jednym z najprostszych poleceń w systemie Linux i innych systemach operacyjnych typu Unix, takich jak macOS. Mówiąc prostym, rozumiemy prostotę w obsłudze i początkowej implementacji. Kod źródłowy oryginalnej wersji – wydany w System 7 Unix i autorstwa Ken Thompson—Wynosi zaledwie sześć linii kodu.

Ale nie zapisuj tego, ponieważ jest to proste, małe polecenie. Można go używać na kilka interesujących i przydatnych sposobów.

Co robi tak?

Użyte bez żadnych parametrów wiersza poleceń, polecenie tak zachowuje się tak, jakbyś pisał „y” i wciskał Enter, w kółko (i w kółko). Bardzo szybko. I będzie to robić, dopóki nie naciśniesz Ctrl + C, aby go przerwać.

yes

wyjście z tak w oknie terminala

W rzeczywistości tak można użyć do wielokrotnego generowania dowolnej wybranej wiadomości. Po prostu wpisz tak, spację, ciąg, którego chcesz użyć, a następnie naciśnij Enter. Jest to często używane, aby spowodować, że tak, aby wygenerować strumień wyjściowy ciągów „tak” lub „nie”.

yes yes

wyjście z tak tak w oknie terminala

yes anything you like

wyjście z tak z linią tekstu w oknie terminala

Ale po co to?

Dane wyjściowe z tak można przesłać potokiem do innych programów lub skryptów.

Czy to brzmi znajomo? Rozpoczynasz długi proces i odsuwasz się, pozostawiając go uruchomionym. Po powrocie do komputera proces w ogóle się nie zakończył. Podczas twojej nieobecności zadał ci pytanie i czekał na odpowiedź „tak” lub „nie”.

Jeśli wiesz z góry, że wszystkie Twoje odpowiedzi będą pozytywne („tak” lub „y”) lub negatywne („nie” lub „n”), możesz użyć tak, aby udzielić tych odpowiedzi za siebie. Twój długi proces będzie następnie przebiegał bez nadzoru, z odpowiedzią twierdzącą na wszelkie pytania zadawane w procesie.

Używanie tak ze skryptami

Spójrz na następujący skrypt powłoki Bash. (Musimy sobie wyobrazić, że jest to część znacznie większego skryptu, którego uruchomienie zajmie dużo czasu).

#!/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

Ten skrypt zadaje pytanie i oczekuje na odpowiedź. O przepływie logiki w skrypcie decyduje dane wejściowe od użytkownika.

„Tak” lub „y” oznacza pozytywną odpowiedź.
Każde inne wejście jest uważane za odpowiedź negatywną.
Naciśnięcie klawisza Enter bez wprowadzania tekstu nic nie robi.

Aby to przetestować, skopiuj skrypt do pliku i zapisz go jako long_script.sh. Użyj chmod, aby uczynić go wykonywalnym.

chmod +x long_script.sh

Uruchom skrypt za pomocą następującego polecenia. Spróbuj podać „tak”, „y” i cokolwiek innego jako dane wejściowe, w tym naciśnięcie klawisza Enter bez wprowadzania tekstu.

./long_script.sh

wyjście z long_script.sh w oknie terminala

Aby uzyskać odpowiedź twierdzącą i odpowiedzieć na pytanie skryptu, potokuj wyjście od tak do skryptu.

yes | ./long_script.sh

przesyłanie potoku do long_script.sh w oknie terminala

Niektóre skrypty są bardziej sztywne w swoich wymaganiach i akceptują tylko pełne słowo „tak” jako pozytywną odpowiedź. Możesz podać „tak” jako parametr na tak, jak poniżej:

yes yes | ./long_script.sh

rurociągi tak tak do long_script.sh w oknie terminala

Nie mów tak bez przemyślenia

Musisz mieć pewność, że dane wejściowe, które zamierzasz wprowadzić do skryptu lub programu, z pewnością przyniosą oczekiwany wynik. Aby móc podjąć taką decyzję, musisz znać pytania i jakie powinny być Twoje odpowiedzi.

Logika skryptu, polecenia lub programu może nie odpowiadać Twoim oczekiwaniom. W naszym przykładowym skrypcie pytanie mogłoby brzmieć „Czy chcesz przestać? [y,n]. ” Gdyby tak było, negatywna odpowiedź umożliwiłaby wykonanie scenariusza.

Musisz być zaznajomiony ze skryptem, poleceniem lub programem, zanim beztrosko włączysz do niego tak.

Używanie tak z poleceniami

W początkowej fazie tak był używany z innymi poleceniami Linuksa. Od tego czasu większość innych poleceń Linuksa działa na swój własny sposób bez interakcji z człowiekiem. tak, nie jest już konieczne, aby to osiągnąć.

Weźmy na przykład menedżera pakietów Ubuntu apt-get. Aby zainstalować aplikację bez konieczności naciskania klawisza „y” w połowie instalacji, polecenie tak zostałoby użyte w następujący sposób:

yes | sudo apt-get install fortune-mod

przesyłanie potoku do apt-get w oknie terminala

Ten sam wynik można osiągnąć za pomocą opcji -y (zakładaj, że tak) w apt-get:

sudo apt-get -y install fortune-mod

używając apt-get z opcją zakładaj tak w oknie terminala

Zobaczysz, że apt-get nawet nie zapytał, jak zwykle, „Czy chcesz kontynuować? [Y/n]”Pytanie. Po prostu założył, że odpowiedź brzmi „tak”.

W innych dystrybucjach Linuksa sytuacja jest taka sama. W Fedorze używałbyś kiedyś tego typu polecenia menedżera pakietów:

yes | yum install fortune-mod

Menedżer pakietów dnf zastąpił yum, a dnf ma własną opcję -y (zakładając, że tak).

dnf -y install fortune-mod

To samo dotyczy cp, fsck i rm. Każde z tych poleceń ma własne opcje -f (wymuś) lub -y (zakładaj, że tak).

Czy wydaje się więc, że tak został zdegradowany do pracy tylko ze skryptami? Nie do końca. W starym psie jest jeszcze kilka sztuczek.

Kilka dalszych sztuczek tak

Możesz użyć yes z sekwencją cyfr generowaną przez seq, aby kontrolować pętlę powtarzających się działań.

Ten jednowierszowy odbija wygenerowane cyfry w oknie terminala, a następnie wywołuje stan uśpienia na jedną sekundę.

Zamiast po prostu powtarzać cyfry w oknie terminala, możesz wywołać inne polecenie lub skrypt. To polecenie lub skrypt nie musi nawet używać cyfr, a są one dostępne tylko po to, aby rozpocząć każdy cykl pętli.

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

tak jednowarstwowy regulujący pętlę w oknie terminala

Czasami warto mieć duży plik do przetestowania. Być może chcesz poćwiczyć używanie polecenia zip lub chcesz mieć spory plik do testowania przesyłania FTP.

Dzięki tak możesz szybko generować duże pliki. Wszystko, co musisz zrobić, to podać długi ciąg tekstu do pracy i przekierować dane wyjściowe do pliku. Niepopełnić błędu; te pliki będą szybko rosnąć. Przygotuj się na naciśnięcie Ctrl + C w ciągu kilku sekund.

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

generowanie plików testowych z oknem tak ia terminala

Plik wygenerowany tutaj zajął około pięciu sekund na maszynie testowej używanej do badania tego artykułu. ls donosi, że ma rozmiar 557 Mb, a wc podaje nam, że jest w nim 12,4 miliona linii.

Możemy ograniczyć rozmiar pliku, dołączając nagłówek do naszego ciągu poleceń. Podajemy, ile wierszy ma zawierać plik. Wartość -50 oznacza, że ​​head przepuści tylko 50 linii do pliku test.txt.

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

użycie head do ograniczenia rozmiaru pliku m.in. w oknie terminala

Gdy tylko plik test.txt będzie zawierał 50 wierszy, proces zostanie zatrzymany. Nie musisz używać Ctrl + C. Zatrzymuje się wdzięcznie z własnej woli.

wc informuje, że plik zawiera dokładnie 50 wierszy, 400 słów i ma rozmiar 2350 bajtów.

Mimo że jest nadal przydatne do dostarczania odpowiedzi do długo działających skryptów (i kilku innych sztuczek), polecenie tak nie będzie częścią codziennego zestawu narzędzi poleceń. Ale kiedy będziesz tego potrzebować, przekonasz się, że jest to prostota sama w sobie – a wszystko to w sześciu linijkach złotego kodu.