Nonaktifkan perilaku Salin & Tempel default di Bash


9

Ketika saya menempel ke sesi terminal saya, shell segera menjalankan perintah tanpa saya menekan tombol enter.

Saya benar-benar tidak tahu cara menonaktifkan perilaku itu.

Saya menggunakan terminal yang sudah diinstal pada MacOS Yosemite.


9
Itu hanya berlaku, tentu saja, jika buffer penyangga berisi baris baru. Ini hampir tidak ada hubungannya dengan bash. (Ini menyangkut bash hanya jika dan sejauh menggunakan perpustakaan readline.)
Peter - Reinstate Monica

... namun bash(dengan bantuan readline) telah diperbaiki.
alexis

Jawaban:


16

Dengan bash4.4 atau yang lebih baru dan di terminal yang mendukung a la tempel kurung xterm, Anda dapat melakukan:

bind 'set enable-bracketed-paste'

(atau tambahkan set enable-bracketed-pasteke Anda ~/.inputrc)

Itu akan menyebabkan buffer copy-paste dimasukkan pada prompt alih-alih karakter di dalamnya ditafsirkan seolah-olah diketik (Anda masih bisa memiliki masalah jika buffer itu berisi karakter seperti ^C, ^Zdan emulator terminal Anda tidak memfilternya) .

zsh apakah itu secara default sejak versi 5.1.

Untuk cangkang atau terminal lain, lihat juga: Bagaimana saya bisa melindungi diri dari penyalahgunaan papan klip semacam ini?


Saya akan melihat langsung ke dalamnya
Opaldes

cara booth sepertinya tidak berfungsi
Opaldes

@Opaldes, apa yang Anda coba? Dengan versi apa shell dan terminal apa? Saya percaya OS / X juga disertakan xterm, Anda bisa mencobanya. Sudahkah Anda mencoba perlskrip pada pertanyaan yang ditautkan?
Stéphane Chazelas

1
@Opaldes, sesuai dengan Menempelkan kode ke jendela terminal ke vim pada Mac OS X OS / X Terminal mendukung pasta yang diberi tanda kurung sejak OS / X Lion. Jadi sepertinya yang Anda butuhkan adalah versi zsh atau bash yang cukup baru. Dengan versi zsh yang lebih lama, itu juga dapat dicapai melalui konfigurasi.
Stéphane Chazelas

1
Kami dapat berterima kasih kepada Daniel Colascione karena menambahkan fitur bermanfaat ini ke Bash / Readline: gnu-bash.2382.n7.nabble.com/...
Anthony Geoghegan

6

Ini terjadi ketika Anda menempelkan karakter "baris baru". Misalnya, jika Anda menempelkan beberapa baris atau tidak sengaja menyalin carriage return di akhir baris. AFAIK tidak ada cara untuk benar-benar menonaktifkan perilaku ini tetapi ada cara untuk menguranginya.

Cara termudah adalah dengan menyalin satu baris pada satu waktu dan kehilangan karakter terakhir, secara manual menambahkannya setelah itu.

Atau, seperti yang ditunjukkan oleh the_velour_fog di bawah ini, Anda juga dapat menempelkannya ke editor yang menunjukkan karakter yang tidak dicetak dan memilih kembali tanpa baris baru.

Ada satu atau dua solusi untuk distro GNU / Linux tetapi tidak tahu apakah konsep ini dapat dipindahkan ke MacOS. Apapun itu, lihat di sini dan lihat apakah ada file serupa di mac yang bisa Anda ubah. Sayangnya, saya meragukannya.


Saya hanya menempelkannya ke editor yang menunjukkan karakter yang tidak dicetak, kemudian memilih kembali tanpa baris baru
the_velour_fog

Saran bagus, diedit untuk disertakan.
I_GNU_it_all_along

baik untuk mengetahui yang menjelaskan bahwa hal itu terjadi tidak setiap saat. Saya mengubah jawaban Anda tetapi lebih merupakan solusi untuk saya.
Opaldes

Itu menyebalkan tapi bisa berguna saat menyalin serangkaian perintah.
I_GNU_it_all_along

"Solusi" saya juga semacam solusi peretasan, tetapi lebih cepat daripada memilih secara terpisah, IMO.
Peter Cordes

5

Sebelum menempel, ketikkan kutipan tunggal , lalu tempel. control-c dan panah atas untuk mengeditnya sebagai satu garis raksasa.

tanda kutip ganda juga berfungsi, jika teks berisi tanda kutip tunggal tetapi bukan ganda. Tidak apa-apa jika berisi $atau hal-hal lain yang berkembang di dalam tanda kutip ganda, karena Anda tidak benar-benar menjalankan garis raksasa yang dikutip sebagai satu perintah.


