Что такое bash-эквивалент команды паузы в DOS?


13

Мне нужна пауза в сценарии оболочки, чтобы вывести предупреждение перед продолжением. Например, в DOS это выглядит так:

doit.bat:

[...]
echo 'Are you sure? Press Ctrl-C to abort, enter to continue.'
pause
[...]

Как я могу сделать это на Bash? На данный момент команда сна, кажется, делает свое дело и достаточно проста, но не совсем идея:

doit.sh

[...]
echo 'Are you sure? Press Ctrl-C to abort.'
sleep 3
[...]

Ответы:


10

что-то вроде

echo -n "prompt"  #'-n' means do not add \n to end of string
read              # No arg means dump next line of input

14
В Bash это можно сократить до read -p "prompt". Более подробную информацию о встроенных модулях оболочки можно получить с помощью helpкоманды, например help read.
Лекенштейн

@Lekensteyn - Это без конца новой строки, хотя.
Мэтт Х

@MattH Так же, как echo -nи printf. Если вы нажмете Enter, вы получите новую строку.
Лекенштейн

это не работает для Ubuntu 12.04 - чтение требует аргумент
ses

@ses При использовании 12.04.4 bashне требуется, чтобы read имела аргумент. Использование sh(которое часто вызывается bashв shсовместимом режиме) readтребует аргумента. Если вы начнете свой сценарий с, #!/bin/shвы увидите последнее поведение
Huckle

2

read -p "Press any key to continue or CTRL-C to abort"отлично работает под 14.04 в моих скриптах. Как сказал @Lekensteyn в комментарии выше, похоже, что это имело место с 12.04.4. Страница 'help read' гласит:

-p prompt   output the string PROMPT without a trailing newline before
            attempting to read

1

Мое любимое использование этого - установить тайм-аут по умолчанию, чтобы скрипт мог запускаться без присмотра:

echo "Press any key to continue..."
read -n1 -t5 any_key

где:

  • -n1 говорит прочитанному принять любой отдельный символ
  • -t5 говорит ему ждать максимум 5 секунд для ввода

Я работаю почти исключительно с Bash под CentOS, поэтому я не могу поручиться за эту работу над другими вариантами Linux, но, поскольку это Bash, я бы ожидал, что это сработает. Я хотел бы знать наверняка, если это так! :)


0

Простое ожидание остановки сценария - вызов kill -STOP $$из сценария: после приостановки сценарий продолжит свою работу после получения сигнала -CONT.

#!/bin/bash
echo "$0 stopping now"
kill -STOP $$
echo "$0 continues its work"

Как отправить CONTсигнал сценарию?
Дэвид Фёрстер,

-2
echo "press enter to continue"
read unusedVariable
echo "running these 3 lines in .sh file, this echo will never be seen, unless you have a really slow computer"

поместите эти 3 строки в файл .sh и запустите его


1
-1 Что это должно делать и почему? Почему выходные данные последней echoкоманды не отображаются и какое отношение это имеет к скорости компьютера?
Дэвид Фёрстер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.