DOS duraklatmasına eşdeğer Linux nedir?


236

Kullanıcı bir tuşa basana kadar yürütmeyi duraklatmak istiyorum bir Bash kabuk komut dosyası var. DOS'ta bu "pause" komutu ile kolayca yapılabilir. Senaryomda kullanabileceğim bir Linux eşdeğeri var mı?

Yanıtlar:


329

read bunu yapar:

user@host:~$ read -n1 -r -p "Press any key to continue..." key
[...]
user@host:~$ 

-n1Belirtir sadece tek bir karakter için bekleyeceği. -rBir 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. -pBelirtir boşluk içeriyorsa tırnak içinde olmalıdır istemi. keyEğer bunu erişebileceğiniz bu durumda onlar bastırdı hangi tuşa bilmek istiyorsanız argüman gereklidir $key.

Bash kullanıyorsanız, -tbir 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

5
Açıkçası, bu olurdu "Enter any non-NUL character to continue". Bazı tuşlar herhangi bir karakteri (gibi göndermeyen Ctrl...) ve bazı send birden fazla (gibi F1, Home...). bashNUL karakterlerini yok sayar.
Stephane Chazelas

2
Genellikle enter, space veya Y gibi belirli bir anahtar istemek daha iyi bir fikirdir. ESCAPE, CTRL, CMD, güç düğmesi, vb. gibi. Bu günümüzde artık geçerli değil, çünkü günümüzde konsol genellikle sadece "HERHANGİ BİR anahtarı" doğru yorumlayacak olan gelişmiş bilgisayar kullanıcıları tarafından kullanılıyor. Oldukça eski Apple 2 Tasarım Kılavuzu'nun bu konuya adanmış ilginç bir bölümü var ( apple2scans.net/files/1982-A2F2116-m-a2e-aiiedg.pdf ).
Gellweiler

3
Bunun yerine mesajı kullanırsanız, Press a key to continue...acemi kullanıcılar bile aanahtarı bulabilir ve basabilir; o)
DJDaveMark

1
Bunun command | myscript.shveya ile ilgili sorunları olacaktır myscript.sh | command. Çözüm için bu cevaba bakınız .
Tom Hale

Eğer birisi hata alırsa read: 1: read: Illegal option -nkomutunuzu bash -c 'command && command'vb. İçine aldığınızdan emin olun sh. Bunu bir Lando sarmalayıcı komutunda yapıyorum.
Elijah Lynn

155

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.

Komutları

  • Çö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

açıklama

-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 $?


1
Açıklamak için +1 -s; man readve read --helpyardım Ubuntu 10.04.1 LTS'de yardımcı olmadı. Düzenleme: help readyaptım; geri kalanı kullanımdan kaldırıldı mı?
Cees Timmerman

1
1 + büyük açıklama için: ama read: -i: invalid optioneski 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. ``
Tino Rüb

OSX'te nasıl çalıştığını bilmiyorum ama -iUbuntu üzerinde bazı testler yaptım ve mükemmel bir şekilde çalıştım, ayrıca -dOSX'te aynı şekilde çalışıp çalışmadığını bilmiyorum .
y.petremann

biri okumadan önce bir yankı kullanarak istemi gerçekten hızlı ve güzel, sonunda yankı -n
çalışabilir

15

readherhangi bir parametre olmadan yalnızca enter tuşuna basarsanız devam eder. pauseHerhangi bir tuşa basarsanız DOS komutu devam eder. read –n1Bu davranışı istiyorsanız kullanın .


15

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.


bu cevap sorunumu çözer, eğer bu satırı kopyalayıp yapıştırırsam ve nedense daha fazla satır ekliyorsam, eklenen satırlar yürütülmez, DOS duraklaması gibi
Sérgio

10

read -n1taşı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 ENTERistemine devam etmek için şunları yapabilirsiniz:

sed -n q </dev/tty

2
status=nonetaşı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 .
Stephane Chazelas

@StephaneChezales teşekkürler - bunu bilmiyordum. Şimdi tamir edeceğim. Tekrar teşekkürler - düzeltildi. Bu arada, değerli bir bilgiden dipsiz birisin.
mikeserv

1
Ayrıca settings=$(stty -g); stty raw; dd ...; stty "$settings"tty ayarlarını kaydetmek ve geri yüklemek için not edin .
Stephane Chazelas

@StephaneChezales - bilgisayar başında değilim - sizce trdüzenleme işi de işe yarayabilir mi?
mikeserv

1
Hayır, çünkü trçıkışını bir pipo olarak tamponlardı ve ABD dışındaki klavyelerde, \1-\177aralığın dışında karakter gönderen tuşlar bulunur . ddburadaki deyimsel yol.
Stephane Chazelas

2

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.


Bu doğrudur, ancak veritabanı için bir örnek göstermek en yararlısıdır.
SDsolar

Teşekkürler, tavsiyenizi gemiye aldım. Sadece bir komut adı yazmak, geçmişte çok net değil.
mwfearnley

1

Bunu dene:

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

1
Birisi bunun neden reddedildiğini açıklayabilir mi? İçerik eksikliği nedeniyle mi yoksa kötü bir çözüm mü?
3ocene

4
@ 3ocene Oluşturulan işlevin kullanımını göstermez; artı bu herhangi bir açıklama eksikliği.
parvus

Kabul. Lütfen bu işlevin nasıl çağrıldığına ilişkin bir örnek gösterebilir misiniz?
SDsolar

1

Bu fonksiyon hem çalışır bashve zshve 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}shrcBüyük Adalet için onu koy !


0

Kullanmak için evet read- ve hem cronterminalde 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 rsynckomutun 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 .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.