Нажмите Enter / return, чтобы перейти к следующему скрипту в unix shell [duplicate]

Полагая условие в соединении кажется мне «семантически неправильным», поскольку это не то, что JOINs «для». Но это очень качественно.

Дополнительная проблема: если вы решили переключиться с внутреннего соединения на, скажем, правое соединение, имея условие внутри JOIN, это может привести к неожиданным результатам.

196
задан Peter Mortensen 30 September 2014 в 13:19
поделиться

9 ответов

Я использую эти способы, которые очень короткие, и они похожи на @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 mode, которые не позволяют использовать комбинированные символы, такие как «\» или «^».

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

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

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

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

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

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

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

[], если вам нужно знать ввод, в случае -n1 , который был нажат.

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

288
ответ дан Peter Mortensen 15 August 2018 в 17:06
поделиться
  • 1
    Строго говоря, это будет "Enter any non-NUL character to continue". Некоторые клавиши не отправляют символ (например, Ctrl ...), а некоторые отправляют более одного (например, F1, Home ...). bash игнорирует символы NUL. – Stephane Chazelas 4 June 2014 в 21:33
  • 2
    +1 для объяснения -s; man read и read --help помощь не помогли Ubuntu 10.04.1 LTS. Изменить: help read; остальное устарело? – Cees Timmerman 22 October 2014 в 09:35
  • 3
    1+ за отличное объяснение: но я получил read: -i: invalid option для ex. read -rp $'Are you sure (Y/n) : ' -ei $'Y' key; на #osx read -rp $'kill-server: Are you sure (Y/n) : ' -d $'Y' key; работает вместо меня. ` – Tino Rüb 21 March 2016 в 19:26
  • 4
    Я не знаю, как это работает на OSX, но я сделал несколько тестов, и -i отлично работает на Ubuntu, также я не знаю, как, если -d работает одинаково на OSX. – y.petremann 21 March 2016 в 23:40
  • 5
    можно быстро работать, быстро и приятно, используя эхо перед чтением, в конечном итоге echo -n – THESorcerer 13 March 2018 в 10:07
  • 6
    Обычно лучше спросить конкретный ключ, например, ввести, пробел или Y. & quot; ЛЮБОЙ & quot; может быть запутанным для некоторых пользователей, есть ключ TAB, поэтому почему нет ANY-ключа и наверняка есть ключи, которые потенциально опасны, такие как ESCAPE, CTRL, CMD, кнопка питания и т. д. Это уже не так актуально сегодня , поскольку в настоящее время консоль обычно используется только передовыми пользователями компьютеров, которые будут интерпретировать «ЛЮБОЙ ключ». правильно. В Руководстве по дизайну Apple 2, довольно жестком, есть интересный раздел, посвященный этому предмету ( apple2scans.net/files/1982-A2F2116-m-a2e-aiiedg.pdf ). – Gellweiler 6 April 2018 в 17:26
  • 7
    Если вы вместо этого используете сообщение Press a key to continue..., то даже начинающие пользователи смогут найти клавишу a и нажать ее; o) – DJDaveMark 11 May 2018 в 09:13
  • 8
    У этого будут проблемы с command | myscript.sh или myscript.sh | command. См. этот ответ для решения. – Tom Hale 28 June 2018 в 05:29
288
ответ дан Peter Mortensen 5 September 2018 в 16:11
поделиться

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

echo Press enter to continue; read dummy;

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

9
ответ дан BuvinJ 15 August 2018 в 17:06
поделиться
  • 1
    Добавлено 8 лет назад. В июле 2017 года это то, что я хотел. Большое спасибо. – SDsolar 8 July 2017 в 05:29
  • 2
    этот ответ решает мою проблему, если я копирую и вставляю эту строку, и по какой-то причине я получил больше добавленных строк, приложенные строки не выполняются, например, с паузой DOS – Sérgio 28 October 2017 в 00:38

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

function pause(){
   read -p "$*"
}
-2
ответ дан John Kugelman 15 August 2018 в 17:06
поделиться
  • 1
    Может кто-нибудь объяснить, почему это занижено? Это из-за недостатка контента или это плохое решение? – 3ocene 11 April 2017 в 22:24
  • 2
    @ 3ocene Это не показывает использование созданной функции; плюс это отсутствие каких-либо объяснений. – parvus 27 December 2017 в 14:19
  • 3
    Согласовано. Не могли бы вы показать пример того, как эта функция вызывается? – SDsolar 4 April 2018 в 17:25

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
8
ответ дан mikeserv 15 August 2018 в 17:06
поделиться
  • 1
    status=none также не переносится. Перенаправить stdout и stderr в / dev / null вместо. read -r line < /dev/tty будет достаточно для нажать ENTER ... . – Stephane Chazelas 4 June 2014 в 21:28
  • 2
    @StephaneChezales спасибо - я этого не знал. плохо исправить это сейчас. Еще раз спасибо - исправлено. Между прочим, вы бездонная колодец полезной информации. – mikeserv 4 June 2014 в 21:31
  • 3
    Также обратите внимание на settings=$(stty -g); stty raw; dd ...; stty "$settings", чтобы сохранить и восстановить настройки tty. – Stephane Chazelas 4 June 2014 в 21:36
  • 4
    @StephaneChezales - им не на компьютере - вы думаете, что вещь редактирования tr тоже может работать? – mikeserv 4 June 2014 в 21:46
  • 5
    Нет, потому что tr будет буферировать свой вывод в качестве своего канала, а неамериканские клавиатуры имеют ключи, которые отправляют символы вне диапазона \1-\177. dd является идиоматическим способом здесь. – Stephane Chazelas 4 June 2014 в 21:51

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

do_stuff
read
do_more_stuff

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

2
ответ дан mwfearnley 15 August 2018 в 17:06
поделиться
  • 1
    Это верно, но для базы данных наиболее полезно показать пример. – SDsolar 27 March 2018 в 19:13
  • 2
    Спасибо, я принял ваш совет на борту. Просто написать имя команды не очень понятно в ретроспективе. – mwfearnley 4 April 2018 в 10:05

Да, чтобы использовать read - и есть несколько настроек, которые делают его наиболее полезным как в cron, так и в терминале.

Пример:

time rsync (options)
read -n 120 -p "Press 'Enter' to continue..." ; echo " "

. -n 120 заставляет истечение времени чтения после 2 минут, чтобы он не блокировался в cron.

В терминале он дает 2 минуты, чтобы узнать, сколько времени потребовалось выполнить команде rsync.

Затем последующий echo будет таким, чтобы последующая подсказка bash появлялась на следующем line.

В противном случае он будет отображаться в той же строке непосредственно после «continue ...», когда в терминале нажат Enter.

0
ответ дан SDsolar 15 August 2018 в 17:06
поделиться

Эта функция работает как в 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 для Великой справедливости!

1
ответ дан Tom Hale 15 August 2018 в 17:06
поделиться

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

12
ответ дан xsl 15 August 2018 в 17:06
поделиться
Другие вопросы по тегам:

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