Deshabilite el comportamiento predeterminado de copiar y pegar en Bash

9

Cuando pego en mi sesión de terminal, el shell ejecuta inmediatamente el comando sin que presione la tecla Intro.

Realmente no sé cómo deshabilitar ese comportamiento.

Estoy usando el terminal preinstalado en MacOS Yosemite.

Opaldes
fuente
99
Solo hace eso, por supuesto, si el búfer de pasta contiene una nueva línea. Esto no tiene (casi) nada que ver con bash. (Se trata de bash solo si y en la medida en que usa la biblioteca readline.)
Peter - Restablece a Monica el
... y sin embargo bash(con la ayuda de readline) tiene una solución.
alexis

Respuestas:

16

Con bash4.4 o más reciente y en terminales que admiten pegado entre paréntesis xterm, puede hacer:

bind 'set enable-bracketed-paste'

(o agregar set enable-bracketed-pastea su ~/.inputrc)

Eso hará que el búfer de copiar y pegar se inserte en el indicador en lugar de que los caracteres se interpreten como si estuvieran escritos (aún podría tener problemas si ese búfer contiene caracteres como ^C, ^Zy su emulador de terminal no los filtra) .

zsh lo hace por defecto desde la versión 5.1.

Para otros shells o terminales, vea también: ¿Cómo puedo protegerme de este tipo de abuso del portapapeles?

Stéphane Chazelas
fuente
Lo investigaré bien
Opaldes
las formas de cabina no parecen funcionar
Opaldes
@Opaldes, ¿qué intentaste? ¿Con qué versión de qué shell y en qué terminales? Creo que OS / X también viene con xterm, puedes probar eso en su lugar. ¿Has probado el perlscript en la pregunta vinculada?
Stéphane Chazelas
1
@Opaldes, de acuerdo con Pegar código en la ventana de terminal en vim en Mac OS X OS / X Terminal admite pegado entre corchetes desde OS / X Lion. Por lo tanto, parece que todo lo que necesita es una versión lo suficientemente reciente de zsh o bash. Con versiones anteriores de zsh, eso también se puede lograr a través de la configuración.
Stéphane Chazelas
1
Podemos agradecer a Daniel Colascione por agregar esta útil característica a Bash / Readline: gnu-bash.2382.n7.nabble.com/…
Anthony Geoghegan
6

Esto sucede cuando pega un carácter de "nueva línea". Por ejemplo, si está pegando varias líneas o copia un retorno de carro al final de la línea. AFAIK no hay forma de desactivar este comportamiento, pero hay formas de mitigarlo.

La forma más fácil es simplemente copiar una línea a la vez y omitir el último carácter, luego agregarlo manualmente.

O, como señala the_velour_fog a continuación, también puede pegarlo en un editor que muestre caracteres no impresos y volver a seleccionar sin la nueva línea.

Hay una o dos soluciones alternativas para las distribuciones de GNU / Linux, pero no tengo idea de si el concepto podría transferirse a MacOS. De todos modos, eche un vistazo aquí y vea si hay un archivo similar en Mac que pueda modificar. Lamentablemente lo dudo.

I_GNU_it_all_along
fuente
Simplemente lo pego en un editor que muestra caracteres no impresos, luego lo
vuelvo a
Buena sugerencia, editada para incluir.
I_GNU_it_all_along
Es bueno saber que eso explica que no sucede todo el tiempo. Voté su respuesta pero es más una solución como una solución para mí.
Opaldes
Es una molestia, pero puede ser útil al copiar una serie de comandos.
I_GNU_it_all_along
Mi "solución" también es una especie de solución alternativa, pero es más rápido que seleccionar por separado, IMO.
Peter Cordes
5

Antes de pegar, escriba una comilla simple , luego pegue. control-c y flecha arriba para editarlo como una línea gigante.

las comillas dobles también funcionan, en caso de que el texto contenga comillas simples pero no dobles. Está bien si contiene $u otras cosas que se expanden dentro de comillas dobles, porque en realidad no está ejecutando la línea gigante citada como un comando.


