Terminale: copia dalla CLI senza usare il mouse


20

Mentre sparo i comandi nella CLI, voglio copiare il comando che ho appena sparato o qualsiasi cosa abbia scritto nel terminale e incollarlo da qualche altra parte senza usare il mouse.

Come nella figura seguente, voglio copiare il comando di aggiornamento (completamente o parzialmente) senza usare il mouse e incollarlo da qualche parte.

copia dalla CLI senza usare il mouse


1
Stai usando gnome senza mouse?
ott--

Risposte:


11

È possibile utilizzare screen(1) all'interno del vostro emulatore di terminale di scelta ( xterm, gnome-terminal, ...).

La funzionalità di cui hai bisogno è integrata screen. Devi familiarizzare con il modo in cui funziona:

  • per impostazione predefinita, il Ctrltasto "comando" è + A, si compongono i comandi emettendo la sequenza "comando" più l'azione specifica.
  • il comando "copia" è: AltGr+[
  • il comando "incolla" è AltGr+]

È possibile "copiare" il comando e "incollare" in un altro terminale.

screen è divertente e una volta che inizi a usarlo ti chiederai come sia possibile non averlo usato affatto.


Non c'era alcun screencomando, quindi l'ho installato in gnome-terminal e avviato screenin un terminale. Ma non è stato possibile iniziare da allora in poi. Inoltre, non ho capito cosa intendi per schermo incorporato.
prayagupd,

1
Leggi man screen. Inoltre, ho scritto 'built-in in schermo', che significa il copia / incolla funzionalità è presente in screen base alla progettazione .
Dawud,

È necessario utilizzare il spacetasto per selezionare l'area desiderabile. È necessario utilizzare Yper copiare l'intera riga o l'area desiderabile. Lo schermo è viamico dei movimenti.
FelikZ,

qual è la AltGrchiave? HoAlt
alhelal

1
Lo screenstrumento non funziona è spiegato qui. E non sembra fornire una risposta alla domanda.
Luís de Sousa,

7

Oltre alle risposte già fornite, potresti considerare di passare a un emulatore di terminale più flessibile.

Se eri pronto a cambiare i terminali in rxvt-unicode , potresti usare uno strumento come urxvt-perls : una raccolta di script che forniscono la seguente funzionalità della tastiera in quell'emulatore di terminale:

  • seleziona, copia e incolla il testo
  • ricerca avanti e indietro
  • evidenziare e aprire gli URL nel browser preferito

Devi semplicemente installare il pacchetto e quindi aggiungere alcune righe al tuo ~/.Xresources, quindi puoi scollegare definitivamente il roditore.


4

Puoi farlo usando un programma come xclip:

NAME
   xclip - command line interface to X selections (clip‐
   board)

Una volta installato, è possibile utilizzarlo per connettersi agli Appunti X. Sfortunatamente, questo non funzionerà nel tuo mysqlambiente (ha il suo buffer per le linee copiate) ma lo farà se vuoi eseguire un comando 'normale'. Per esempio :

$ This is a long command line

Digita CtrlAper andare all'inizio della riga, racchiudi il comando tra virgolette e ripetilo:

$ echo -e "This is a long command line" |xclip 

Ora hai "Questa è una lunga riga di comando" negli appunti del clic centrale.

Se vuoi incollare senza usare il mouse, dipenderà da dove stai incollando. È possibile incollare in un altro terminale eseguendo:

$ xclip -o

Puoi incollarlo nello stesso terminale, semplicemente uccidendo (tagliando) il comando con CtrlKe poi incollando con CtrlY.

Puoi anche salvare i comandi tra i terminali usando la cronologia di bash. Aggiungi questa linea al tuo ~/.bashrc:

PROMPT_COMMAND='history -a; history -r'

PROMPT_COMMANDè una variabile bash speciale. Se impostato, il valore viene eseguito come comando prima di emettere un nuovo prompt. history -ascriverà la cronologia della sessione corrente nel file della cronologia e history -rricaricherà quel file. Ciò significa che ogni comando eseguito verrà immediatamente scritto nel file della cronologia.

Ora quando si esegue una lunga riga di comando, è possibile passare a un altro terminale e premere Invio (solo per eseguire $PROMT_COMMAND, in alternativa, aprire una nuova finestra del terminale) e sarà accessibile alla cronologia di questo terminale. Se ora colpisci Uppuoi eseguirlo sul nuovo terminale.


Va bene, ma devo ancora usare il mouse?
prayagupd,

@PrayagUpd ah, sì, che verrà copiato nel buffer del clic centrale. Vedi la risposta aggiornata per un altro modo.
terdon

Penso che $ xclip -onon sia quello che voglio perché stampa solo quello che xcliped. Ma +1 per Ctrl+Aseguito da Ctrl+Ke Ctrl+Yper tagliare e incollare almeno nello stesso terminale.
prayagupd,

@PrayagUpd il fatto è che ci sono vari buffer di appunti in gioco e la soluzione dipenderà da cosa esattamente vuoi fare. Potresti aggiornare la tua domanda con un esempio specifico di ciò di cui hai bisogno? Intendo copiare da dove (mysql sarà complicato) e dove.
terdon

1
@PrayagUpd vedi la risposta aggiornata per un altro trucco.
Terdon

1

@evilsoup ha suggerito una buona soluzione ma si rompe spesso.

Una soluzione rapida

Ecco una soluzione che non si rompe mai .

history | tail -2 | head -1 | xclip -selection clipboard

Basta eseguire questo comando e copierà il comando appena eseguito negli Appunti.

