C'è un modo per rendere sicuro incollare in Terminal?


15

Ho sempre incollato nomi di file / etc in Terminal, e occasionalmente il contenuto degli appunti non è quello che mi aspetto.

Spesso il risultato sono diverse centinaia di righe di testo (ad esempio, codice sorgente) incollate nel prompt dei comandi, attivando dio solo sa quale cattiveria.

C'è un modo per impedire a bash di eseguire ciecamente qualunque cosa io incolli? Vorrei che avrebbe semplicemente incollato il testo, e lasciami decidere dopo se voglio eseguirlo.

Risposte:


9

Supponendo che tu stia usando bash: se attivi le scorciatoie di emacs set -o emacspuoi anche usare Emacs per modificare la riga di comando:

  • Digitare Ctrl-XCtrl-Eal prompt per avviare Emacs
  • Incolla e modifica il contenuto degli appunti nel buffer di Emacs
  • Utilizzare Ctrl-XCtrl-Cper uscire da Emacs ed eseguire automaticamente i comandi.

Presumo che tu intenda Ctrlinvece di Cmd. Inoltre, senza farlo set -o emacssembra usare $EDITOR. Grazie! questo è perfetto.
Abhi Beckert,

5

La soluzione più semplice è probabilmente quella di utilizzare un editor di testo come buffer in cui è possibile ricontrollare il contenuto, quindi copiarlo dall'editor di testo al Terminale. Se usi TextEdit per questo, probabilmente vorrai assicurarti che sia in modalità di testo normale ( menu FormatoCrea testo normale ; ⇧⌘T) per evitare problemi come i collegamenti incollati come collegamenti, non URL.

L'altra cosa da notare è che Bash tenterà di eseguire tutto ciò che precede un carattere di nuova riga, quindi se stai copiando un blocco di testo, potresti voler assicurarti che la selezione si interrompa dopo l'ultimo carattere, piuttosto che includere la fine del carattere linea.

Tu vuoi questo: selezione senza newline

Non questo: selezione con newline

Naturalmente, se stai copiando elementi con nuove righe all'interno del testo ( ovvero più paragrafi), dovrai modificare manualmente la selezione.


il problema è che ogni giorno incollo le cose nel terminale diverse centinaia di volte. usare un editor di testo nel mezzo sarebbe un dolore nel culo
Abhi Beckert,

Un utente malintenzionato può incorporare i ritorni a capo nel testo senza che siano visibili sullo schermo, quindi il tuo esempio su come selezionare il testo non offre necessariamente alcuna protezione.
sh1

1

Ho capito anche questo!

La mia soluzione è incollare usando il gestore degli appunti di Launchbar , con il tasto di scelta rapida Cmd+\. Questo fa apparire un elenco di ritagli recenti, permettendomi di vedere in anteprima il risultato prima di incollarlo: se non vedo il contenuto che mi aspetto, premo Esc prima di rilasciare Cmd. Posso anche usare un tasto freccia per 'inserire' un ritaglio di testo, permettendomi di vedere il contenuto riga per riga.

Credo che la maggior parte dei lanciatori lo faccia, ad esempio Alfred (addon Powerpack) e Quicksilver (gratuito).


1

Potresti voler esaminare un gestore di appunti. Ne uso uno libero e leggero chiamato Jumpcut . Mi permette di tenere più appunti e vedere cosa è memorizzato in essi prima di incollare il contenuto, tutto dalla tastiera.

Ci sono molti gestori di appunti là fuori, quindi se Jumpcut non fa galleggiare la tua barca, forse un altro si adatterà meglio alle tue esigenze


1

Usa pasta tra parentesi .

Il bracketing incolla è una funzione in cui il terminale dice alla shell che hai incollato qualcosa invece di digitarlo, quindi la shell non può eseguire il comando finché non premi Invio.

Terminal.app supporta questo, ma non tutti i terminali lo fanno.

Allo stesso modo, non tutte le shell lo supportano. La versione di bash fornita con OS X non supporta l'incollaggio tra parentesi (al momento della scrittura, è v3.2.57).

Tuttavia, zsh supporta incolla tra parentesi:

zsh-parentesi-incolla

Zsh è per lo più compatibile con bash (anche gli script probabilmente funzioneranno, a meno che tu non usi una sorta di funzionalità davvero oscura), e meglio in molti modi — per esempio, ha anche l'editing dei comandi multilinea!

zsh-righe-comando


Come si attiva la pasta tra parentesi?
Abhi Beckert,

1
È attivo di default se usi zsh. Prova a incollare in un solo tratto! Dovrebbe essere evidenziato in modo inverso come nel mio primo screenshot e se premi Elimina una volta dovrebbe eliminare tutto.
SilverWolf - Ripristina Monica il

In realtà l'ho trovato per caso, poi mi chiedevo perché non fosse in Bash. Si scopre che il bash predefinito è davvero vecchio. (:
SilverWolf - Ripristina Monica il

0

Potresti mettere questo piccolo script Bash da qualche parte nel tuo PATH:

#!/bin/bash

read -p "Are you sure you wish to execute \`$(pbpaste)\`? (Y/n) "    
[[ $REPLY =~ ^[Yy]?$  ]] && pbpaste | bash

Se inserissi questi contenuti /usr/local/pbexecuteper esempio e li rendessi eseguibili, potrei tranquillamente eseguire pbexecutedalla riga di comando, il che richiederebbe la mia conferma prima di eseguire il contenuto degli Appunti.

Un approccio alternativo è quello di avviare un editor di testo con il contenuto degli Appunti all'interno della shell ed eseguire automaticamente i contenuti modificati all'uscita. Per esempio:

#!/bin/bash

PBTEMP=$(mktemp -t pbtemp)
pbpaste > $PBTEMP
nano -t $PBTEMP
source $PBTEMP
rm $PBTEMP

Perché le zecche sfuggite indietro? Anche l'uso di "" dovrebbe funzionare.
Nohillside

@patrix Se non sfuggo ai backtick, bash lo eseguirà già durante la richiesta.
Gerry,

Allora non dovresti omettere anche i bastoncini?
Nohillside

@patrix Oh, sì certo, è solo una questione di preferenze su come si desidera formattare il prompt. Ho scelto i backtick perché sono l'operatore di sostituzione dei comandi e sono comunemente usati per contrassegnare visivamente i comandi (vedi modifica StackExchange).
Gerry,

Sono d'accordo con questo :-) Sembra un po 'complicato
nohillside
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.