Yanıtlar:
read
bunu yapar:
user@host:~$ read -n1 -r -p "Press any key to continue..." key
[...]
user@host:~$
-n1
Belirtir sadece tek bir karakter için bekleyeceği. -r
Bir sonraki tuşuna basmadığınız sürece sen ters eğik çizgi gibi bir şey basarsanız, çünkü aksi takdirde gerekli ham modunda içine koyar onu, o kaydetmez. -p
Belirtir boşluk içeriyorsa tırnak içinde olmalıdır istemi. key
Eğer bunu erişebileceğiniz bu durumda onlar bastırdı hangi tuşa bilmek istiyorsanız argüman gereklidir $key
.
Bash kullanıyorsanız, -t
bir tuşa basılmadığında okuma işleminin hata döndürmesine neden olan bir zaman aşımı da belirleyebilirsiniz . Yani mesela:
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
Press a key to continue...
acemi kullanıcılar bile a
anahtarı bulabilir ve basabilir; o)
read: 1: read: Illegal option -n
komutunuzu bash -c 'command && command'
vb. İçine aldığınızdan emin olun sh
. Bunu bir Lando sarmalayıcı komutunda yapıyorum.
Bu yolları çok kısa kullanıyorum ve @theunamedguy ve @Jim çözümleri gibi, ancak zaman aşımı ve sessiz modda.
Özellikle son durumu seviyorum ve kullanıcı basana kadar bir döngü içinde çalışan bir çok komut dosyasında kullanıyorum Enter.
Çözüm girin
read -rsp $'Press enter to continue...\n'
Escape çözümü (-d $ '\ e' ile)
read -rsp $'Press escape to continue...\n' -d $'\e'
Herhangi bir anahtar çözüm (-n 1 ile)
read -rsp $'Press any key to continue...\n' -n 1 key
# echo $key
Önceden seçilmiş seçenekli soru (-ei $ 'Y' ile)
read -rp $'Are you sure (Y/n) : ' -ei $'Y' key;
# echo $key
Zaman aşımı çözümü (-t 5 ile)
read -rsp $'Press any key or wait 5 seconds to continue...\n' -n 1 -t 5;
Uyku gelişmiş takma adı
read -rst 0.5; timeout=$?
# echo $timeout
-r , "\" veya "^" gibi birleştirilmiş karakterlere izin vermeyen ham modu belirtir.
-s sessiz modu belirtir ve klavye çıkışına ihtiyacımız yoktur.
-p $ ' istemi ' , boşluklara ve çıkış karakterlerine izin vermek için $ 'ile' arasında olması gereken istemi belirtir. Dikkatli olun, kaçan karakterlerden yararlanmak için dolar sembollü tek tırnak işaretleri arasına koymalısınız, aksi takdirde basit tırnak işaretleri kullanabilirsiniz.
-d $ ' \ e ' escappe değerini sınırlayıcı karakter olarak belirtir, bu nedenle geçerli girdi için son karakter olarak bu herhangi bir karakter koymak mümkündür, ancak kullanıcının yazabileceği bir karakter koymaya dikkat edin.
-n 1 yalnızca tek bir karakter gerektirdiğini belirtir.
-e readline modunu belirtir.
-i $ ' Y ', Y'yi okuma çizgisi modunda başlangıç metni olarak belirtir.
-t 5 , 5 saniyelik bir zaman aşımı süresini belirtir
tuşuna bastığınızda , -n1 durumunda, basılan tuşu bilmeniz gerekir.
, $? son programın çıkış kodunu bilmek için kullanılır, okuma için, zaman aşımı durumunda 142, 0 doğru giriş. $ Koy? Bir komuttan sonra test etmeniz gerektiğinde mümkün olan en kısa sürede bir değişken içinde, çünkü tüm komutlar $?
-s
; man read
ve read --help
yardım Ubuntu 10.04.1 LTS'de yardımcı olmadı. Düzenleme: help read
yaptım; geri kalanı kullanımdan kaldırıldı mı?
read: -i: invalid option
eski var. read -rp $'Are you sure (Y/n) : ' -ei $'Y' key;
#osx read -rp $'kill-server: Are you sure (Y/n) : ' -d $'Y' key;
yerine benim için çalışıyor. ``
-i
Ubuntu üzerinde bazı testler yaptım ve mükemmel bir şekilde çalıştım, ayrıca -d
OSX'te aynı şekilde çalışıp çalışmadığını bilmiyorum .
Bu benim için, diğer bazı çözümlerin (burada en popüler olanlar dahil) olmadığı birçok Linux lezzeti üzerinde çalıştı. Bence daha da okunabilir ...
echo Press enter to continue; read dummy;
Değişkenin bağımsız değişken olarak sağlanması gerektiğini unutmayın read
.
read -n1
taşınabilir değildir. Aynı şeyi yapmanın taşınabilir bir yolu şunlar olabilir:
( trap "stty $(stty -g;stty -icanon)" EXIT
LC_ALL=C dd bs=1 count=1 >/dev/null 2>&1
) </dev/tty
Kullanmanın yanı sıra read
, sadece bir basın ENTER
istemine devam etmek için şunları yapabilirsiniz:
sed -n q </dev/tty
status=none
taşınabilir de değil. Stdout ve stderr komutlarını / dev / null konumuna yönlendirin. ENTER ... tuşuna basmakread -r line < /dev/tty
için yeterli olacaktır .
settings=$(stty -g); stty raw; dd ...; stty "$settings"
tty ayarlarını kaydetmek ve geri yüklemek için not edin .
tr
düzenleme işi de işe yarayabilir mi?
tr
çıkışını bir pipo olarak tamponlardı ve ABD dışındaki klavyelerde, \1-\177
aralığın dışında karakter gönderen tuşlar bulunur . dd
buradaki deyimsel yol.
Bir döngüyü veya komut dosyasını duraklatmanız gerekiyorsa ve herhangi bir anahtar yerine Enter tuşuna basmaktan mutluluk duyarsanız read
, işi tek başına yapar.
do_stuff
read
do_more_stuff
Son kullanıcı dostu değildir, ancak kendiniz için hızlı bir komut dosyası yazdığınız durumlarda yeterli olabilir ve arka planda bir şey yapmak için onu duraklatmanız gerekir.
Bunu dene:
function pause(){
read -p "$*"
}
Bu fonksiyon hem çalışır bash
ve zsh
ve terminal için olmasını sağlar I / O:
# 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
Büyük Adalet için onu koy !
Kullanmak için evet read
- ve hem cron
terminalde hem de terminalde en kullanışlı hale getiren birkaç ince ayar var .
Misal:
time rsync (options)
read -n 120 -p "Press 'Enter' to continue..." ; echo " "
-N 120, okuma ifadesinin 2 dakika sonra zaman aşımına uğramasını ve böylece engellenmemesini sağlar cron
.
Terminalde rsync
komutun ne kadar sürdüğünü görmek 2 dakika verir .
Daha sonra echo
, sonraki bash istemi sonraki satırda görünecektir.
Aksi takdirde Enter, terminalde basıldığında "devam ..." dan hemen sonra aynı satırda gösterilir .
"Enter any non-NUL character to continue"
. Bazı tuşlar herhangi bir karakteri (gibi göndermeyenCtrl
...) ve bazı send birden fazla (gibiF1
,Home
...).bash
NUL karakterlerini yok sayar.