Fondamentalmente, ciò che fa è che stampa la cronologia dei tuoi comandi e prende il secondo ultimo comando e lo alimenta negli appunti (l'ultimo comando è questo stesso, quindi seleziona il secondo ultimo comando).

Una funzione personalizzata

Sviluppando la soluzione rapida, ecco una piccola funzione che ho scritto che è piuttosto intelligente e copierà l'ultimo comando usato. È inoltre possibile fornire argomenti numerici per copiare il comando last-ennesimo. Ad esempio per copiare il secondo ultimo comando fornire 2come argomento

myclipcopy () {

  if [ -z $1 ]
    then  # if no argument was provided then just copy the last used command
    history | tail -2 | head -1 | sed -re 's/[[:space:]]+[[:digit:]]+[[:space:]]+//g' | xclip -selection clipboard
    echo 'Anyways, the following command has been copied:'
    history | tail -2 | head -1| sed -re 's/[[:space:]]+[[:digit:]]+[[:space:]]+//g'

  else
    myindex=$(( $1+1 ))
    history | tail -$myindex | head -1 | sed -re 's/[[:space:]]+[[:digit:]]+[[:space:]]+//g' | xclip -selection clipboard
    echo "The following command has been copied:"
    history | tail -$myindex | head -1 | sed -re 's/[[:space:]]+[[:digit:]]+[[:space:]]+//g'
  fi

  #Delete this command itself from the history
  myhisnum=$(history | tail -1 | grep -oP '\s\d+\s' | grep -oP '\d+'); history -d $myhisnum
}

Copia e incolla la funzione sopra nel tuo ~/.bashrcfile. Nota che se lo metti in un file di script bash separato ed esegui lo script, non funzionerebbe poiché il comando history non sarebbe in grado di accedere alla tua cronologia in quel caso.

Infine, eseguilo come:

myclipcopy 3
# This copies the third-last command

Inoltre, una caratteristica interessante aggiunta a questa funzione è che si elimina dalla cronologia dopo l'esecuzione. Questo è utile perché quindi l'indice "indietro" dei comandi non cambia.


Questo non è robusto .
Mikeserv,

@mikeserv: l'ho rinominato ora in "Funzione personalizzata". Ma perché l'hai votato? Non noti che questo risponde correttamente alla domanda? Inoltre, il motivo per cui ho detto "robusto" è perché in realtà non dovrebbe mai rompersi. Effettuando il downvoting, stai semplicemente nascondendo una risposta appropriata dal post.
Shivams,

Ho effettuato il downgrade perché si assume molto : in particolare bash e linux, nessuno dei quali è specificato nella domanda. Inoltre, la tua pipeline è ridicolmente eccessivamente complicata, e lo stesso vale per la tua regex
mikeserv

@mikeserv: grazie per il commento. Spero che questo mi aiuti a produrre risposte migliori. Accetterò che la mia regex e le mie condutture siano brutte. Ma sono ben testati e lo sto usando. E per quanto riguarda i presupposti, hai notato che la risposta con il punteggio più alto aveva assunto il presupposto che l'utente stesse usando screen. Anche la seconda risposta più votata aveva assunto bashe linux. Inoltre, assumere bashnon è un grosso problema perché lo script funzionerebbe ancora in zsh o nella maggior parte delle altre shell.
Shivams,

Non ho detto che fosse brutto - ho detto che era troppo complicato. E no, non funzionerà bene nella maggior parte delle altre shell . E per di più, la CLI effettivamente rappresentata nella domanda è MySQL. Un buon punto sulle altre risposte, però.
Mikeserv,

0

Questo comando usa l'espansione della cronologia di bash (quindi si !!espande nell'ultima riga digitata nel terminale). Probabilmente dovrai installare uno xclipo xsel.

echo "!!" | xclip -selection clipboard

echo "!!" | xsel -i --clipboard

Questo inserirà il tuo ultimo comando negli Appunti Ctrl+ v, quindi sarai in grado di incollare in qualsiasi programma GUI (o con Ctrl+ Shift+ vnella maggior parte degli emulatori di terminale, o con "+pin vim).

Questo si interromperà per alcune righe che contengono virgolette doppie, ad esempio:

$ echo "foo;bar"
foo;bar
$ echo "!!"
echo "echo "foo;bar""
echo foo
The program 'bar' is currently not installed. You can install it by typing:
sudo apt-get install bar

Funzionerà per il comando che hai dato come esempio; dovresti avere problemi solo se le doppie virgolette stanno scappando ; & && | ||e così via.


Grazie per questa risposta, questa è stata la soluzione più pratica che ho potuto implementare immediatamente. E credo che i problemi con "possano essere evitati semplicemente non citando affatto !!, basta farlo echo !!e funzionerà perfettamente (tranne nel caso improbabile che il tuo comando precedente è iniziato con -no -eo le poche altre opzioni che esso echostesso prende).
Sundar - Ripristina Monica il

0

Forse non è la soluzione più conveniente, ma la utilizzo e quindi può essere utile per gli altri, non richiede alcuna installazione aggiuntiva.

  1. È necessario creare un file temporaneo in qualsiasi directory conveniente

  2. Trasferire la direzione o il testo richiesti in quel file. Per il trasferimento della direzione è possibile utilizzare

    echo $(pwd) 1> tempo
    
  3. Per ottenere la direzione dal file, utilizzare il comando

    cd $(tail -n 1 tempo)
    

Per i comandi di copia e incolla questo sistema funzionerà naturalmente. Spero sia stato utile


Kusalananda grazie per il montaggio. Ora la risposta sembra molto migliore
Dmitriy Kormulev l'
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.