Saya memiliki skrip Bash shell di mana saya ingin menjeda eksekusi sampai pengguna menekan tombol. Dalam DOS, ini mudah dilakukan dengan perintah "pause". Apakah ada padanan Linux yang dapat saya gunakan dalam skrip saya?
236
read
Melakukan hal ini:
user@host:~$ read -n1 -r -p "Press any key to continue..." key
[...]
user@host:~$
The -n1
menetapkan bahwa hanya menunggu satu karakter. The -r
menempatkan ke dalam modus mentah, yang diperlukan karena jika tidak, jika Anda menekan sesuatu seperti garis miring terbalik, itu tidak mendaftar sampai Anda menekan tombol berikutnya. The -p
menspesifikasikan prompt, yang harus dikutip jika mengandung spasi. The key
Argumen ini hanya diperlukan jika Anda ingin tahu mana kunci mereka ditekan, 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
"Enter any non-NUL character to continue"
. Beberapa kunci tidak mengirim karakter apa pun (sepertiCtrl
...) dan beberapa mengirim lebih dari satu (sepertiF1
,Home
...).bash
mengabaikan karakter NUL.Press a key to continue...
maka pengguna awam pun dapat menemukana
kunci dan menekannya; o)command | myscript.sh
ataumyscript.sh | command
. Lihat jawaban ini untuk solusinya.read: 1: read: Illegal option -n
memastikan untuk membungkus perintah Anda dibash -c 'command && command'
dll karena kesalahan itu kemungkinan berasalsh
. Saya melakukan ini dalam perintah pembungkus Lando.Saya menggunakan cara-cara ini banyak yang sangat pendek, 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
Solusi melarikan diri (dengan -d $ '\ e')
Solusi utama apa saja (dengan -n 1)
Pertanyaan dengan pilihan yang dipilih sebelumnya (dengan -ei $ 'Y')
Solusi batas waktu (dengan -t 5)
Tidur alias ditingkatkan
Penjelasan
-r menentukan mode mentah, yang tidak memungkinkan karakter gabungan seperti "\" atau "^".
-s menentukan mode diam, dan karena kita tidak perlu output keyboard.
-p $ ' prompt ' menentukan prompt, yang harus antara $ 'dan' untuk membiarkan spasi dan lolos dari karakter. Hati-hati, Anda harus menempatkan antara tanda kutip tunggal dengan simbol dolar untuk mendapatkan manfaat dari karakter yang lolos, jika tidak, Anda dapat menggunakan kutipan sederhana.
-d $ ' \ e ' menetapkan escappe sebagai pembatas pembatas, jadi sebagai karakter terakhir untuk entri saat ini, ini dimungkinkan untuk menempatkan karakter apa pun tetapi hati-hati 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
tombol serve jika Anda perlu mengetahui input, dalam kasus -n1, tombol yang telah ditekan.
$? berfungsi untuk mengetahui kode keluar dari program terakhir, untuk dibaca, 142 jika batas waktu, 0 input yang benar. Masukkan $? dalam variabel sesegera mungkin jika Anda perlu mengujinya setelah perintah somes, karena semua perintah akan menulis ulang $?
sumber
-s
;man read
danread --help
bantuan tidak membantu di Ubuntu 10.04.1 LTS. Edit:help read
lakukan; Apakah sisanya sudah ditinggalkan?read: -i: invalid option
untuk mantan.read -rp $'Are you sure (Y/n) : ' -ei $'Y' key;
di #osxread -rp $'kill-server: Are you sure (Y/n) : ' -d $'Y' key;
bekerja untuk saya sebagai gantinya. `-i
bekerja dengan baik di Ubuntu, juga saya tidak tahu bagaimana jika-d
bekerja dengan cara yang sama di OSX.read
tanpa parameter apa pun hanya akan berlanjut jika Anda menekan enter.pause
Perintah DOS akan dilanjutkan jika Anda menekan tombol apa saja. Gunakanread –n1
jika Anda menginginkan perilaku ini.sumber
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 ...
Perhatikan bahwa variabel perlu diberikan sebagai argumen
read
.sumber
read -n1
tidak portabel. Cara portabel untuk melakukan hal yang sama mungkin:Selain menggunakan
read
, hanya untuk menekanENTER
untuk melanjutkan, Anda dapat melakukan:sumber
status=none
juga tidak portabel. Alihkan stdout dan stderr ke / dev / null saja.read -r line < /dev/tty
akan enought untuk menekan ENTER ... .settings=$(stty -g); stty raw; dd ...; stty "$settings"
untuk menyimpan dan mengembalikan pengaturan tty.tr
pengeditan dapat bekerja juga?tr
akan menyangga outputnya sebagai pipa, dan keyboard non-AS memiliki kunci yang mengirim karakter di luar\1-\177
jangkauan.dd
adalah cara idiomatis di sini.Jika Anda hanya perlu menjeda loop atau skrip, dan Anda senang menekan Enter daripada tombol apa pun, maka
read
dengan sendirinya akan melakukan pekerjaan.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.
sumber
Coba ini:
sumber
Fungsi ini berfungsi di kedua
bash
danzsh
, dan memastikan I / O ke terminal:Taruh di dalam Anda
.{ba,z}shrc
untuk Keadilan Hebat!sumber
Ya untuk menggunakan
read
- dan ada beberapa penyesuaian yang membuatnya paling berguna baikcron
di terminal maupun di terminal.Contoh:
-N 120 membuat waktu pernyataan baca habis setelah 2 menit sehingga tidak menghalangi
cron
.Di terminal itu memberikan 2 menit untuk melihat berapa lama
rsync
perintah untuk dieksekusi.Lalu selanjutnya
echo
adalah agar bash prompt berikutnya akan muncul di baris berikutnya.Kalau tidak, itu akan ditampilkan pada baris yang sama langsung setelah "melanjutkan ..." ketika Enterditekan di terminal.
sumber