mencegah multi-line paste di bash

10

Saya sering menggunakan ctrl+cuntuk menyalin teks dari beberapa aplikasi gui dan kemudian menempelkannya ke emulator terminal saya (terminator), menggunakan menu klik kanan mouse dan menempelkan. Terkadang saya lupa bahwa clipboard berisi beberapa baris, yang ketika disisipkan ke bash menyebabkan setiap baris "dieksekusi"

Apakah ada solusi untuk mencegah pasta multi-line sepenuhnya?

Martin Vegter
sumber
rekatkan ke notepad dulu, untuk melihat apa yang Anda miliki, lalu jika boleh, silakan rekatkan ke dalam aplikasi Anda
Skaperen
1
di bash jalankan perintah sleep 999999kemudian lakukan paste jika terlihat ok. perintah sleep tidak membaca baris dan dibuang ketika Anda menekan ctrl+c.
Skaperen
2
Relevan: security.stackexchange.com/q/39118
Stéphane Chazelas
1
@Otheus, printf '\e[?2004h'pada kebanyakan emulator terminal seperti xterm memungkinkan mode kurung di-bracket di mana terminal mengurung teks yang disisipkan sehingga aplikasi dapat mendeteksi di mana pasta mulai dan di mana itu berakhir. xterm juga mendukung mode lain dengan \e[?2005hsemua karakter yang disisipkan diawali ^V(dipahami oleh banyak aplikasi dan disiplin garis tty sebagai litteral-next).
Stéphane Chazelas

Jawaban:

5

Jawaban ini bukan yang paling spesifik untuk pertanyaan pengguna. Silakan lihat jawaban kedua saya. Saya meninggalkan ini di sini karena ini membahas masalah yang lebih umum .

Per komentar untuk posting asli Anda, Anda perlu (1) terminal emulator yang mendukung tanda kurung sisipkan dan (2) dukungan yang sesuai untuk apa pun yang berjalan di terminal, yaitu, vim, bash, zsh. Terminal emulator yang mendukung pasta kurung (daftar akan diperbarui berdasarkan komentar pada posting ini):

  • xterm - sejak ??
  • gnome-terminal - sejak ??
  • putty - sejak 0.63 (tanggal rilis 2013-08-06)

Aplikasi yang mendukung mode kurung:

  • vim
  • zsh

Sebab bash, StéphaneChazelas telah menyusun skrip shell untuk memfasilitasi deteksi mode itu dan mengambil tindakan yang sesuai.

Jawaban yang lebih spesifik - mencegah agar garis tidak terpotong - tidak dapat dijawab tanpa mengetahui tentang program unix yang berjalan saat Anda menekan tempel.

Seorang manajer clipboard mungkin apa yang Anda butuhkan.

Otheus
sumber
Script di sana tidak mendeteksi paste braket, ini adalah skrip perl yang mengemulasi bentuk ke-3 pasta braket yang tidak memerlukan dukungan dalam aplikasi selain dari aplikasi yang perlu dipahami ^ V sebagai litteral-next (skrip itu akan sebenarnya menjawab pertanyaan ini meskipun mungkin perlu ditingkatkan, itu hanya PoC).
Stéphane Chazelas
@ StéphaneChazelas merasa bebas untuk mengedit / memperbaiki posting saya. :) "Aplikasi ini perlu dipahami ^Vsebagai literal-next. Tapi bagaimana cara ^Vmasuk ke aliran input aplikasi?
Otheus
Itu mendapatkannya jika perangkat tty dalam tidak dalam mode Amerika (seperti bashprompt readline akan melihatnya (dan akan memperlakukan adalah sebagai literal-berikutnya)). Jika dalam mode icanon, garis disiplin dari perangkat tty dalam akan menghapusnya (selama lnextkarakternya ^V), sama seperti ketika Anda mengetik Ctrl-V X secara manual ..
Stéphane Chazelas
1
Jika tidak menggunakan skrip itu, tidak ada yang menyisipkan ^Vkecuali Anda menggunakan quoted pastemode xterm (diaktifkan dengan mengirim \e[?2005h). Itu perlskrip dapat disesuaikan sehingga menghilangkan semua kecuali baris pertama dalam pasta multi-line (meskipun tidak andal untuk pasta besar), tetapi karena sudah, karena mengutip baris baru untuk readline (seperti jika Anda telah menekan Ctrl V Ctrl-J), ini mencegah baris dieksekusi (mereka baru saja ditambahkan ke buffer pengeditan dan Anda masih perlu menekan Enter untuk menjalankannya).
Stéphane Chazelas
4
Apa jawaban kedua?
Xiao