it-swarm-id.com

Apa yang setara dengan Linux untuk jeda DOS?

Saya memiliki skrip Bash Shell di mana saya ingin menjeda eksekusi sampai pengguna menekan tombol. Di DOS, ini mudah dilakukan dengan perintah "pause". Apakah ada padanan Linux yang dapat saya gunakan dalam skrip saya?

212
jt.

read melakukan ini:

[email protected]:~$ read -n1 -r -p "Press any key to continue..." key
[...]
[email protected]:~$ 

-n1 menetapkan bahwa ia hanya menunggu satu karakter. -r menempatkannya ke mode mentah, yang diperlukan karena jika tidak, jika Anda menekan sesuatu seperti backslash, itu tidak akan terdaftar sampai Anda menekan tombol berikutnya. -p menentukan Prompt, yang harus dikutip jika mengandung spasi. Argumen key hanya diperlukan jika Anda ingin tahu kunci mana yang mereka tekan, dalam hal ini Anda dapat mengaksesnya melalui $key.

Jika Anda menggunakan Bash, Anda juga dapat menentukan batas waktu dengan -t, yang menyebabkan pembacaan mengembalikan kegagalan ketika tombol tidak ditekan. Jadi misalnya:

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
306
Jim

Saya menggunakan cara-cara ini banyak yang sangat singkat, dan mereka seperti solusi @theunamedguy dan @ Jim, tetapi dengan mode timeout dan silent sebagai tambahan.

Saya terutama menyukai kasus terakhir dan menggunakannya dalam banyak skrip yang berjalan dalam satu lingkaran sampai pengguna menekan Enter.

Perintah

  • Masukkan solusi

    read -rsp $'Press enter to continue...\n'
    
  • Solusi keluar (dengan -d $ '\ e')

    read -rsp $'Press escape to continue...\n' -d $'\e'
    
  • Solusi kunci apa saja (dengan -n 1)

    read -rsp $'Press any key to continue...\n' -n 1 key
    # echo $key
    
  • Pertanyaan dengan pilihan terpilih (dengan -ei $ 'Y')

    read -rp $'Are you sure (Y/n) : ' -ei $'Y' key;
    # echo $key
    
  • Solusi batas wakt (dengan -t 5)

    read -rsp $'Press any key or wait 5 seconds to continue...\n' -n 1 -t 5;
    
  • Sleep disempurnakan alias

    read -rst 0.5; timeout=$?
    # echo $timeout
    

Penjelasan

- r menentukan mode mentah, yang tidak memungkinkan karakter gabungan seperti "\" atau "^".

- s menentukan mode diam, dan karena kita tidak memerlukan output keyboard.

- p $ ' Prompt ' menentukan Prompt, yang harus antara $ 'dan' untuk membiarkan spasi dan karakter yang lolos . Hati-hati, Anda harus menempatkan antara tanda kutip tunggal dengan simbol dolar untuk mendapatkan manfaat dari karakter yang lolos, jika tidak, Anda dapat menggunakan tanda kutip sederhana.

- d $ '\e ' menetapkan escappe sebagai pembatas pembatas, jadi sebagai karakter terakhir untuk entri saat ini, ini dimungkinkan untuk menempatkan karakter apa pun tetapi berhati-hatilah untuk menempatkan karakter yang dapat diketik pengguna.

- n 1 menetapkan bahwa itu hanya membutuhkan satu karakter.

- e menentukan mode readline.

- i $ 'Y' menentukan Y sebagai teks awal dalam mode readline.

- t 5 menentukan batas waktu 5 detik

kunci melayani jika Anda perlu mengetahui input, dalam kasus -n1, kunci yang telah ditekan.

$? melayani untuk mengetahui kode keluar dari program terakhir, untuk dibaca, 142 dalam kasus timeout, 0 input yang benar. Masukkan $? dalam sebuah variabel sesegera mungkin jika Anda perlu mengujinya setelah beberapa perintah, karena semua perintah akan menulis ulang $?

146
y.petremann

Ini bekerja untuk saya di berbagai rasa Linux, di mana beberapa solusi lain tidak (termasuk yang paling populer di sini). Saya pikir itu lebih mudah dibaca juga ...

echo Press enter to continue; read dummy;

Perhatikan bahwa variabel perlu disediakan sebagai argumen untuk read.

13
BuvinJ

read tanpa parameter apa pun hanya akan berlanjut jika Anda menekan enter . Perintah DOS pause akan berlanjut jika Anda menekan tombol apa saja. Gunakan read –n1 jika Anda menginginkan perilaku ini.

12
xsl

read -n1 tidak portabel. Cara portabel untuk melakukan hal yang sama mungkin:

(   trap "stty $(stty -g;stty -icanon)" EXIT
    LC_ALL=C dd bs=1 count=1 >/dev/null 2>&1
)   </dev/tty

Selain menggunakan read, hanya dengan menekan ENTER untuk melanjutkan Prompt yang dapat Anda lakukan:

sed -n q </dev/tty
8
mikeserv

Jika Anda hanya perlu menjeda loop atau skrip, dan Anda senang menekan Enter daripada tombol apa pun, maka read sendiri akan melakukan pekerjaan.

do_stuff
read
do_more_stuff

Ini tidak ramah pengguna akhir, tetapi mungkin cukup dalam kasus di mana Anda menulis skrip cepat untuk diri sendiri, dan Anda perlu menjeda untuk melakukan sesuatu secara manual di latar belakang.

2
mwfearnley

Fungsi ini berfungsi dalam bash dan zsh, dan memastikan I/O ke terminal:

# 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

Masukkan ke dalam .{ba,z}shrc Anda untuk Keadilan Hebat!

1
Tom Hale

Ya untuk menggunakan read - dan ada beberapa tweak yang membuatnya paling berguna di cron dan di terminal.

Contoh:

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

-N 120 membuat waktu pernyataan baca habis setelah 2 menit sehingga tidak memblokir dalam cron.

Di terminal itu memberikan 2 menit untuk melihat berapa lama perintah rsync perlu dieksekusi.

Maka echo berikutnya adalah sehingga Prompt bash berikutnya akan muncul pada baris berikutnya.

Kalau tidak, itu akan ditampilkan pada baris yang sama langsung setelah "lanjutkan ..." ketika Enter ditekan di terminal.

0
SDsolar