Wyłącz domyślne zachowanie Kopiuj i Wklej w Bash

9

Po wklejeniu do sesji terminalowej powłoka natychmiast wykonuje polecenie bez naciskania klawisza Enter.

Naprawdę nie wiem, jak wyłączyć to zachowanie.

Korzystam z preinstalowanego terminala w systemie MacOS Yosemite.

Opaldes
źródło
9
Robi to oczywiście tylko wtedy, gdy bufor wklejania zawiera nowy wiersz. Nie ma (prawie) nic wspólnego z bash. (Dotyczy bash tylko wtedy, gdy korzysta z biblioteki readline.)
Peter - Przywróć Monikę
... a jednak bash(z pomocą readline) ma poprawkę.
Alexis

Odpowiedzi:

16

W wersji bash4.4 lub nowszej oraz w terminalach obsługujących wklejanie w nawiasach kwadratowych xtermmożesz:

bind 'set enable-bracketed-paste'

(lub dodaj set enable-bracketed-pastedo swojego ~/.inputrc)

Spowoduje to, że bufor zachęty do kopiowania i wklejania zostanie wstawiony w wierszu zamiast znaków w nim interpretowanych tak, jakby zostały wpisane (nadal możesz mieć problemy, jeśli bufor zawiera takie znaki ^C, ^Za emulator terminala ich nie odfiltruje) .

zsh robi to domyślnie od wersji 5.1.

W przypadku innych powłok lub terminali zobacz także: Jak uchronić się przed tego rodzaju nadużyciami schowka?

Stéphane Chazelas
źródło
Przyjrzę
sposoby na stoisku nie działają
Opaldes
@Opaldes, co próbowałeś? Z jaką wersją jakiej powłoki i na jakich terminalach? Wierzę, że OS / X również jest dostarczany xterm, możesz spróbować zamiast tego. Czy wypróbowałeś perlskrypt na powiązane pytanie?
Stéphane Chazelas,
1
@Opaldes, zgodnie z wklejaniem kodu do okna terminala w vimie w Mac OS X Terminal OS / X obsługuje wklejanie w nawiasach od OS / X Lion. Wydaje się, że wszystko, czego potrzebujesz, to dość aktualna wersja Zsh lub Bash. W starszych wersjach zsh można to również osiągnąć przez konfigurację.
Stéphane Chazelas,
1
Możemy podziękować Danielowi Colascione za dodanie tej użytecznej funkcji do Bash / Readline
Anthony Geoghegan
6

Dzieje się tak, gdy wklejasz znak „nowej linii”. Na przykład, jeśli wklejasz wiele wierszy lub nieświadomie skopiujesz znak powrotu karetki na końcu wiersza. AFAIK nie ma sposobu, aby faktycznie wyłączyć to zachowanie, ale istnieją sposoby na jego złagodzenie.

Najłatwiej jest po prostu skopiować jedną linię na raz i pominąć ostatni znak, ręcznie dodając go później.

Lub, jak wskazano poniżej, możesz wkleić go do edytora, który wyświetla znaki niedrukowane, i wybrać ponownie bez nowej linii.

Istnieje jeden lub dwa obejścia dla dystrybucji GNU / Linux, ale nie ma pojęcia, czy można przenieść tę koncepcję na MacOS. Niezależnie od tego, spójrz tutaj i sprawdź, czy istnieje podobny plik w systemie Mac, który możesz zmienić. Niestety w to wątpię.

I_GNU_it_all_along
źródło
Po prostu wklejam go do edytora, który wyświetla znaki niedrukowane, a następnie ponownie
wybieram
Dobra sugestia, zredagowana w celu uwzględnienia.
I_GNU_it_all_along
dobrze wiedzieć, że to wyjaśnia, że ​​nie zdarza się to cały czas. Poparłem twoją odpowiedź, ale jest to dla mnie rozwiązanie.
Opaldes,
Jest to uciążliwe, ale może być przydatne podczas kopiowania serii poleceń.
I_GNU_it_all_along
Moje „rozwiązanie” jest również rodzajem obejścia włamania, ale jest szybsze niż wybieranie osobno IMO.
Peter Cordes,
5

Przed wklejeniem wpisz pojedynczy cudzysłów , a następnie wklej. Control-C i strzałka w górę, aby edytować go jako jedną gigantyczną linię.

podwójne cudzysłowy również działają, w przypadku gdy tekst zawiera pojedyncze, ale nie podwójne cudzysłowy. Jest ok, jeśli zawiera $lub inne elementy, które rozszerzają się w podwójnych cudzysłowach, ponieważ tak naprawdę nie uruchamiasz cytowanej linii gigantycznej jako jednego polecenia.


