предотвратить многострочную вставку в bash

10

Я часто использую, ctrl+cчтобы скопировать текст из некоторого графического приложения, а затем вставить его в мой эмулятор терминала (терминатор), используя правую кнопку мыши и щелкнуть меню и вставить. Иногда я забываю, что буфер обмена содержит несколько строк, которые при вставке в bash заставляют каждую строку «исполняться»

Есть какое-то решение, чтобы полностью предотвратить многострочную вставку?

Мартин Вегтер
источник
сначала вставьте его в блокнот, чтобы увидеть, что у вас есть, затем, если все в порядке, вставьте его в свое приложение
Skaperen
1
в bash запустите команду, sleep 999999затем выполните вставку, если она выглядит нормально. команда sleep не читает строки и они сбрасываются при нажатии ctrl+c.
Skaperen
2
Соответствующий: security.stackexchange.com/q/39118
Стефан Шазелас
1
@Otheus, printf '\e[?2004h'в большинстве xterm-подобных эмуляторов терминала включен режим вставки в скобках, когда терминал заключает в скобки вставленный текст, чтобы приложения могли определить, где начинается вставка и где она заканчивается. xterm также поддерживает другой режим, в \e[?2005hкотором все вставляемые символы имеют префикс ^V(понимается многими приложениями и дисциплиной tty line как litteral-next).
Стефан Шазелас

Ответы:

5

Этот ответ не является самым специфичным для вопроса пользователя. Пожалуйста, смотрите мой второй ответ. Я оставляю это здесь, потому что это решает более общую проблему.

За комментарии к исходному сообщению, вам нужно (1) эмулятор терминала , который поддерживает в квадратные скобки вставить и (2) , соответствующая поддержка независимо работает в терминале, то есть vim, bash, zsh. Эмуляторы терминала, поддерживающие вставку в скобках (список будет обновляться на основе комментариев к этому сообщению):

  • xterm - поскольку ??
  • gnome-terminal - поскольку ??
  • putty - с 0.63 (дата выпуска 2013-08-06)

Приложения, поддерживающие режим в скобках:

  • vim
  • zsh

Для bashэтого StéphaneChazelas собрал сценарий оболочки, чтобы облегчить обнаружение этого режима и предпринять соответствующие действия.

Более конкретный ответ - предотвращение обрезания строк - без ответа, не зная о программе unix, которая запускается при нажатии клавиши paste.

Менеджер буфера обмена , может быть , что вам нужно.

Otheus
источник
Сценарий там не обнаруживает вставку в скобках, это скрипт на Perl, который эмулирует третью форму вставки в скобках, которая не требует поддержки в приложении, кроме того, что приложение должно понимать ^ V как litteral-next (этот сценарий будет на самом деле ответьте на этот вопрос, хотя, вероятно, потребуется улучшить, это был просто PoC).
Стефан Шазелас
@ StéphaneChazelas не стесняйтесь редактировать / улучшать мой пост. :) «Приложение нужно понимать ^Vкак literal-next. Но как ^Vпопадает во входной поток приложения?
Отей
Он получает это, если внутреннее устройство tty не находится в режиме icanon (как bashподсказка readline увидит это (и будет обрабатывать как literal-next)). Если в режиме icanon, линейная дисциплина этого внутреннего tty-устройства лишит его (до тех пор, пока lnextсимвол ^V), так же, как когда вы нажимаете Ctrl-V X вручную.
Стефан Шазелас
1
Если этот скрипт не используется, ничего не вставляется, ^Vесли вы не используете quoted pasteрежим xterm (включается при отправке \e[?2005h). Этот perlсценарий можно адаптировать так, чтобы он удалял все, кроме первой строки в многострочном вставке (хотя не всегда надежно для больших вставок), но так, как он есть, поскольку он цитирует новую строку для readline (как если бы вы нажали Ctrl- V Ctrl-J), он предотвращает выполнение строк (они просто добавляются в буфер редактирования, и вам все равно нужно нажать Enter, чтобы выполнить их).
Стефан Шазелас
4
Какой второй ответ?
Сяо