¿Por qué la Terminal ingresa automáticamente mi command después de pegar el text?

Esto sucede si utilizo ctrl + shift + v o pego desde el menu del button derecho.

¿Cómo detengo este comportamiento?

No copie varias líneas de text para pegar. Casi puedo garantizarte que estás simplemente copyndo la última parte de la línea. Si haces clic triple para copyr esa línea de código que estás pegando, estás obteniendo la nueva línea al final de la línea. Si quiere estar seguro, ese es realmente el problema, copie toda la línea, a exception de la última letra / dígito, y vea si pegando eso también incluye una nueva línea.

El text que está pegando incluye una nueva línea final. Cuando pega una línea nueva, el shell que se ejecuta en el terminal lo ve al presionar Enter , por lo que ejecuta el command.

La operación de pegado la realiza el emulador de terminal; pasa el text pegado a la aplicación que se ejecuta en el terminal, de la misma manera que pasa el text escrito por el usuario. Consulte ¿Cómo funcionan la input de keyboard y la salida de text? para get más información sobre cómo funciona la input. La aplicación (aquí, el shell) no tiene forma de distinguir entre pulsaciones de teclas y una operación de pegado.

Muchos emuladores de terminal en estos días soportan la pasta entre corchetes . En el modo de pegado entre corchetes, la aplicación puede distinguir una operación de pegar de las pulsaciones de teclas. La palabra entre corchetes solo es útil si la aplicación hace algo diferente con el text pegado, por lo que está habilitada por aplicaciones compatibles, no es algo que haya sido configurado por el usuario del emulador de terminal.

Zsh 5.1 (que salió hace unas semanas, por lo que no está disponible todavía en la mayoría de las distribuciones) agrega soporte para el modo de pegado entre corchetes. Cuando pega text, simplemente se inserta en la línea de command, y puede editarlo antes de presionar Enter para ejecutar la línea de command.

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 diagonales inversas antes de cada carácter especial del shell, como el espacio en blanco). Escriba `xsel` para get la selección principal (selección automática del mouse), `xsel -b` para get el contenido del portapapeles (text copydo con Ctrl + C ), luego presione Tab .

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

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

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

Para hacer un pegado multilínea en un símbolo del sistema, abra comillas simples o dobles antes de pegar.

$ echo ' pegar

'

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

Esto funciona siempre que no haya una sola comilla en el text que pegue.

Si usa bash como shell, puede presionar Ctrl-X Ctrl-E para abrir un editor (definido por $ VISUAL o $ EDITOR, por ejemplo, vi o quizás nano ).

Luego puede pegar sus commands exactamente como lo haría si estuviera editando un file. Se ejecutarán si guardas y sales. O cancelado si sale sin save.

En una window del editor de text, use los siguientes atajos para copyr text sin \ n (el avance de línea):

  • Mayús + Inicio , Ctrl + Insertar – copy parte de la línea antes del cursor.
  • Mayús + Fin , Ctrl + Insertar – copy parte de la línea después del cursor.
  • Inicio , Mayús + Fin , Ctrl + Insertar – copy toda la línea sin \ n.

En una window del browser, u otra cosa donde el text no es editable, use una de estas dos técnicas:

  • Primero copie a un editor de text (preferido, ya que le da la oportunidad de editar commands).
  • Seleccione solo el text en la línea (sin extender la zona de selección hacia la derecha más allá del último carácter), luego presione Ctrl + Insertar y pegue en una window 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