Cosa causa talvolta l'esecuzione di un comando di copia / incolla nel terminale?


24

Quando si incolla un comando nel terminale, a volte eseguirà automaticamente il comando (proprio come se fosse stato premuto il tasto "Invio"), a volte no.

Uso Linux da secoli, ho incollato migliaia di comandi in varie console su molte distribuzioni e non sono ancora in grado di dire se il comando che sto per incollare verrà eseguito automaticamente o meno.

Cosa scatena questo comportamento?


5
Se vuoi evitare di preoccuparti di questo, digita { (w / spazio) prima di incollare, quindi termina con }. Non ha alcun effetto sul funzionamento dei comandi incollati, ma impedisce alla shell di eseguirlo fino alla chiusura del blocco. Descritto qui [ gnu.org/software/bash/manual/html_node/Command-Grouping.html]
loa_in_

Risposte:


37

È il carattere di ritorno nel testo che stai copiando che sta innescando l'esecuzione automatica.

Facciamo un esempio diverso, copiamo queste righe tutte in una volta e incolliamole nel tuo terminale:

echo "Hello";
echo "World";

Se guardi nel tuo terminale, non vedrai questo:

$ echo "Hello";
echo "World";

Vedrai questo (potrebbe anche esserci una riga che dice World):

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

Invece di attendere che tutti gli input vengano incollati, la prima riga viene eseguita (e per lo stesso motivo, anche la seconda riga può farlo o meno). Questo perché c'è un RETURNcarattere tra le due linee.

Quando premi il ENTERtasto sulla tastiera, tutto ciò che stai facendo è inviare il carattere con il valore ASCII di 13. Quel personaggio viene rilevato immediatamente dal tuo terminale e sa che ha istruzioni speciali per eseguire ciò che hai digitato finora.

Se memorizzato sul tuo computer o stampato sullo schermo, il RETURNpersonaggio è proprio come qualsiasi altra lettera dell'alfabeto, numero o simbolo. Questo personaggio può essere cancellato con backspace o copiato negli appunti proprio come qualsiasi altro personaggio normale.

L'unica differenza è che, quando il tuo browser vede il personaggio, sa che invece di stampare un personaggio visibile, dovrebbe trattarlo in modo diverso e ha istruzioni speciali per spostare il prossimo set di testo sulla riga successiva. Il RETURNpersonaggio e il SPACEpersonaggio (ascii 32), insieme ad alcuni altri caratteri usati raramente, sono noti come "caratteri non stampabili" per questo motivo.

A volte quando si copia il testo da un sito Web, è difficile copiare solo il testo e non il ritorno alla fine (e spesso è reso più difficile dallo stile sulla pagina).


Tempo dell'esperimento!

Di seguito troverai due comandi che illustreranno il problema e su cui puoi "esercitarti". Avvia il cursore subito prima echoe trascina fino a quando l'evidenziazione si trova proprio prima della freccia:

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

E ora prova il secondo comando. Avvia il cursore subito prima echoe trascina verso il basso fino a quando il cursore si trova sulla seconda riga, ma si trova proprio davanti alla <-freccia. Copialo, quindi incollalo nel tuo terminale:

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

A seconda del browser, potrebbe non essere nemmeno visibile che il testo selezionato sia passato su due righe. Ma quando lo incolli nel terminale, scoprirai che esegue la linea, perché ha trovato un RETURNcarattere nel testo copiato.


5
Per ridurre la complessità, ho completamente ignorato menzionando che Windows utilizza due chiavi diverse per i resi. Sappi solo che è un dolore e una lotta quotidiani che dobbiamo affrontare.
IQAndreas,

lo spazio è un personaggio tipografico
mikeserv il

1
Forse. Tuttavia, quando provo un incolla da Firefox in una shell (con stty impostato su "raw"), le linee terminano con nuove righe, non con ritorno a capo.
Thomas Dickey,

1
Non è necessario passare alla riga successiva, se si seleziona e si passa oltre il punto e virgola una quantità sufficiente (2-3 caratteri), selezionerà l'intera riga, il che significa che è stata rilevata una nuova riga.

@ThomasDickey Sei su Windows o su un sistema basato su Unix?
IQAndreas,

10

Quando selezioni il testo, se ti capita di includere la nuova riga (invisibile) alla fine di una riga, sarà nel testo incollato. Ciò è coerente con tutti gli emulatori terminali che conosco. La newline fa quello che stai chiamando "validate".

Su alcuni sistemi (come quelli che utilizzano terminali sincroni come IBM 3270), la Enterchiave "convalida" lo schermo copiando tutte le modifiche all'host.



2

Cosa scatena questo comportamento?

Il personaggio newline.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.