Nie możesz edytować całej rzeczy od razu, ponieważ nowe wiersze zaczynają monit o kontynuację (nie oficjalną terminologię) zamiast tworzyć jedną dużą długą linię.

biorąc pod uwagę te 4 wiersze:

echo
ls
foo
bar

wklejenie, jak sugeruję, spowoduje to wyświetlenie na ekranie:

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

Następnie możesz nacisnąć Control-C i strzałkę w górę. (Ctrl-C niszczy wszystko w tym samym wierszu co kursor, więc najpierw naciśnij Return, jeśli jest tam przydatny tekst.)

Alternatywą jest zamknięcie oferty i naciśnięcie klawisza Return, a następnie strzałka w górę.

W każdym razie po strzałce w górę

$ 'echo
ls
foo
bar

control-a i usuń wiodące '. Użyj klawiszy Control-Left i Control-Right, aby szybko poruszać się po bloku wklejania (słowami). Lub jeśli twoja konfiguracja terminala nie obsługuje klawiszy strzałek kontrolnych, alt-b i alt-f.


Dosłowne nowe wiersze faktycznie oddzielają polecenia, a te 4 wiersze przejdą do historii poleceń osobno . Możesz zmienić je na ;lub &&. (Nie wiem, jak to zrobić, po prostu użyj powtarzania klawiszy dla słowa do przodu lub do tyłu, aby szybko się tam dostać i zrobić to ręcznie).

Peter Cordes
źródło
2

Dzieje się tak, ponieważ wklejanie kończy się znakiem nowej linii, a emulatory terminali w zasadzie zasilają wklej, aby rozbić znak po znaku. W tym procesie bash tak naprawdę nie zna maszynistki z maszyny.

Zwykle zwracam szczególną uwagę podczas kopiowania i wklejania, aby nie zawierała nowego wiersza, ale jest jedna sztuczka, którą możesz wypróbować: przed wklejeniem, w bash, wpisz C-x C-e. Powinien zostać uruchomiony $EDITORz pustym plikiem. Cokolwiek zapiszesz w tym pliku i wyjdziesz, bash się uruchomi. Możesz teraz wkleić swoje polecenie do edytora, ewentualnie manipulować rzeczami, a następnie uruchomić je wszystkie za jednym razem.

nperson325681
źródło
-1

NIE jestem związany z firmą, jestem bardzo zadowolonym klientem. Wypróbuj ten program terminalowy: http://www.emtec.com/zoc/index.html . Dostępna jest również wersja dla komputerów Mac.

Jeśli z tą odpowiedzią naruszę dowolną zasadę SE, proszę dać mi znać i usuwam odpowiedź.

Edytować:

Kiedy poprawnie zrozumiałem inne odpowiedzi, ten problem może być spowodowany przez program terminalowy. Program terminalowy ZOC to profesjonalne oprogramowanie, które jest doskonale zaprojektowane do pracy. Wkleja wybrany tekst bez dodatkowego znaku. Możesz zarejestrować swoje sesje w osobnym pliku tekstowym. I wiele więcej

Aktualizacja:

Program terminalowy ma opcję Paste without final 'newline'. To może pomóc.

Peter VARGA
źródło
3
Proszę przynajmniej powiedzieć, w jaki sposób odpowiada na pytanie
Stéphane Chazelas,
Co się stanie, jeśli wkleisz ciąg znaków zawierający znak nowej linii lub znak powrotu karetki po znaku zachęty działającej w tym terminalu? Jeśli to nie powoduje, że powłoka natychmiast wykonuje polecenia (jak tutaj pytano), jak to robi? Czy usuwa te postacie z zaznaczenia? Czy wstawia znak ^ V przed ucieczką przed uderzeniem?
Stéphane Chazelas,
2
W związku z tym wygląda bardziej jak spam (choć jestem pewien, że to nie był twój zamiar spamowania tej witryny). Nie odpowiada na pytanie i jest jedynie reklamą powiązanego produktu komercyjnego.
Stéphane Chazelas,
2
@AlBundy, dowiedz się, czy twój ulubiony klient terminalowy rozwiązuje ten problem, wypróbowując exploity omówione w security.stackexchange.com/q/39118 (wspomniane w odpowiedzi Stephane'a) oraz linki, które tam znajdziesz. Jeśli to cię chroni, masz dobre podstawy, aby ją polecić (w odpowiedzi podaj szczegóły swoich testów).
Alexis
Zwykle problem polega na tym, że to, co wybrałeś , zawiera nową linię. W jaki sposób „wkleja wybrany tekst” różni się od normalnego zachowania jakiegokolwiek innego emulatora terminala?
Peter Cordes