¿Por qué Terminal ingresa automáticamente mi comando después de pegar texto?

9

Esto sucede si uso ctrl + shift + v o pego desde el menú contextual.

¿Cómo hago para detener este comportamiento?

Alma perdida
fuente
Se requiere más explicación para entender su pregunta
SHW
Tal vez ConEmu en Windows haga lo que desee: cuando intente pegar algo que contenga nuevas líneas, le avisará antes de continuar. Es una especie de buen toque. ¿Quizás hay un emulador de terminal de Linux que tiene esta característica?
Brandin
44
Apuesto a que copia el "\ n" final (carácter de nueva línea, no verá en su texto pero está presente si tiene un salto de línea) cuando copie su texto, eso emulará una pulsación en la tecla ENTRAR, por lo tanto, ejecutará mando.
herbert
Posible duplicado de esto: unix.stackexchange.com/questions/202732/… No sabía acerca de la "pasta entre corchetes" mencionada en esa pregunta. Usualmente uso un editor de texto en combinación con el terminal y luego copio / pego cuidadosamente las partes que quiero en el terminal.
Brandin

Respuestas:

6

No copie varias líneas de texto para pegar. Casi puedo garantizar que simplemente está copiando la última parte de la línea. Si hace triple clic para copiar la línea de código que está pegando, obtendrá la nueva línea al final de la línea. Si quiere estar seguro, ese es realmente el problema, luego copie toda la línea, excepto la última letra / dígito, y vea si pegar eso también incluye una nueva línea.

GusanoAlimentos
fuente
Esto solo sucedió cuando copié varias líneas de código. Ahora entiendo por qué.
LostSoul
7

El texto que está pegando incluye una nueva línea final. Cuando pega una nueva línea, el shell que se ejecuta en el terminal lo ve presionando Enter, por lo que ejecuta el comando.

La operación de pegado es realizada por el emulador de terminal; pasa el texto pegado a la aplicación que se ejecuta en el terminal, de la misma manera que pasa el texto escrito por el usuario. Consulte ¿Cómo funcionan la entrada del teclado y la salida de texto? para obtener más información sobre cómo funciona la entrada. La aplicación (aquí, el shell) no tiene forma de distinguir entre las pulsaciones de teclas y una operación de pegar.

Muchos emuladores de terminal en estos días admiten pasta entre corchetes . En el modo de pegado entre corchetes, la aplicación puede distinguir una operación de pegado de las pulsaciones de teclas. La pasta entre corchetes solo es útil si la aplicación hace algo diferente con el texto pegado, por lo que se habilita al admitir aplicaciones, no es algo configurado por el usuario del emulador de terminal.

Zsh 5.1 (que salió hace unas semanas, por lo que aún no está disponible en la mayoría de las distribuciones) agrega soporte para el modo de pegado entre paréntesis. Cuando pega texto, simplemente se inserta en la línea de comando y puede editarlo antes de presionar Enterpara ejecutar la línea de comando.

Los usuarios de oh-my-zsh pueden usar el complemento safe-paste incluso en versiones anteriores de zsh.

Otra cosa que puede hacer en zsh es hacer que inserte la selección como una cadena, con comillas (en forma de barras invertidas antes de cada carácter especial de shell, como espacios en blanco). Escriba `xsel`para obtener la selección principal (selección automática del mouse), o `xsel -b`para obtener el contenido del portapapeles (texto copiado con Ctrl+ C), luego presione Tab.

Si tiene una versión anterior de zsh y desea insertar el contenido del portapapeles sin citar, puede definir una función que inserte la selección.

function zle_insert_x_selection {
  LBUFFER+=$(xsel ${NUMERIC+-b} -o </dev/null)
}
zle -N zle_insert_x_selection
bindkey '\e\C-v' zle_insert_x_selection

Con esto en su .zshrc, puede presionar Ctrl+ Alt+ Vpara insertar la selección principal, o Ctrl+ U Ctrl+ Alt+ Vpara insertar el contenido del portapapeles. Se insertan antes del cursor, sin cambios, excepto sin una nueva línea final. Vea Compartir el portapapeles entre bash y X11 para algo similar en bash.

Gilles 'SO- deja de ser malvado'
fuente
7

Si está utilizando bash como su shell, puede presionar Ctrl-X Ctrl-Epara que aparezca un editor (definido por $ VISUAL o $ EDITOR, por ejemplo, vio tal vez nano).

Luego puede pegar sus comandos exactamente como lo haría si estuviera editando un archivo. Se ejecutarán si guarda y sale. O cancelado si sale sin guardar.

cas
fuente
Este método no me funciona.
LostSoul
3

Para pegar varias líneas en el símbolo del sistema, abra comillas simples o dobles antes de pegar.

$ echo 'paste
...
... '

Luego puede presionar volver para repetirlo. Cuando hacia arriba, todas las líneas que pegó estarán en una línea editable.

Esto funciona siempre que no haya una sola cita en el texto que pegue.

Peter Cordes
fuente
1

En una ventana del editor de texto, use los siguientes atajos para copiar texto sin \ n (el avance de línea):

  • Shift+ Home, Ctrl+ Insert- copia parte de la línea antes del cursor.
  • Shift+ End, Ctrl+ Insert- copia parte de la línea después del cursor.
  • Home, Shift+ End, Ctrl+ Insert: Copia toda la línea sin \ n.

En una ventana del navegador, u otra cosa donde el texto no sea editable, use una de dos técnicas:

  • Copie primero a un editor de texto (preferido, ya que le da la oportunidad de editar comandos).
  • Seleccione solo el texto en la línea (sin extender la zona de selección hacia la derecha más allá del último carácter), luego Ctrl+ Inserty péguelo en una ventana de terminal.

Cómo se ve una selección correcta (sin \ n):

ls -al

Cómo se ve una selección incorrecta (con \ n):

ls -al
Incnis Mrsi
fuente