¿Qué causa que una copia / pegue en la terminal a veces ejecute el comando?

24

Cuando pega algún comando en la terminal, a veces se ejecutará automáticamente el comando (al igual que si se presiona la tecla "Enter"), a veces no.

He estado usando Linux durante años, pegué miles de comandos en varias consolas en muchas distribuciones, y todavía no puedo decir si el comando que estoy a punto de pegar se ejecutará automáticamente o no.

¿Qué desencadena este comportamiento?

kursus
fuente
55
Si desea evitar preocuparse por esto, escriba { (w / space) antes de pegar, luego termine con }. No tiene ningún efecto sobre el funcionamiento de los comandos pegados, pero evita que Shell lo ejecute hasta que cierre el bloque. Descrito aquí [ gnu.org/software/bash/manual/html_node/Command-Grouping.html]
loa_in_

Respuestas:

37

Es el carácter de retorno en el texto que está copiando lo que desencadena la ejecución automática.

Tomemos un ejemplo diferente, copie todas estas líneas de una vez y péguelas en su terminal:

echo "Hello";
echo "World";

Si mira en su terminal, no verá esto:

$ echo "Hello";
echo "World";

Verá esto (también puede haber una línea que diga World):

$ echo "Hello";
Hello
$ echo "World";

En lugar de esperar a que se pegue toda la entrada, se ejecuta la primera línea (y por la misma razón, la segunda línea puede o no hacerlo también). Esto se debe a que hay un RETURNcarácter entre las dos líneas.

Cuando presiona la ENTERtecla en su teclado, todo lo que está haciendo es enviar el carácter con el valor ASCII de 13. Su terminal detecta ese carácter inmediatamente y sabe que tiene instrucciones especiales para ejecutar lo que ha escrito hasta ahora.

Cuando se almacena en su computadora o se imprime en su pantalla, el RETURNcarácter es como cualquier otra letra del alfabeto, número o símbolo. Este personaje puede eliminarse con retroceso o copiarse al portapapeles como cualquier otro personaje normal.

La única diferencia es que, cuando su navegador ve el carácter, sabe que en lugar de imprimir un carácter visible, debe tratarlo de manera diferente y tiene instrucciones especiales para mover el siguiente conjunto de texto a la siguiente línea. El RETURNcarácter y el SPACEcarácter (ascii 32), junto con algunos otros caracteres rara vez utilizados, se conocen como "caracteres no impresos" por este motivo.

A veces, cuando copia texto de un sitio web, es difícil copiar solo el texto y no la devolución al final (y el estilo de la página a menudo lo dificulta).


¡Experimente el tiempo!

A continuación encontrará dos comandos que ilustrarán el problema y en los que puede "practicar". Inicie el cursor justo antes echoy arrastre hasta que el resaltado esté justo antes de la flecha:

echo "Wait for my signal...";<- End cursor here right after the semicolon

Y ahora prueba el segundo comando. Inicie el cursor justo antes echoy arrastre hacia abajo hasta que el cursor esté en la segunda línea, pero esté justo delante de la <-flecha. Cópielo y luego péguelo en su terminal:

echo 'Go go go!';
<- End cursor here right before the arrow

Dependiendo de su navegador, es posible que ni siquiera sea visible que el texto que seleccionó haya pasado por dos líneas. Pero cuando lo pegue en el terminal, encontrará que ejecuta la línea, porque encontró un RETURNcarácter en el texto copiado.

IQAndreas
fuente
55
Para reducir la complejidad, ignoré completamente mencionar que Windows usa dos claves diferentes para las devoluciones. Solo sé que es un problema y una lucha diaria con la que tenemos que lidiar.
IQAndreas
el espacio es un personaje de impresión
mikeserv
1
Quizás. Sin embargo, cuando pruebo una pasta de Firefox en un shell (con stty establecido en "raw"), las líneas terminan con nuevas líneas, no con retorno de carro.
Thomas Dickey
1
No necesita pasar a la siguiente línea; si selecciona y pasa del punto y coma una cantidad suficiente (2-3 caracteres), seleccionará toda la fila, lo que significa que se encontró una nueva línea.
@ThomasDickey ¿Estás en Windows o en un sistema basado en Unix?
IQAndreas
10

Cuando selecciona texto, si incluye la nueva línea (invisible) al final de una línea, estará en el texto pegado. Eso es consistente en todos los emuladores de terminal que conozco. La nueva línea hace lo que está llamando "validar".

En algunos sistemas (como los que utilizan terminales sincrónicos como el IBM 3270), la Enterclave "validaría" la pantalla copiando todos los cambios en el host.

Thomas Dickey
fuente
2

¿Qué desencadena este comportamiento?

El personaje de nueva línea.

PSkocik
fuente