Saya ingin secara terprogram menempatkan sepotong teks tertentu dalam buffer baris perintah bash, dibaca untuk diedit dan digunakan sebagai perintah.
Apa yang saya nantikan adalah sesuatu yang mirip dengan read -i
tetapi untuk perintah.
-i text
Jika readline digunakan untuk membaca baris, teks ditempatkan ke dalam buffer pengeditan sebelum pengeditan dimulai.
Sunting : Dengan terprogram maksud saya yang ingin menulis ini dalam skrip , luncurkan skrip dan siapkan buffer perintah atau sejarah perintah yang dimodifikasi (seperti yang disarankan beberapa pertanyaan).
screen
dapat melakukan ini untuk Anda.Jawaban:
Saya menemukan cara hacky melakukan ini pada halaman contoh fzf . Ini bekerja dengan bash 4.3 dan perl 5.18:
Ini mencetak perintah ke stdout, tetapi menyalinnya ke buffer perintah juga. Ada juga contoh di halaman tertaut jika Anda ingin menjalankan perintah secara langsung.
sumber
&TIOCSTI
sedikit lebih bagus daripada0x5412
juga. Perlu dicatat bahwa kedengarannya seperti beberapa platform (misalnya OpenBSD ) menonaktifkan TIOCSTI. Saya pikir itu berarti pendekatan ini dan zshprint -z
tidak akan berfungsi.Jika ini untuk fungsi yang akan Anda gunakan dalam pengikatan readline
bind -x
maka Anda dapat memodifikasiREADLINE_LINE
. ( Contoh )Di luar pengikatan readline, Anda dapat mendorong perintah palsu ke riwayat
history -s
.sumber
history -s 'foo'
dalam sebuah skrip, sejarah shell yang diluncurkan tidak dimodifikasi sama sekalisource
). Anda tidak dapat melakukan apa pun dari proses terpisah.Jawaban Gilles benar, tetapi tidak sepenuhnya memuaskan. Ketika saya membaca pertanyaan ini, OP ingin "melihat" baris input berikutnya. Dalam kasus saya, saya ingin membaca posisi terminal saat ini di fungsi PROMPT_COMMAND saya. Itu berfungsi tetapi menggunakan buffer baca yang sama dengan shell utama, dan setiap input pengguna akan dibuang oleh fakta bahwa saya melakukan panggilan built-in 'baca' dalam fungsi. Jadi saya ingin membaca input pengguna secara terpisah, melakukan terminal saya membaca, dan kemudian memasukkan input baca kembali ke buffer input, yang merupakan pertanyaan asli. Perhatikan bahwa ini memang dalam proses yang sama, jadi secara teoritis itu harus mungkin.
Sejauh yang saya bisa lihat (pada bash 4.2 saya) tidak ada fungsi untuk mendorong sesuatu ke tumpukan input secara terprogram. Di zsh ada yang menggunakan 'print -z'.
Jadi jawabannya adalah: ini tidak mungkin dalam bash, Anda perlu menggunakan zsh untuk ini.
sumber
Sebagai alternatif untuk
history -s 'foo'
dicoba:sumber