Saya memiliki echo
cetakan sederhana yang telah saya tambahkan ke .bashrc
:
echo "$(tput setaf 2)Wake up....."
sleep 2s
reset
sleep 2s
echo "$(tput setaf 2)Wake up....."
sleep 2s
reset
echo "$(tput setaf 2)Wake up neo....."
sleep 2s
echo "$(tput setaf 2)The Matrix has you......"
sleep 2s
reset
echo "$(tput setaf 2)Follow the white rabbit......"
sleep 2s
reset
cmatrix
Ini mencetak pesan ke terminal, tapi saya ingin itu terlihat seperti sedang diketik, dengan penundaan yang konsisten antara karakter.
command-line
bash
echo
SederhanaSederhana
sumber
sumber
Jawaban:
Ini tidak bekerja dengan Wayland; jika Anda menggunakan Ubuntu 17.10 dan tidak berubah untuk menggunakan Xorg saat masuk, solusi ini bukan untuk Anda.
Anda bisa menggunakannya
xdotool
untuk itu. Jika penundaan antara penekanan tombol harus konsisten , sesederhana itu:Jenis ini
something
dengan penundaan100
milidetik di antara setiap penekanan tombol.Jika penundaan antara penekanan tombol harus acak , katakanlah 100 hingga 300 milidetik, segalanya menjadi sedikit lebih rumit:
Ini
for
lingkaran melewati setiap huruf dari string disimpan dalam variabeltext
, mencetak baikkey <letter>
ataukey space
dalam kasus ruang diikuti olehsleep 0.
dan nomor acak antara 1 dan 3 (xdotool
'ssleep
menafsirkan jumlah sebagai detik). Seluruh output dari loop kemudian disalurkan kexdotool
, yang mencetak huruf-huruf dengan penundaan acak di antaranya. Jika Anda ingin mengubah penundaan, ubah saja bagiannya, menjadi batas bawah dan atas - selama 0,2 hingga 0,5 detik .(RANDOM%x)+y
y
x-1+y
(RANDOM%4)+2
Perhatikan bahwa pendekatan ini tidak mencetak teks, tetapi mengetiknya persis seperti yang akan dilakukan pengguna, mensintesis penekanan tombol tunggal. Karena itu, teks akan diketik ke dalam jendela yang saat ini difokuskan; jika Anda mengubah bagian fokus dari teks akan diketik di jendela yang baru difokuskan, yang mungkin atau mungkin tidak seperti yang Anda inginkan. Dalam kedua kasus, lihat jawaban lain di sini, yang semuanya brilian!
sumber
Saya mencoba xdotool setelah membaca jawaban @ hidangan penutup tetapi tidak berhasil karena beberapa alasan. Jadi saya datang dengan ini:
Pipa teks Anda ke dalam kode di atas dan itu akan dicetak seperti diketik. Anda juga dapat menambahkan keacakan dengan mengganti
sleep 0.1
dengansleep 0.$((RANDOM%3))
.Versi diperpanjang dengan kesalahan ketik palsu
Versi ini akan memperkenalkan kesalahan ketik sesekali dan memperbaikinya:
sumber
while IFS= read -r line; do for (( i = 0; i < ${#line}; i++ )); do sleep 0.1; printf "%s" "${line:i:1}"; done; echo; done
(ganti;
dengan baris baru dan indentasi yang baik sebagaimana diperlukan). TheIFS= read -r
danprintf "%s"
memastikan spasi dan karakter khusus tidak diperlakukan secara berbeda. Dangrep
pada setiap baris untuk dibagi menjadi karakter tidak perlu - cukup satufor
lingkaran di atas setiap karakter di baris sudah cukup.Anda menyebutkan penundaan yang konsisten antara karakter, tetapi jika Anda benar-benar ingin itu terlihat seperti sedang diketik, waktunya tidak akan sepenuhnya konsisten. Untuk mencapai ini, Anda dapat merekam pengetikan Anda sendiri dengan
script
perintah dan memainkannya kembali denganscriptreplay
:Perekaman dihentikan dengan menekan CTRL-D.
Melewati
-t
parameter untukscript
menginstruksikannya juga menghasilkan informasi waktu, yang telah saya arahkan kescript.timing
file. Saya telah menyampaikansed d
sebagai perintahscript
karena ini hanyalah cara untuk menyerap input (dan ini merekam penekanan tombol) tanpa efek samping.Jika Anda ingin melakukan semua
tput
/reset
hal juga, Anda mungkin ingin melakukanscript
rekaman untuk setiap baris Anda, dan memutarnya kembali, disisipkan dengan perintahtput
/reset
.sumber
Kemungkinan lain adalah menggunakan Demo Magic , atau, lebih tepatnya hanya fungsi cetak kumpulan skrip ini, yang pada dasarnya berjumlah
Di bawah tenda, ini menggunakan pv , yang tentu saja Anda juga dapat menggunakan untuk langsung mendapatkan efek yang diinginkan, bentuk dasar terlihat sebagai berikut:
sumber
echo
untukpv
, hanya menggunakanpv -qL20 <<< "Hello world"
jika herestrings mendukung shell Anda.Sejalan dengan nama panggilan saya, saya dapat menawarkan solusi lain:
Terlihat aneh, bukan?
-MTime::HiRes=usleep
mengimpor fungsiusleep
(mikrodetik tidur) dariTime::HiRes
modul karena biasanyasleep
hanya menerima detik integer.-F''
membagi input yang diberikan ke karakter (pembatas kosong''
) dan menempatkan karakter dalam array@F
.BEGIN {$|=1}
menonaktifkan buffering output sehingga setiap karakter segera dicetak.for (@F) { print; usleep(100_000+rand(200_000)) }
hanya mengulangi karakter1_000
(==1000
) atau bahkan1_0_00
jika kita anggap lebih mudah dibaca.rand()
mengembalikan angka acak antara 0 dan argumen yang diberikan, jadi bersama-sama ini tidur antara 100.000 dan 299.999 mikrodetik (0,1-0,3 detik).sumber
rand()
mengembalikan angka dari 0 ke argumen (100k ke 300k dalam contoh Anda) atau di antara mereka (100k + 1 hingga 300k-1 dalam contoh Anda)?[0,200k)
, yaitu termasuk 0 tetapi tidak termasuk 200rb. Perilaku yang tepat didokumentasikan di sini : "Mengembalikan bilangan pecahan acak lebih besar dari atau sama dengan 0 dan kurang dari nilai EXPR. (EXPR harus positif.)"-F
menyiratkan-a
dan-a
menyiratkan-n
.Alat lain yang mungkin berfungsi, yang tidak bergantung pada x11 atau apa pun, adalah asciicinema . Ini merekam semua yang Anda lakukan di terminal Anda dan memungkinkan Anda memutar ulang bahwa seolah-olah itu adalah tangkapan layar, hanya itu murni berdasarkan ascii! Namun, Anda mungkin harus menonaktifkan sementara prompt Anda agar benar-benar bersih secara visual. Seperti yang telah ditunjukkan oleh orang lain, menambahkan penundaan yang konsisten tidak akan terlihat alami, dan mengetiknya sendiri mungkin salah satu penampilan paling alami yang dapat Anda capai.
Setelah merekam teks, Anda dapat melakukan sesuatu seperti:
sumber
Saya terkejut belum ada yang menyebutkan ini, tetapi Anda dapat melakukannya dengan alat stok dan loop:
Itu hanya loop atas karakter input oleh karakter dan mencetaknya dengan penundaan setelah masing-masing. Satu-satunya bit yang rumit adalah bahwa Anda harus mengatur IFS Anda ke string kosong sehingga bash tidak mencoba untuk memisahkan ruang Anda.
Solusi ini sangat sederhana, sehingga menambahkan penundaan variabel antara karakter, kesalahan ketik, apa pun yang super mudah.
EDIT (terima kasih, @dabut): Jika Anda ingin antarmuka yang sedikit lebih alami, Anda bisa melakukannya
Ini akan memungkinkan Anda untuk memanggil fungsi
typeit foo bar
daripadatypeit 'foo bar'
. Ketahuilah bahwa tanpa tanda kutip, argumennya tunduk pada pemisahan kata bash, jadi misalnyatypeit foo<space><space>bar
akan dicetakfoo<space>bar
. Untuk mempertahankan spasi putih, gunakan kutipan.sumber
typeit foo<space>bar
akan menghasilkanfoo bar
, sedangkan jugatypeit foo<space><space>bar
akan menghasilkan . Anda harus mengutipnya untuk memastikan itu kata demi kata. @dabut ragu untuk menyarankan hasil edit. Saya bisa melakukannya sendiri, tetapi saya ingin memberi Anda kesempatan untuk mendapatkan kredit untuk itu.foo bar
read -n1
(yang, btw. Adaread -k1
di zsh)Pertama, "terlihat seolah-olah sedang diketik, dengan penundaan yang konsisten antara karakter ..." sedikit kontradiktif, seperti yang orang lain tunjukkan. Sesuatu yang diketik tidak memiliki penundaan yang konsisten. Ketika Anda melihat sesuatu diproduksi dengan penundaan yang tidak konsisten, Anda akan kedinginan. "Apa yang mengambil alih komputer saya !!! ??!?"
Bagaimanapun...
Saya harus berteriak
expect
, yang seharusnya tersedia di sebagian besar distribusi Linux. Old School, saya tahu, tetapi - dengan anggapan itu terinstal - tidak mungkin lebih sederhana:Dari halaman manual:
Lihat https://www.tcl.tk/man/expect5.31/expect.1.html
sumber