O tym, jak wykonać interaktywny skrypt powłoki bez ręcznego wprowadzania parametrów.
Na co dzień często korzystam w pracy ze skryptów, które oferują interaktywny interfejs, a więc zadają pytania na które muszę wklepywać odpowiedzi z klawiatury. Sporo z tych skryptów odpalam dosyć często, a pytania po pewnym czasie zaczynają działać na nerwy… Przykładowo takie irytujące coś:
./delivery.sh Syrenka.h Witamy w programie Delivery. Czy na pewno chcesz dostarczyć zmiany w pliku Syrenka.h [y/n] y Czy zmiany zostały sprawdzone przez drugą osobę [y/n] y Czy uruchomiłeś testy jednostkowe dla modyfikowanego modułu [y/n] y ...Jesteś absolutnie pewien, że chcesz dostarczyć te zmiany...? [y/n] ...
Pomijając już rozterki moralne, o ileż wygodniej byłoby, gdyby dało się ten skrypt wywołać od razu z czterema yes yes yes yes, prawda?
Otóż dobra informacja – da się :)
Ostatnio odkryłem, że aby to zrobić, wystarczy wykorzystać tzw. Here strings, obsługiwane przez bash, tcsh i ksh. Użycie tej konstrukcji jest bardzo proste i jednolinijkowe. Żeby do naszego skryptu delivery.sh dostarczyć od razu odpowiedzi na wszystkie nurtujące go pytania, wystarczy napisać:
./delivery.sh Syrenka.h <<< $'y\ny\ny\ny'
w wyniku czego na ekranie dostaniemy:
Witamy w programie Delivery. Czy na pewno chcesz dostarczyć zmiany w pliku Syrenka.h [y/n]? Czy zmiany zostały sprawdzone przez drugą osobę [y/n]? Czy uruchomiłeś testy jednostkowe dla modyfikowanego modułu [y/n]? ...Jesteś absolutnie pewien, że chcesz dostarczyć te zmiany... [y/n]? Dostarczam Syrenka.h... Gotowe.
Co się tak właściwie stało…?
Ciąg ‘y\ny\ny\ny’ został rozwinięty do postaci y[ENTER] y[ENTER] y[ENTER] y[ENTER] i przekazany do skryptu jako standard input, a więc tak samo, jakbym wklepywał te parametry po kolei z klawiatury. Jest czad :)
Więcej informacji na:
A poniżej kod skryptu, gdybyś chciał się pobawić:
#!/bin/bash echo "Witamy w programie Delivery." echo "Czy na pewno chcesz dostarczyć zmiany w pliku $1 [y/n]?" read choice [ $choice != "y" ] && exit 1 echo "Czy zmiany zostały sprawdzone przez drugą osobę [y/n]?" read choice [ $choice != "y" ] && exit 1 echo "Czy uruchomiłeś testy jednostkowe dla modyfikowanego modułu [y/n]?" read choice [ $choice != "y" ] && exit 1 echo "...Jesteś absolutnie pewien, że chcesz dostarczyć te zmiany... [y/n]?" read choice [ $choice != "y" ] && exit 1 echo "Dostarczam $1..." echo "Gotowe."