evitar la pasta de varias líneas en bash

10

A menudo uso ctrl+cpara copiar texto de alguna aplicación de interfaz gráfica de usuario y luego pegarlo en mi emulador de terminal (terminador), usando el botón derecho del mouse y pegar. A veces olvido que el portapapeles contiene varias líneas, que cuando se pega en bash hace que cada línea se "ejecute"

¿Hay alguna solución para evitar la pasta de varias líneas por completo?

Martin Vegter
fuente
pegue primero en el bloc de notas, para ver lo que tiene, luego, si está bien, continúe
pegándolo
1
en bash ejecuta el comando y sleep 999999luego pega si se ve bien. el comando de suspensión no lee las líneas y se descartan cuando presiona ctrl+c.
Skaperen
2
Relevante: security.stackexchange.com/q/39118
Stéphane Chazelas
1
@Otheus, printf '\e[?2004h'en la mayoría de los emuladores de terminal similares a xterm, se habilita un modo de pegado entre corchetes donde el terminal pone entre corchetes el texto pegado para que las aplicaciones puedan detectar dónde comienza y dónde termina el pegado. xterm también admite otro modo \e[?2005hen el que todos los caracteres pegados tienen el prefijo ^V(entendido por muchas aplicaciones y la disciplina de línea tty como litteral-next).
Stéphane Chazelas

Respuestas:

5

Esta respuesta no es la más específica para la pregunta del usuario. Vea mi segunda respuesta. Dejo esto aquí porque aborda el problema más general .

Por los comentarios a su puesto original, es necesario (1) un emulador de terminal que soporta corchetes pegar y (2) correspondiente soporte para lo que se está ejecutando en el terminal, es decir, vim, bash, zsh. Emuladores de terminal que admiten pegado entre corchetes (la lista se actualizará en función de los comentarios a esta publicación):

  • xterm - ya que ??
  • gnome-terminal - ya que ??
  • putty - desde 0.63 (fecha de lanzamiento 2013-08-06)

Aplicaciones que admiten el modo entre corchetes:

  • vim
  • zsh

Para bash, StéphaneChazelas ha creado un script de shell para facilitar la detección de ese modo y tomar las medidas adecuadas.

Una respuesta más específica, evitar que las líneas se corten, no tiene respuesta sin conocer el programa de Unix que se está ejecutando cuando presiona pegar.

Un administrador de portapapeles tal vez lo que necesita.

Oteo
fuente
El script allí no detecta la pasta entre corchetes, es un script perl que emula una tercera forma de pasta entre corchetes que no requiere soporte en la aplicación, aparte de que la aplicación necesita entender ^ V como literalmente siguiente (ese script lo haría En realidad, conteste esta pregunta, aunque probablemente necesite mejorar, era solo un PoC).
Stéphane Chazelas
@ StéphaneChazelas no dude en editar / mejorar mi publicación. :) "La aplicación necesita entender ^Vcomo literal-next. Pero, ¿cómo ^Ventra en el flujo de entrada de la aplicación?
Oteo
Lo obtiene si el dispositivo tty interno no está en modo icanon (como bashlo verá el mensaje de readline (y lo tratará como el siguiente literal)). Si está en modo icanon, la disciplina de línea de ese dispositivo tty interno lo despojará (siempre que el lnextcarácter lo sea ^V), al igual que cuando escribe Ctrl-V X manualmente ..
Stéphane Chazelas
1
Si no usa ese script, nada se inserta a ^Vmenos que use el quoted pastemodo xterm (habilitado mediante el envío \e[?2005h). Esa perlsecuencia de comandos podría adaptarse para que elimine todo excepto la primera línea en una pasta de varias líneas (aunque no de manera confiable para pastas grandes), pero como ya es, ya que cita la nueva línea para readline (como si hubiera presionado Ctrl- V Ctrl-J), evita que las líneas se ejecuten (solo se agregan al búfer de edición y aún debe presionar Enter para ejecutarlas).
Stéphane Chazelas
44
¿Qué segunda respuesta?
Xiao