Disattiva il comportamento predefinito Copia e incolla in Bash


9

Quando incollo nella mia sessione terminale, la shell esegue immediatamente il comando senza che io prema il tasto Invio.

Non so davvero come disabilitare quel comportamento.

Sto usando il terminale preinstallato su MacOS Yosemite.


9
Lo fa solo, ovviamente, se il buffer di pasta contiene una nuova riga. Questo non ha (quasi) nulla a che fare con bash. (Riguarda bash solo se e nella misura in cui utilizza la libreria readline.)
Peter - Reinstate Monica

... eppure bash(con l'aiuto di readline) ha una soluzione.
alexis,

Risposte:


16

Con bash4.4 o più recenti e nei terminali che supportano il bracketing paste a la xterm, puoi fare:

bind 'set enable-bracketed-paste'

(o aggiungi set enable-bracketed-pasteal tuo ~/.inputrc)

Questo farà sì che il copia-incolla tampone da inserire al prompt al posto dei personaggi in esso devono essere interpretati come se digitato (si potrebbe ancora avere problemi se questo buffer contiene i caratteri come ^C, ^Ze il tuo emulatore di terminale non li filtrare) .

zsh lo fa di default dalla versione 5.1.

Per altri shell o terminali, vedi anche: Come posso proteggermi da questo tipo di abuso degli Appunti?


Ci guarderò dentro
Opaldes,

i modi dello stand non sembrano funzionare
Opaldes,

@Opaldes, cosa hai provato? Con quale versione di quale shell e su quali terminali? Credo che anche OS / X venga spedito xterm, potresti invece provarlo. Hai provato lo perlscript alla domanda collegata?
Stéphane Chazelas,

1
@Opaldes, secondo incollare il codice nella finestra del terminale in vim su Mac OS X Il terminale OS / X supporta l'incollaggio tra parentesi dal OS / X Lion. Quindi sembrerebbe che tutto ciò di cui hai bisogno sia una versione abbastanza recente di zsh o bash. Con le versioni precedenti di zsh, ciò può essere ottenuto anche tramite la configurazione.
Stéphane Chazelas,

1
Ringraziamo Daniel Colascione per aver aggiunto questa utile funzione a Bash / Readline: gnu-bash.2382.n7.nabble.com/…
Anthony Geoghegan,

6

Questo succede quando si incolla un carattere "newline". Ad esempio, se si incollano più righe o si copia in modo sconosciuto un ritorno a capo alla fine della riga. AFAIK non c'è modo di disabilitare effettivamente questo comportamento ma ci sono modi per mitigarlo.

Il modo più semplice è semplicemente copiare una riga alla volta e perdere l'ultimo carattere, aggiungendolo manualmente in seguito.

Oppure, come indicato di seguito da the_velour_fog, potresti anche incollarlo in un editor che mostra caratteri non stampati e riselezionare senza la nuova riga.

Esistono uno o due soluzioni alternative per distribuzioni GNU / Linux, ma non ho idea se il concetto possa essere trasferito su MacOS. Indipendentemente da ciò, dai un'occhiata qui e vedi se c'è un file simile in Mac che potresti modificare. Sfortunatamente, ne dubito.


Ho appena incollato in un editor che mostra caratteri non stampati, quindi riseleziono senza la nuova riga
the_velour_fog

Buon suggerimento, modificato per includere.
I_GNU_it_all_along

Buono a sapersi, questo spiega che non succede sempre. Ho votato a favore della tua risposta, ma è più una soluzione alternativa per me.
Opaldes,

È una seccatura ma può essere utile quando si copiano una serie di comandi.
I_GNU_it_all_along

La mia "soluzione" è anche una sorta di soluzione alternativa, ma è più veloce della selezione separata, IMO.
Peter Cordes,

5

Prima di incollare, digitare una virgoletta singola , quindi incollare. control-c e freccia su per modificarlo come un'unica linea gigante.

anche le virgolette doppie, nel caso in cui il testo contenga virgolette singole ma non doppie. Va bene se contiene $o altre cose che si espandono tra virgolette doppie, perché in realtà non stai eseguendo la linea gigante citata come un comando.


In realtà non è possibile modificare l'intera cosa proprio lì, perché le nuove righe iniziano un prompt di continuazione (non la terminologia ufficiale) invece di fare una lunga linea lunga.

date queste 4 righe:

echo
ls
foo
bar

incollare come suggerisco porterà a questo sullo schermo:

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

È quindi possibile premere control-C e freccia su. (control-C distrugge tutto sulla stessa riga del cursore, quindi premi prima return se c'è del testo utile lì.)

Un'alternativa è quella di chiudere il preventivo e premere Invio, quindi freccia in alto.

Comunque, dopo la freccia in su

$ 'echo
ls
foo
bar

control-a e rimuovere il comando '. Usa control-left e control-right per spostarti rapidamente attraverso il blocco incolla (a parole). Oppure se la configurazione del tuo terminale non supporta i tasti freccia-controllo, alt-b e alt-f.


Le nuove righe letterali in realtà separano i comandi e queste 4 righe andranno nella cronologia dei comandi separatamente . Potresti volerli cambiare in ;o &&. (Non conosco un trucco per questo, basta usare la ripetizione dei tasti per le parole avanti o indietro per arrivarci rapidamente e farlo manualmente.)


2

Ciò accade perché la tua pasta termina con una nuova riga e gli emulatori di terminale fondamentalmente alimentano la pasta per colpire carattere per carattere. In questo processo, bash non conosce davvero la dattilografa umana di una macchina.

Di solito prendo ancora più attenzione quando faccio il copia-incolla che non include una nuova riga, ma c'è un trucco che puoi provare: prima di incollare, in bash, digitare C-x C-e. Dovrebbe avviarsi $EDITORcon un file vuoto. Qualunque cosa tu salvi in ​​quel file e esci, bash verrà eseguito. Quindi ora puoi incollare il tuo comando nell'editor, eventualmente manipolare ulteriormente le cose e quindi eseguirle tutte in una volta.


-1

NON sono legato all'azienda, sono un cliente molto soddisfatto. Prova questo programma terminale: http://www.emtec.com/zoc/index.html . È disponibile anche una versione per Mac.

Se violo con questa risposta qualsiasi regola SE, per favore fatemi sapere e cancello la risposta.

Modificare:

Quando ho capito correttamente le altre risposte, questo problema potrebbe essere causato dal programma terminale. Il programma terminale ZOC è un software professionale che è perfettamente progettato per il lavoro. Incolla il testo selezionato senza alcun carattere aggiuntivo. È possibile registrare le sessioni in un file di testo separato. E molto altro ancora

Aggiornare:

Il programma terminale ha un'opzione Paste without final 'newline'. Può essere questo aiuta.


3
Per favore, almeno dì come risponde alla domanda
Stéphane Chazelas,

Se si incolla una stringa che contiene caratteri di nuova riga o di ritorno a capo al prompt di una shell in esecuzione in quel terminale, cosa succede? Se non fa sì che la shell esegua immediatamente i comandi (come richiesto qui), come lo fa? Rimuove quei personaggi dalla selezione? Inserisce un carattere ^ V prima di fuggire per bash?
Stéphane Chazelas,

2
In quanto tale, assomiglia più allo spam (anche se sono sicuro che non fosse tua intenzione spammare questo sito). Non risponde alla domanda ed è solo pubblicità per un prodotto commerciale correlato.
Stéphane Chazelas,

2
@AlBundy, scopri se il tuo client terminal preferito risolve questo problema provando gli exploit discussi in security.stackexchange.com/q/39118 (menzionato nella risposta di Stephane) e i collegamenti che troverai lì. Se ti protegge, hai buoni motivi per raccomandarlo (fornisci i dettagli dei tuoi test nella tua risposta.).
alexis,

Di solito il problema è che ciò che è stato selezionato fa includere un ritorno a capo. In che modo "incollare il testo selezionato" è diverso dal normale comportamento di qualsiasi altro emulatore di terminale?
Peter Cordes,
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.