Bash'de varsayılan Kopyala ve Yapıştır davranışını devre dışı bırak


9

Terminal oturumuma yapıştırdığımda, kabuk hemen enter tuşuna basmadan komutu yürütür.

Bu davranışı nasıl devre dışı bırakacağımı gerçekten bilmiyorum.

MacOS Yosemite'de önceden kurulmuş terminali kullanıyorum.


9
Bunu, elbette, macun tamponu bir satırsonu içeriyorsa yapar. Bunun bash ile (neredeyse) hiçbir ilgisi yok. (Sadece okuma çizgisi kitaplığını kullandığı takdirde bash ile ilgilidir.)
Peter - Reinstate Monica

... ve yine de bash(yardımıyla readline) bir düzeltmesi var.
alexis

Yanıtlar:


16

İle bash4.4 veya destek a la yapıştırmak parantez olduğunu daha yeni ve terminallerde xterm, bunu yapabilirsiniz:

bind 'set enable-bracketed-paste'

(veya eklemek set enable-bracketed-pasteadresinden Müşteri ~/.inputrc)

Yani neden olacaktır copy-paste yazarsa (yani tampon gibi karakterler içeriyorsa Hala sorun olabilir olarak yorumlanmamalıdır bunun içindeki karakterlerin isteminde eklenecek tampon ^C, ^Zve terminal emülatörü onları filtre etmez) .

zsh bunu sürüm 5.1'den beri varsayılan olarak yapar.

Diğer mermiler veya terminaller için ayrıca bkz: Kendimi bu tür pano kötüye kullanımından nasıl koruyabilirim?


Ben tam ona bakacağım
Opaldes

stant yolları çalışmıyor gibi görünüyor
Opaldes

@Opaldes, ne denedin? Hangi kabuğun hangi versiyonu ve hangi terminallerde? OS / X'in de birlikte xtermgeldiğine inanıyorum , bunun yerine deneyebilirsiniz. perlBağlantılı soruda senaryoyu denediniz mi?
Stéphane Chazelas

1
@Opaldes, Mac OS X üzerinde kod penceresine terminal penceresine yapıştırma X OS / X Terminal OS / X Lion'dan beri parantez yapıştırmayı destekler. Yani ihtiyacınız olan tek şey yeterince yeni bir zsh veya bash sürümü. Daha eski zsh sürümlerinde, yapılandırma yoluyla da elde edilebilir.
Stéphane Chazelas

1
Bu yararlı özelliği Bash / Readline'a eklediği için Daniel Colascione'ye teşekkür edebiliriz: gnu-bash.2382.n7.nabble.com/…
Anthony Geoghegan

6

Bu, bir "satırsonu" karakteri yapıştırdığınızda olur. Örneğin, birden çok satır yapıştırıyorsanız veya satırın sonunda bilinmeyen bir satır başı kopyasını kopyalarsanız. AFAIK, bu davranışı gerçekten devre dışı bırakmanın bir yolu yoktur, ancak bu davranışı azaltmanın yolları vardır.

En kolay yol, bir seferde sadece bir satır kopyalamak ve son karakteri kaçırmak ve daha sonra manuel olarak eklemektir.

Ya da, the_velour_fog aşağıda belirtildiği gibi, bunu yazdırılmayan karakterleri gösteren bir düzenleyiciye yapıştırabilir ve yeni satır olmadan yeniden seçebilirsiniz.

GNU / Linux dağıtımları için bir veya iki geçici çözüm var, ancak kavramın MacOS'a aktarılıp taşınamayacağı hakkında bir fikir yok. Ne olursa olsun, buraya bir bakın ve mac'ta değiştirebileceğiniz benzer bir dosya olup olmadığını görün. Ne yazık ki, bundan şüpheliyim.


Sadece yazdırılmamış karakterleri gösteren bir düzenleyiciye yapıştırıyorum, sonra satırsonu olmadan yeniden
seçiyorum

İyi öneri, dahil etmek için düzenlendi.
I_GNU_it_all_along

bunun her zaman olmadığını açıklamak güzel. Cevabınızı iptal ettim ama bu benim için bir çözüm olarak daha çok bir çözüm.
Opaldes

Bu bir acıdır, ancak bir dizi komutu kopyalarken faydalı olabilir.
I_GNU_it_all_along

Benim "çözümüm" de bir tür hack geçici çözüm, ama ayrı ayrı, IMO seçmekten daha hızlı.
Peter Cordes

5

Yapıştırmadan önce, tek bir teklif yazın ve yapıştırın. control-c ve yukarı ok tuşlarını tek bir dev çizgi olarak düzenleyin.

çift ​​tırnaklar da işe yarar, metnin tek tırnak içermesi ancak çift tırnak içermemesi durumunda. $Alıntılanan dev satırı tek bir komut olarak çalıştırmıyorsanız, çift tırnak içinde genişleyen veya başka şeyler içeriyorsa sorun değil.


