Saya berhasil melakukan ini
echo -n " command "> / dev / tty1
Huruf-huruf muncul, dan kursor bergerak, tetapi mereka adalah "hantu" - jika Anda menekan Enter, tidak ada yang terjadi (mereka tidak ada di stdin).
Edit:
Di tengah tangkapan layar di bawah, Anda tahu mengapa saya melihat penggunaan ini. (Garis dengan teks merah, tepat di bawah garis dengan teks kuning.) Seperti sekarang, Anda tidak benar-benar "mengedit" teks catatan; Anda hanya diminta untuk menulis teks baru, yang akan menggantikan teks dari catatan yang sedang Anda edit. Jadi, saya pikir itu bisa diatasi dengan hanya menempelkan teks lama ke tty: jika pengguna mengklik masuk, tidak ada modifikasi yang dilakukan. (Program ini di Perl / MySQL, tapi saya pikir akan lebih menarik untuk meminta solusi umum daripada "bagaimana saya melakukan ini di Perl".)
Edit 2:
Berikut adalah kode Perl, yang menggunakan kode C di bawah ini (berfungsi persis seperti yang dimaksudkan), serta tangkapan layar baru - mudah-mudahan ini akan memperjelas hal-hal tanpa keraguan :) Sekali lagi, lihat di tengah tangkapan layar, tempat pengeditan dibuat ke teks catatan - kali ini, teks lama ada di sana, misalnya jika Anda hanya ingin memperbaiki kesalahan ketik, Anda tidak perlu mengetik ulang seluruh teks catatan.
my $edit_note_text = $edit_note_data[2];
print BOLD, RED, " new text: ", RESET;
system("writevt /dev/tty \"$edit_note_text\"");
my $new_text = <$in>;
$new_text = fix_input($new_text);
my $set_text = "UPDATE notes SET note = \"$new_text\" WHERE id = $edit_note_id";
$db->do($set_text);
Jawaban:
Saya baru saja menemukan program C kecil yang disebut
writevt
yang melakukan trik. Ambil kode sumber di sini . Untuk membuatnya dikompilasi dengangcc
hanya menghapus baris berikut terlebih dahulu:Perbarui . Perintah sekarang menjadi bagian dari konsol-alat , sehingga tersedia dalam sistem yang lebih baru, kecuali distribusi Anda menggunakan kbd bukan konsol-alat , dalam hal ini Anda dapat mengkompilasinya dari sumber (versi yang jauh lebih baru, tidak ada modifikasi yang diperlukan).
Pemakaian:
Perhatikan bahwa, karena alasan tertentu, Anda harus menggunakan
'\r'
(atau'\x0D'
) alih-alih'\n'
(atau'\x0A'
) untuk mengirim pengembalian.sumber
progname
dan_
, dan mengomentari beberapa fungsi panggilanmain()
_()
Fungsi ini biasanya merupakan tanda gettext yang digunakan. Tampaknya sedikit berlebihan untuk sepotong kode demo yang sederhana tetapi saya kira tidak ada salahnya.writevt.c
sini (di github.com/ grawity ) ; tampaknya pada dasarnya program yang sama.Terminal berfungsi ganda sebagai dua hal: perangkat input (seperti keyboard) dan perangkat layar (seperti monitor). Ketika Anda membaca dari terminal, Anda mendapatkan apa yang berasal dari perangkat input. Saat Anda menulis ke terminal, data masuk ke perangkat layar.
Tidak ada cara umum untuk memaksa input ke terminal. Jarang ada kebutuhan untuk melakukannya. Jika Anda perlu berinteraksi dengan program yang membutuhkan terminal, gunakan emulator terminal khusus seperti Expect or Empty , atau pembungkus terminal yang dapat diprogram seperti Screen atau Tmux . Anda dapat memaksa input ke konsol Linux dengan ioctl . Anda dapat memaksa input ke emulator terminal X11 dengan alat-alat seperti xdotool atau xmacro .
sumber
screen
dantmux
dan gunakan perintahstuff
(layar) atausend-key
(tmux) atau fitur buffer paste.screen
atautmux
)?screen -X stuff 'note version one'
.Setidaknya Linux dan BSD memiliki TIOCSTI ioctl untuk mendorong karakter kembali ke buffer input terminal (hingga batas [4096 karakter di Linux]):
Kompilasi, dan sebut sebagai:
untuk mendorong karakter kembali pada tty tertentu.
Dan dalam perl:
Sunting : Saya menyadari sekarang ini adalah ioctl yang sama seperti pada solusi writevt . Komentar dan nama perintah itu menyesatkan karena TIOCSTI bekerja untuk terminal apa pun, bukan hanya VT.
sumber
Saya memiliki demo yang lebih lengkap tentang Stack Overflow .
Dengan python Anda dapat melakukan:
Itu dengan asumsi
"command"
nilai sederhanals -la
dan menggunakan jalur tty yang ditentukan oleh OP.sumber