zapobiec wklejaniu wielu wierszy w bash

10

Często używam ctrl+cdo kopiowania tekstu z niektórych aplikacji GUI, a następnie wklejania go do emulatora terminala (terminatora), używając menu prawym przyciskiem myszy i wklej. Czasami zapominam, że schowek zawiera kilka linii, które po wklejeniu do bash powodują, że każda linia jest „wykonywana”

Czy istnieje jakieś rozwiązanie, które całkowicie zapobiega wklejaniu wielu wierszy?

Martin Vegter
źródło
wklej najpierw do notatnika, aby zobaczyć, co masz, a następnie, jeśli jest OK, wklej go do swojej aplikacji
Skaperen
1
w bash uruchom polecenie, sleep 999999a następnie wklej, jeśli wszystko wygląda dobrze. polecenie uśpienia nie odczytuje wierszy i są one odrzucane po naciśnięciu ctrl+c.
Skaperen
2
Ważne: security.stackexchange.com/q/39118
Stéphane Chazelas
1
@Otheus, printf '\e[?2004h'w większości xtermowych emulatorów terminali włącza tryb wklejania z nawiasami kwadratowymi, w którym terminal nawiasuje wklejony tekst, dzięki czemu aplikacje mogą wykryć, gdzie wklejanie się zaczyna i gdzie kończy. xterm obsługuje także inny tryb, w \e[?2005hktórym wszystkie wklejane znaki są poprzedzane ^V(rozumiane przez wiele aplikacji i dyscyplinę tty-line as litteral-next).
Stéphane Chazelas,

Odpowiedzi:

5

Ta odpowiedź nie jest najbardziej szczegółowa dla pytania użytkownika. Zobacz moją drugą odpowiedź. Zostawiam to tutaj, ponieważ dotyczy bardziej ogólnego problemu.

Za komentarzach do oryginalnego postu, trzeba (1) emulator terminala, który wspiera nawias wklej i (2) odpowiadające wsparcie dla cokolwiek działa w terminalu, to znaczy vim, bash, zsh. Emulatory terminali obsługujące wklejanie w nawiasach (lista do aktualizacji na podstawie komentarzy do tego postu):

  • xterm - od ??
  • gnome-terminal - od ??
  • putty - od 0,63 (data wydania 2013-08-06)

Aplikacje obsługujące tryb braketingu:

  • vim
  • zsh

Bo bashStéphaneChazelas przygotował skrypt powłoki, aby ułatwić wykrycie tego trybu i podjąć odpowiednie działania.

Bardziej szczegółowa odpowiedź - zapobiegająca odcięciu linii - jest niemożliwa do odpowiedzi bez wiedzy o programie unixowym, który działa po naciśnięciu przycisku wklej.

Menedżer schowka może co trzeba.

Otheus
źródło
Skrypt tam nie wykrywa wklejania w nawiasach, jest to skrypt perla, który emuluje trzecią formę wklejania w nawiasach, który nie wymaga wsparcia w aplikacji innej niż aplikacja musi rozumieć ^ V jako literę-następna (ten skrypt faktycznie odpowiedzieć na to pytanie, choć prawdopodobnie wymagałoby poprawy, to był po prostu PO).
Stéphane Chazelas,
@ StéphaneChazelas możesz edytować / ulepszać mój post. :) „Aplikacja musi rozumieć ^Vjako literal-next. Ale jak ^Vdostać się do strumienia wejściowego aplikacji?
Otheus
Dostaje się, jeśli wewnętrzne urządzenie tty nie jest w trybie icanon (jak np. Zachęta bashreadline ją zobaczy (i potraktuje jako dosłownie-następny)). W trybie icanon dyscyplina liniowa tego wewnętrznego urządzenia tty usunie go (pod warunkiem, że lnextpostać ^V), podobnie jak podczas ręcznego wpisywania Ctrl-V X.
Stéphane Chazelas
1
Jeśli nie używasz tego skryptu, nic nie wstawia, ^Vchyba że użyjesz quoted pastetrybu xterm (włączony przez wysyłanie \e[?2005h). Że perlskrypt może być dostosowany tak, że usuwa wszystkie, ale pierwsza linia w postaci pasty multi-line (choć nie wiarygodnie dla dużych past), ale jak już jest, ponieważ cytuje się przełamane dla readline (jak gdyby wciśnięty Ctrl V Ctrl-J), zapobiega wykonywaniu wierszy (są one po prostu dodawane do bufora edycji i nadal trzeba nacisnąć Enter, aby je wykonać).
Stéphane Chazelas,
4
Jaka druga odpowiedź?
Xiao