Aslında her şeyi orada düzenleyemezsiniz, çünkü yeni satırlar büyük bir uzun satır yapmak yerine bir devam istemi başlatır (resmi terminoloji değil).

bu 4 satır verildiğinde:

echo
ls
foo
bar

önerdiğim gibi yapıştırarak ekranınızda bununla sonuçlanacaktır:

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

Daha sonra kontrol-C ve yukarı ok tuşlarına basabilirsiniz. (control-C, imleçle aynı satırdaki her şeyi yok eder, bu yüzden orada yararlı metin varsa önce return tuşuna basın.)

Alternatif olarak, alıntıyı kapatıp dönüş tuşuna, ardından yukarı ok tuşuna basabilirsiniz.

Her neyse, yukarı oktan sonra

$ 'echo
ls
foo
bar

kontrol-a ve öncüyü kaldırın '. Yapıştırma bloğunda (kelimelerle) hızlı bir şekilde hareket etmek için kontrol solunu ve kontrol sağını kullanın. Veya terminal kurulumunuz kontrol ok tuşlarını, alt-b ve alt-f'yi desteklemiyorsa.


Değişmez yeni satırlar aslında ayrı komutlar yapar ve bu 4 satır komut geçmişinize ayrı ayrı girer . Bunları ;veya olarak değiştirmek isteyebilirsiniz &&. (Bunun için bir püf noktası bilmiyorum, hızlı bir şekilde oraya ulaşmak ve manuel olarak yapmak için sadece ileri veya geri kelime için anahtar tekrarı kullanın.)


2

Bunun nedeni, macununuzun yeni bir satırla bitmesi ve terminal emülatörlerinin temelde macunu karakter karakter bashlamak için beslemesidir. Bu süreçte, bash bir makineden insan daktilocunu gerçekten tanımıyor.

Genellikle bir satırsonu içermediğinden kopya yapıştırma yaparken daha fazla dikkat ediyorum, ancak deneyebileceğiniz bir numara var: yapıştırmadan önce bash'a yazın C-x C-e. $EDITORBoş bir dosya ile başlamalıdır . Bu dosyaya ne kaydederseniz ve oradan çıkarsanız, bash yürütülür. Böylece komutunuzu editöre yapıştırabilir, muhtemelen işleri daha fazla manipüle edebilir ve sonra hepsini tek seferde çalıştırabilirsiniz.


-1

Ben şirket ile ilgili DEĞİL , çok memnun bir müşteriyim. Bu terminal programını deneyin: http://www.emtec.com/zoc/index.html . Ayrıca bir Mac sürümü de mevcut.

Herhangi bir SE kuralını ihlal edersem lütfen bana bildirin ve cevabı silin.

Düzenle:

Diğer cevapları doğru anladığımda, bu sorun terminal programından kaynaklanıyor olabilir. ZOC terminal programı, iş için mükemmel bir şekilde tasarlanmış profesyonel bir yazılımdır. Seçtiğiniz metni ek karakter olmadan yapıştırır. Oturumlarınızı ayrı bir metin dosyasına kaydedebilirsiniz. Ve daha fazlası

Güncelleme:

Terminal programının bir seçeneği vardır Paste without final 'newline'. Belki bu yardımcı olur.


3
Lütfen en azından soruyu nasıl cevapladığını söyle
Stéphane Chazelas

Bu terminalde çalışan bir kabuğun komut satırına satırsonu veya satır başı karakterleri içeren bir dize yapıştırırsanız ne olur? Kabuğun komutları hemen yürütmesine neden olmazsa (burada istendiği gibi), bunu nasıl yapar? Bu karakterleri seçimden kaldırıyor mu? O öncesini ^ V karakteri eklemek mu kaçış partisi içindi bunu?
Stéphane Chazelas

2
Bu nedenle, daha çok spam gibi görünüyor (ancak bu siteyi spam etmek niyetiniz olmadığından eminim). Soruyu cevaplamıyor ve sadece ilgili ticari bir ürünün reklamı.
Stéphane Chazelas

2
@AlBundy, favori terminal istemcinizin security.stackexchange.com/q/39118 (Stephane'ın cevabında belirtilmiştir) bölümünde açıklanan istismarları ve orada bulacağınız bağlantıları deneyerek bu sorunu çözüp çözmediğini öğrenin . Sizi koruyorsa, bunu tavsiye etmek için iyi bir zemine sahipsiniz (cevabınızda testlerinizin ayrıntılarını sağlayın).
alexis

Genellikle sorun nedir seçilen olmasıdır yapan bir yeni satır bulunmaktadır. "Seçtiğiniz metni yapıştırın", diğer terminal öykünücülerinin normal davranışından nasıl farklıdır?
Peter Cordes
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.