En realidad, no puede editar todo aquí, porque las nuevas líneas comienzan un mensaje de continuación (no la terminología oficial) en lugar de hacer una gran línea larga.

dadas estas 4 líneas:

echo
ls
foo
bar

pegar como sugiero dará como resultado esto en su pantalla:

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

Luego puede presionar control-C y flecha arriba. (control-C destruye todo en la misma línea que el cursor, por lo tanto, presione la tecla de retorno primero si hay texto útil allí).

Una alternativa es cerrar la cotización y presionar regresar, luego hacia arriba.

De todos modos, después de la flecha hacia arriba

$ 'echo
ls
foo
bar

control-a y eliminar el líder '. Use control-left y control-right para moverse rápidamente a través del bloque de pegar (por palabras). O si la configuración de su terminal no admite las teclas de control-flecha, alt-b y alt-f.


Las nuevas líneas literales en realidad separan comandos, y estas 4 líneas irán a su historial de comandos por separado . Es posible que desee cambiarlos a ;o &&. (No conozco un truco para eso, solo use la repetición de teclas para avanzar o retroceder palabras para llegar rápidamente y hacerlo manualmente).

Peter Cordes
fuente
2

Esto sucede porque su pegado termina con una nueva línea, y los emuladores de terminal básicamente alimentan el pegado para golpear carácter por carácter. En este proceso, bash no conoce a la mecanógrafa humana de una máquina realmente.

Por lo general, solo presto especial atención al copiar y pegar que no incluye una nueva línea, pero hay un truco que puedes probar: antes de pegar, en bash, escribe C-x C-e. Debería iniciarse $EDITORcon un archivo vacío. Lo que guarde en ese archivo y salga, bash se ejecutará. Por lo tanto, ahora puede pegar su comando en el editor, posiblemente manipular más las cosas y luego ejecutarlas todas de una vez.

nperson325681
fuente
-1

NO estoy relacionado con la empresa, soy un cliente muy satisfecho. Pruebe este programa de terminal: http://www.emtec.com/zoc/index.html . También hay una versión para Mac disponible.

Si no cumplo con esta respuesta alguna regla SE, avíseme y elimino la respuesta.

Editar:

Cuando entendí las otras respuestas correctamente, este problema puede ser causado por el programa del terminal. El programa de terminal ZOC es un software profesional que está perfectamente diseñado para el trabajo. Pega el texto que seleccionó sin ningún carácter adicional. Puede registrar sus sesiones en un archivo de texto separado. Y mucho mas

Actualizar:

El programa terminal tiene una opción Paste without final 'newline'. Puede ser esto ayuda.

Peter VARGA
fuente
3
Por favor, al menos diga cómo responde la pregunta
Stéphane Chazelas
Si pega una cadena que contiene caracteres de nueva línea o de retorno de carro en el indicador de un shell que se ejecuta en ese terminal, ¿qué sucede? Si no hace que el shell ejecute los comandos directamente (como se le preguntó aquí), ¿cómo lo hace? ¿Elimina esos caracteres de la selección? ¿Inserta un carácter ^ V antes para escapar de bash?
Stéphane Chazelas
2
Como tal, se parece más al spam (aunque estoy seguro de que no fue su intención enviar spam a este sitio). No responde la pregunta y es solo publicidad de un producto comercial relacionado.
Stéphane Chazelas
2
@AlBundy, averigüe si su cliente de terminal favorito resuelve este problema probando los exploits discutidos en security.stackexchange.com/q/39118 (mencionado en la respuesta de Stephane), y los enlaces que encontrará allí. Si lo protege, tiene buenas razones para recomendarlo (proporcione los detalles de sus pruebas en su respuesta).
alexis
Por lo general, el problema es que lo que haya seleccionado hace incluir una nueva línea. ¿En qué se diferencia "pega el texto que seleccionó" del comportamiento normal de cualquier otro emulador de terminal?
Peter Cordes