Нажмите пространство для продолжения

Действительно ли файл устройств бессмыслен в этом контексте?

Да, я думаю так. Я не могу найти, что доказательство в документации Linux для этого, но гуглящий вокруг действительно указывало на меня на это в документации NetBSD о mount_tmpfs поддерживать мою мысль:

tmpfs параметр только существует для совместимости с другими командами монтирования и проигнорирован.

Так, я предполагаю, что не имеет значения, что Вы используете в качестве 'исходного устройства' в командах монтирования или fstab конфигурация, если это tmpfs ввести.

Эксперименты на моем поле Ubuntu 12.04 также поддерживают это с некоторым забавным поведением в других приложениях:

# mkdir tmpfs
# mount -t tmpfs Brendan tmpfs/

# cat /proc/mounts 
[...]
Brendan /home/gert/tmpfs tmpfs rw,relatime 0 0

# df -h
Filesystem                        Size  Used Avail Use% Mounted 
[...]
Brendan                            12G     0   12G   0% /home/gert/tmpfs
78
25.09.2019, 14:17
8 ответов

Вы можете использовать читать :

read -n1 -s -r -p $'Press space to continue...\n' key

if [ "$key" = ' ' ]; then
    # Space pressed, do something
    # echo [$key] is empty when SPACE is pressed # uncomment to trace
else
    # Anything else pressed, do whatever else.
    # echo [$key] not empty
fi

Заменить '' на пробел вверху на '' для клавиши Enter, $ '\ t' для клавиши Tab.

76
29.04.2021, 00:39

Вы можете создать для него функцию:

pause(){
 read -n1 -rsp $'Press any key to continue or Ctrl+C to exit...\n'
}

Затем вы можете использовать это везде в вашем скрипте:

pause
11
29.04.2021, 00:39
hold=' '
printf "Press 'SPACE' to continue or 'CTRL+C' to exit : "
tty_state=$(stty -g)
stty -icanon
until [ -z "${hold#$in}" ] ; do
    in=$(dd bs=1 count=1 </dev/tty 2>/dev/null)
done
stty "$tty_state"

Теперь выводится приглашение без завершающей строки новой строки, надежно обрабатывается CTRL + C , вызывается stty только столько раз, сколько необходимо, и восстанавливается управляющий tty точно в то состояние, в котором stty нашел его. Загляните в man stty для получения информации о том, как явно управлять эхом, управляющими символами и всем остальным.

Вы также можете сделать это:

printf "Press any key to continue or 'CTRL+C' to exit : "
(tty_state=$(stty -g)
stty -icanon
LC_ALL=C dd bs=1 count=1 >/dev/null 2>&1
stty "$tty_state"
) </dev/tty

Вы можете сделать это с помощью ENTER , без [ тестов ] и без stty например:

sed -n q </dev/tty
7
29.04.2021, 00:39

Метод, обсуждаемый в этом SO Q&A, вероятно, является лучшим кандидатом для альтернативы поведению pause , к которому вы привыкли в Windows при работе с файлами BAT.

$ read -rsp $'Press any key to continue...\n' -n1 key

Пример

Здесь я выполняю описанное выше, а затем просто нажимаю любую клавишу, в данном случае клавишу D .

$ read -rsp $'Press any key to continue...\n' -n1 key
Press any key to continue...
$ 

Ссылки

55
29.04.2021, 00:39

lazy one liner:

echo "Press any key to continue or Ctrl+C to cancel"
read && do_something.sh

недостаток в том, что вы теряете контроль, когда пользователь нажимает ctrl + c. В этом случае сценарий всегда будет завершаться с кодом 130.

2
20.08.2021, 12:51

Параметры IFS на пустую строку подавляют поведение чтения по умолчанию - обрезку пробелов.

try_this() {
  echo -n "Press SPACE to continue or Ctrl+C to exit ... "
  while true; do
    # Set IFS to empty string so that read doesn't trim
    # See http://mywiki.wooledge.org/BashFAQ/001#Trimming
    IFS= read -n1 -r key
    [[ $key == ' ' ]] && break
  done
  echo
  echo "Continuing ..."
}
try_this

ОБНОВЛЕНИЕ 2018-05-23: Мы можем упростить это, используя переменную REPLY, которая не подлежит разделению на слова:

try_this() {
  echo -n "Press SPACE to continue or Ctrl+C to exit ... "
  while true; do
    read -n1 -r
    [[ $REPLY == ' ' ]] && break
  done
  echo
  echo "Continuing ..."
}
try_this
3
20.08.2021, 12:51

Вот способ, который работает как в bash, так и в zshи обеспечивает ввод-вывод на терминал:

# Prompt for a keypress to continue. Customise prompt with $*
function pause {
  >/dev/tty printf '%s' "${*:-Press any key to continue... }"
  [[ $ZSH_VERSION ]] && read -krs  # Use -u0 to read from STDIN
  [[ $BASH_VERSION ]] && </dev/tty read -rsn1
  printf '\n'
}
export_function pause

Поместите это в свой .{ba,z}shrcдля Великой Справедливости!

6
20.08.2021, 12:51

Много замечательных ответов, использующих read -rn1, и это будет прекрасно работать, пока вы не нажмете клавишу со стрелкой, функциональную клавишу или любую другую клавишу, которая не имеет представления ASCII и не преобразуется терминалом в escape-последовательность из нескольких символов для читать. Когда это произойдет, во входном буфере будут ждать символы мусора, которые появятся в следующем read.

Не забудьте очистить буфер до и после...

    while read -r -t 0.001; do :; done # dump the buffer
    read -r -n1 -p "Press any key to continue..." # wait
    read -r -t 0.001 # dump the rest of any escape sequence

-t — это спецификация тайм-аута. 0,001 — это 1/1000 секунды. Недостаточно долго, чтобы заметить паузу, если данные недоступны, но времени ожидания достаточно, чтобы извлечь информацию из ожидающего буфера.

Цикл while очищает буфер ввода перед ожиданием нажатия клавиши. Этот цикл while не позволяет пользователю нажать 5 клавиш, чтобы обойти следующие 5 уведомлений «Нажмите любую клавишу для продолжения». Вместо этого пользователь должен дождаться появления уведомления, прежде чем нажатие клавиши продолжится.

Последнее чтение очищает все остальные ключи, ожидающие чтения. Эти клавиши будут остатком escape-последовательности, созданной одним нажатием клавиши.

Преобразование escape-последовательностей различной длины в описание фактического нажатия клавиши, безусловно, возможно, но существует стандарт, и вы можете протестировать фактическую последовательность.

    while read -r -t 0.001; do :; done # dump the buffer
    read -r -n1 -p "Press any key to continue..." # wait
    read -r -t 0.001 zRest # read the entire escape sequence
    RESULT+="$zRest" # create the actual keypress

Это добавляет оставшийся буфер к результату read, нажатие клавиши которого может создать многосимвольную escape-последовательность -. Он будет работать хорошо, пока кто-то не нажмет несколько клавиш одновременно.Но если это произойдет, вероятно, лучше все равно отклонить беспорядок как неизвестное нажатие клавиши.

1
01.09.2021, 23:54

Теги

Похожие вопросы