Jak zatrzymać skrypt bash, dopóki użytkownik nie naciśnie Space?
Chciałbym mieć pytanie w swoim skrypcie
Naciśnij spację, aby kontynuować lub CTRL+, Caby wyjść
a następnie skrypt powinien się zatrzymać i poczekać, aż zostanie naciśnięty klawisz Space.
bash
control-flow
rubo77
źródło
źródło
Odpowiedzi:
Możesz użyć
read
:źródło
read -n1 -rsp $'Press any key to continue or Ctrl+C to exit...\n'
else
Blok zawsze działa, nawet po naciśnięciu spacji.bash
. Działa, jeśli używaszread _
zamiast tego, jeśli masz inną powłokę niżbash
.''
środku powinna znajdować się spacja?''
na pusty ciąg. Brak miejsca w środku. Sądzę, że pasuje również, jeśli wpiszesz ENTER lub TABMetoda omówiona w tym SO Q&A jest prawdopodobnie najlepszym kandydatem na alternatywę dla
pause
zachowania, do którego przyzwyczajasz się w systemie Windows podczas wykonywania plików BAT.Przykład
Tutaj uruchamiam powyższe, a następnie po prostu naciskam dowolny klawisz, w tym przypadku Dklawisz.
Bibliografia
źródło
$
przed ciąg tutaj tutaj-rsp $'Press
:?echo -e "..."
linii. W takich sytuacjach jest znacznie bardziej kompaktowy.To teraz drukuje wiersz bez spływu nowej linii, uchwyty
CTRL+C
niezawodnie wywołujestty
tylko tak często, jak to konieczne, i przywraca tty kontrolnego dokładnie do stanu, w którymstty
znalazł. Poszukajman stty
informacji o tym, jak jawnie kontrolować echa, kontrolować znaki i wszystko.Możesz także to zrobić:
Możesz to zrobić
ENTER
bez[
testów]
i bezstty
:źródło
Możesz stworzyć dla niego funkcję:
Następnie możesz użyć tego wszędzie w skrypcie:
źródło
leniwy jeden wkładka:
wadą jest utrata kontroli, gdy użytkownik naciśnie ctrl + c. W takim przypadku skrypt zawsze kończy działanie z kodem 130.
źródło
Ustawienia
IFS
pustego ciągu pomijają domyślne zachowanie przycinania białych znaków podczas odczytu.AKTUALIZACJA 23.05.2018: Możemy to uprościć, używając zmiennej REPLY, która nie podlega podziałowi słów:
źródło
Oto sposób, który działa w obie
bash
izsh
oraz zapewnia I / O terminala:Włóż to do swojej
.{ba,z}shrc
Wielkiej Sprawiedliwości!źródło