Полагая условие в соединении кажется мне «семантически неправильным», поскольку это не то, что JOINs «для». Но это очень качественно.
Дополнительная проблема: если вы решили переключиться с внутреннего соединения на, скажем, правое соединение, имея условие внутри JOIN, это может привести к неожиданным результатам.
Я использую эти способы, которые очень короткие, и они похожи на @theunamedguy и @Jim решения, но с тайм-аутом и тихим режимом.
Мне особенно нравится последний случай и использовать его во множестве скриптов, которые запускаются в цикле, пока пользователь не нажмет Enter.
read -rsp $'Press enter to continue...\n'
read -rsp $'Press escape to continue...\n' -d $'\e'
read -rsp $'Press any key to continue...\n' -n 1 key
# echo $key
read -rp $'Are you sure (Y/n) : ' -ei $'Y' key;
# echo $key
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, потому что все команды будут переписывать $?
Это работало для меня во многих вариантах Linux, где некоторые из этих других решений не были (в том числе и самые популярные). Я думаю, что это более читаемо ...
echo Press enter to continue; read dummy;
Обратите внимание, что переменная должна быть представлена как аргумент read
.
Попробуйте следующее:
function pause(){
read -p "$*"
}
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
status=none
также не переносится. Перенаправить stdout и stderr в / dev / null вместо. read -r line < /dev/tty
будет достаточно для нажать ENTER ... i>.
– Stephane Chazelas
4 June 2014 в 21:28
settings=$(stty -g); stty raw; dd ...; stty "$settings"
, чтобы сохранить и восстановить настройки tty.
– Stephane Chazelas
4 June 2014 в 21:36
tr
тоже может работать?
– mikeserv
4 June 2014 в 21:46
tr
будет буферировать свой вывод в качестве своего канала, а неамериканские клавиатуры имеют ключи, которые отправляют символы вне диапазона \1-\177
. dd
является идиоматическим способом здесь.
– Stephane Chazelas
4 June 2014 в 21:51
Если вам просто нужно приостановить цикл или скрипт, и вы счастливы нажать Enter вместо любой клавиши, тогда read
самостоятельно выполнит задание.
do_stuff
read
do_more_stuff
Это а не для конечного пользователя, но может быть достаточно в тех случаях, когда вы пишете сценарий для себя, и вам нужно сделать паузу, чтобы сделать что-то вручную в фоновом режиме.
Да, чтобы использовать 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.
Эта функция работает как в 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
для Великой справедливости!
read
без каких-либо параметров будет продолжаться, только если вы нажмете enter. Команда DOS pause
будет продолжена, если вы нажмете любую клавишу. Используйте read –n1
, если вы хотите этого поведения.
"Enter any non-NUL character to continue"
. Некоторые клавиши не отправляют символ (например,Ctrl
...), а некоторые отправляют более одного (например,F1
,Home
...).bash
игнорирует символы NUL. – Stephane Chazelas 4 June 2014 в 21:33-s
;man read
иread --help
помощь не помогли Ubuntu 10.04.1 LTS. Изменить:help read
; остальное устарело? – Cees Timmerman 22 October 2014 в 09:35read: -i: invalid option
для ex.read -rp $'Are you sure (Y/n) : ' -ei $'Y' key;
на #osxread -rp $'kill-server: Are you sure (Y/n) : ' -d $'Y' key;
работает вместо меня. ` – Tino Rüb 21 March 2016 в 19:26-i
отлично работает на Ubuntu, также я не знаю, как, если-d
работает одинаково на OSX. – y.petremann 21 March 2016 в 23:40Press a key to continue...
, то даже начинающие пользователи смогут найти клавишуa
и нажать ее; o) – DJDaveMark 11 May 2018 в 09:13command | myscript.sh
илиmyscript.sh | command
. См. этот ответ для решения. – Tom Hale 28 June 2018 в 05:29