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."

Related Posts: