Masukkan teks dalam buffer baris perintah bash

9

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 -itetapi 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).

gioele
sumber
IIRC screendapat melakukan ini untuk Anda.
strugee
1
Jawaban ini di SU .
Kamil Maciorowski

Jawaban:

6

Saya menemukan cara hacky melakukan ini pada halaman contoh fzf . Ini bekerja dengan bash 4.3 dan perl 5.18:

writecmd () { 
  perl -e 'ioctl STDOUT, 0x5412, $_ for split //, do{ chomp($_ = <>); $_ }' ; 
}

# Example usage
echo 'my test cmd' | writecmd

Ini mencetak perintah ke stdout, tetapi menyalinnya ke buffer perintah juga. Ada juga contoh di halaman tertaut jika Anda ingin menjalankan perintah secara langsung.

trhodes
sumber
Jawaban ini adalah yang paling dekat dengan apa yang diminta OP.
reza.safiyat
Sintaks yang sedikit berbeda dalam jawaban ini , &TIOCSTIsedikit lebih bagus daripada 0x5412juga. Perlu dicatat bahwa kedengarannya seperti beberapa platform (misalnya OpenBSD ) menonaktifkan TIOCSTI. Saya pikir itu berarti pendekatan ini dan zsh print -ztidak akan berfungsi.
dimo414
4

Jika ini untuk fungsi yang akan Anda gunakan dalam pengikatan readline bind -xmaka Anda dapat memodifikasi READLINE_LINE. ( Contoh )

Di luar pengikatan readline, Anda dapat mendorong perintah palsu ke riwayat history -s.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Masalahnya adalah bahwa jika saya melakukannya history -s 'foo'dalam sebuah skrip, sejarah shell yang diluncurkan tidak dimodifikasi sama sekali
gioele
@gioele Anda harus meluncurkannya dari dalam shell (mis. dari skrip yang Anda muat source). Anda tidak dapat melakukan apa pun dari proses terpisah.
Gilles 'SO- berhenti bersikap jahat'
2

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.

Stijn Hoop
sumber
0

Sebagai alternatif untuk history -s 'foo'dicoba:

echo 'foo' >> ~/.bash_history
history -n

# or
history -s 'foo'
history -a
history -n
kcd
sumber