Что эквивалентно Linux для приостановки DOS?

У меня есть оболочка Bash script, в которой я хотел бы приостановить выполнение до тех пор, пока пользователь не нажмет клавишу. В DOS это легко выполнить с помощью команды "пауза". Есть ли эквивалент Linux, который я могу использовать в моем script?

Ответ 1

read делает следующее:

[email protected]:~$ read -n1 -r -p "Press any key to continue..." key
[...]
[email protected]:~$ 

-n1 указывает, что он ожидает только одного символа. -r помещает его в необработанный режим, что необходимо, потому что иначе, если вы нажмете что-то вроде обратной косой черты, оно не регистрируется, пока вы не нажмете следующий ключ. -p указывает приглашение, которое должно быть указано, если оно содержит пробелы. Аргумент key необходим только в том случае, если вы хотите узнать, какой ключ он нажал, и в этом случае вы можете получить к нему доступ через $key.

Если вы используете Bash, вы также можете указать тайм-аут с -t, который заставляет чтение возвращать сбой, если ключ не нажат. Так, например:

read -t5 -n1 -r -p 'Press any key in the next five seconds...' key
if [ "$?" -eq "0" ]; then
    echo 'A key was pressed.'
else
    echo 'No key was pressed.'
fi

Ответ 2

Я использую эти способы, которые очень короткие, и они похожи на @theunamedguy и @Jim решения, но с тайм-аутом и тихим режимом.

Мне особенно нравится последний случай и использовать его во множестве скриптов, которые запускаются в цикле, пока пользователь не нажмет Enter.

Команда

  • Введите решение

    read -rsp $'Press enter to continue...\n'
    
  • Решение Escape (с -d $'\ e')

    read -rsp $'Press escape to continue...\n' -d $'\e'
    
  • Любое ключевое решение (с -n 1)

    read -rsp $'Press any key to continue...\n' -n 1 key
    # echo $key
    
  • Вопрос с предварительно выбранным выбором (с -ei $'Y')

    read -rp $'Are you sure (Y/n) : ' -ei $'Y' key;
    # echo $key
    
  • Решение тайм-аута (с -t 5)

    read -rsp $'Press any key or wait 5 seconds to continue...\n' -n 1 -t 5;
    
  • Спящий расширенный псевдоним

    read -rst 0.5; timeout=$?
    # echo $timeout
    

Объяснение

-r указывает режим raw, который не позволяет использовать комбинированные символы типа "\" или "^".

-s указывает режим молчания и потому, что нам не нужен вывод на клавиатуре.

-p $'prompt' указывает приглашение, которое должно быть между $'и', чтобы пропускать пробелы и экранированные символы. Будьте осторожны, вы должны поставить между одинарными кавычками символ доллара, чтобы воспользоваться экранированными символами, иначе вы можете использовать простые кавычки.

-d $'\ e' указывает escappe как разделитель charater, так как последний символ для текущей записи, это можно поместить любого символа, но будьте осторожны, чтобы поместить символ, который пользователь может тип.

-n 1 указывает, что ему нужен только один символ.

-e указывает режим чтения.

-i $'Y' указывает Y как исходный текст в режиме чтения.

-t 5 указывает время ожидания 5 секунд

ключ служит, если вам нужно знать ввод, в случае -n1, нажав клавишу.

$?, чтобы узнать код выхода последней программы, для чтения, 142 в случае таймаута, 0 правильный ввод. Положить $? в переменной как можно скорее, если вам нужно проверить ее после команд somes, потому что все команды будут переписывать $?

Ответ 3

read без каких-либо параметров будет продолжаться, только если вы нажмете enter. Команда DOS pause будет продолжена, если вы нажмете любую клавишу. Используйте read –n1, если вы хотите этого поведения.

Ответ 4

read -n1 не переносится. Портативный способ сделать то же самое может быть:

(   trap "stty $(stty -g;stty -icanon)" EXIT
    LC_ALL=C dd bs=1 count=1 >/dev/null 2>&1
)   </dev/tty

Кроме использования read, просто нажмите ENTER, чтобы продолжить запрос:

sed -n q </dev/tty

Ответ 5

Это работало для меня во многих вариантах Linux, где некоторые из этих других решений не были (в том числе и самые популярные). Я думаю, что это более читаемо тоже...

echo Press enter to continue; read dummy;

Обратите внимание, что переменная должна быть представлена ​​как аргумент read.

Ответ 6

Если вам просто нужно приостановить цикл или script, и вы счастливы нажать Enter вместо любой клавиши, тогда read самостоятельно выполнит задание.

Ответ 7

Попробуйте следующее:

function pause(){
   read -p "$*"
}