Anda tidak dapat benar-benar mengedit semuanya di sana, karena baris baru memulai prompt lanjutan (bukan terminologi resmi) alih-alih membuat satu garis panjang yang besar.

diberikan 4 baris ini:

echo
ls
foo
bar

menempel seperti yang saya sarankan akan menghasilkan ini di layar Anda:

$ 'echo 
> ls
> foo
> bar        <or cursor here if you didn't include a trailing newline
> [cursor here]

Anda kemudian dapat menekan control-C dan panah atas. (control-C menghancurkan semuanya pada baris yang sama dengan kursor, jadi tekan return terlebih dahulu jika ada teks yang berguna di sana.)

Alternatifnya adalah dengan menutup penawaran dan menekan kembali, lalu naikkan itu.

Pokoknya, setelah panah ke atas

$ 'echo
ls
foo
bar

kontrol-a dan hapus yang memimpin '. Gunakan kontrol-kiri dan kanan-kontrol untuk bergerak cepat melalui blok tempel (dengan kata-kata). Atau jika pengaturan terminal Anda tidak mendukung tombol panah kontrol, alt-b dan alt-f.


Baris baru literal benar-benar memisahkan perintah, dan 4 baris ini akan masuk ke riwayat perintah Anda secara terpisah . Anda mungkin ingin mengubahnya ke ;atau &&. (Saya tidak tahu trik untuk itu, cukup gunakan pengulangan kunci untuk kata maju atau mundur untuk sampai ke sana dengan cepat dan melakukannya secara manual.)


2

Ini terjadi karena pasta Anda diakhiri dengan baris baru, dan emulator terminal pada dasarnya mengumpankan pasta ke karakter bash oleh karakter. Dalam proses ini, bash tidak tahu pengetik manusia dari mesin.

Saya biasanya hanya memberi perhatian ekstra ketika melakukan copy-paste yang tidak termasuk baris baru, tetapi ada satu trik yang bisa Anda coba: sebelum menempelkan, di bash, ketik C-x C-e. Itu harus diluncurkan $EDITORdengan file kosong. Apa pun yang Anda simpan di file itu dan keluar, bash akan mengeksekusi. Jadi sekarang Anda dapat menempelkan perintah Anda ke editor, mungkin memanipulasi hal-hal lebih lanjut dan kemudian menjalankan semuanya sekaligus.


-1

Saya TIDAK terkait dengan perusahaan, saya pelanggan yang sangat puas. Coba program terminal ini: http://www.emtec.com/zoc/index.html . Ada juga versi Mac yang tersedia.

Jika saya melanggar dengan jawaban ini aturan SE, harap beri tahu saya dan saya hapus jawabannya.

Edit:

Ketika saya mengerti jawaban lain dengan benar, masalah ini mungkin disebabkan oleh program terminal. Program terminal ZOC adalah perangkat lunak profesional yang dirancang sempurna untuk pekerjaan. Ini menempel teks yang Anda pilih tanpa karakter tambahan. Anda dapat mencatat sesi Anda dalam file teks terpisah. Dan masih banyak lagi

Memperbarui:

Program terminal memiliki opsi Paste without final 'newline'. Mungkin ini bisa membantu.


3
Setidaknya tolong katakan bagaimana menjawab pertanyaan
Stéphane Chazelas

Jika Anda menempelkan string yang berisi karakter baris baru atau carriage-return pada prompt shell yang berjalan di terminal itu, apa yang terjadi? Jika itu tidak menyebabkan shell menjalankan perintah langsung (seperti yang diminta di sini), bagaimana cara melakukannya? Apakah itu menghapus karakter dari seleksi? Apakah itu memasukkan karakter ^ V sebelum melarikan diri untuk bash?
Stéphane Chazelas

2
Karena itu, ini lebih mirip spam (meskipun saya yakin itu bukan maksud Anda untuk meng-spam situs ini). Itu tidak menjawab pertanyaan dan hanya iklan untuk produk komersial terkait.
Stéphane Chazelas

2
@AlBundy, cari tahu apakah klien terminal favorit Anda menyelesaikan masalah ini dengan mencoba eksploit yang dibahas di security.stackexchange.com/q/39118 (disebutkan dalam jawaban Stephane), dan tautan yang akan Anda temukan di sana. Jika itu melindungi Anda, Anda memiliki alasan kuat untuk merekomendasikannya (berikan rincian tes Anda dalam jawaban Anda.).
alexis

Biasanya masalahnya adalah bahwa apa yang Anda pilih tidak termasuk baris baru. Bagaimana "menempelkan teks yang Anda pilih" berbeda dari perilaku normal emulator terminal lainnya?
Peter Cordes
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.