Pobieranie danych z dialoga

Dialog jest świetnym narzędziem, pomagającym tworzyć pseudograficzne elementy skryptów Basha. O ile samo utworzenie okna dialogowego jest dosyć proste, to pobranie wprowadzonych przez użytkownika danych nie jest już takie oczywiste.

Najważniejsze jest to, że dialog przekazuje owe dane na wyjście błędu, więc odczytanie ich nie jest takie trudne. Nie widzimy go bezpośrednio, zanim nie zakończymy naszego skryptu, można jednak przekierować wyjście błędu do pliku.

WYBRANEMENU="/tmp/$0-$USER"
echo "NIC" > $WYBRANEMENU

dialog --title "Okno menu" \
       --backtitle "Teleturniej." \
       --menu "Wybierz jedno z trzech:" \
       15 50 3 \
       1 "Bramka nr 1" \
       2 "Bramka nr 2" \
       3 "Bramka nr 3" \
       2>"${WYBRANEMENU}"

Co osiągamy? Najpierw przygotowyjemy wspomniany plik. Należy zadbać o to, by jego nazwa była unikalna. Jeżeli kilku użytkowników jednocześnie uruchomiłoby skrypt zapisujący dane do jakiegoś pliku, skutki byłyby zupełnie nieprzewidywalne. Przekierowanie „NIC” do pliku ma dwie zalety: po pierwsze nadpisze go, co by tam wcześniej nie było, a po drugie będziemy mieli jakąś wartość domyślną.

Dialog oczekuje od nas kilku paratetrów:

    • –title: tytuł dialogowego okna,
    • –backtitle: napis pojawiający się w górnym lewym rogu terminala,
    • –menu: rodzaj dialogowego okna i tekst w jego środku,
    • 15 50 3: wymiary okna,
    • 1, 2, 3: nazwy możliwych wyborów, do których będziemy odwoływać się później w naszym skrypcie,
    • „Bramka nr 1”: tekst dla użytkownika programu, żeby wiedział co wybiera,

2>”${WYBRANEMENU}”: standardowe wyjście błędu zostaje zapisane w pliku /tmp/$0-$USER, przy czym $0 zostanie w nazwie pliku zastąpione nazwą pliku skryptu, $USER zaś nazwą uruchamiającego go użytkownika.

Pozostaje tylko odczytać zawartość pliku /tmp/plik-użytkownik. Wystarczy zwykły case:

clear
case $(<"${WYBRANEMENU}") in
  1) echo "ZONK! 1";;
  2) echo "ZONK! 2";;
  3) echo "Wygrałeś 50 złotych!!";;
  "") echo "Anuluj? Poważnie? :(" ;;
esac

Poza starożytną magią, związaną ze sposobem, w jaki Bash potrafi odczytywać zawartość pliku kryjącego się pod zmienną, nie ma tu niczego nadzwyczajnego. Najpierw czyścimy ekran, pozbywając się okna dialogowego. Potem decydujemy co zrobić. Z pliku tymczasowego zostanie odczytana wartość podana w oknie dialogowym: 1, 2, lub 3. Moglibyśmy zamiast liczb wpisać co się nam podoba, ale będzie to widoczne dla użytkownika, więc „kupa”, czy „foo” niestety odpadają. Jeżeli użytkownik wybierze Anuluj, do pliku tymczasowego zostanie przekierowane kompletnie nic i trzeba wziąć to pod uwagę w naszym case.

Na koniec pozostało nam jeszcze usunięcie pliku tymczasowego, przy czym ewentualne błędy nie są dla nas najważniejsze.

rm -f $WYBRANEMENU &> /dev/null

Oczywiście zamiast wypisywania tekstu do terminala możemy uruchamiać nowe okna dialogowe, uruchomić system ponownie, lub zmieniać domyślną Javę. Miłej zabawy.