copia l'ultimo comando nel terminale

21

Riesco a vedere l'ultimo comando nel terminale premendo up arrow come nell'esempio seguente:

Ho digitato cd / :

Makss-Mac:~ maks$ cd /

... premuto enter , comando cd / eseguito e ora posso premere up arrow e vedere di nuovo comando cd / :

Makss-Mac:/ maks$ cd /

Non voglio solo vedere l'ultimo comando ma copiarlo negli appunti.

Forse esiste un collegamento che non mostra solo l'ultimo comando nel terminale (come up arrow do) ma allo stesso tempo lo copia negli appunti.

O forse c'è una scorciatoia per selezionare tutto dalla linea terminale corrente. E così potrò copiare l'ultimo comando (dopo aver premuto up arrow ) premendo super+c . Certo che posso selezionarlo con il mouse. Ma quando i comandi sono 10 volte più lunghi di cd / , può richiedere troppo tempo, specialmente se lo fai ogni 30 secondi.

O forse c'è un modo per scrivere plugin per Terminal

    
posta Maxim Yefremov 12.11.2013 - 19:36
fonte

4 risposte

14

Metti questo in ~/.bashrc ~/.bash_profile o dove ti piace:

alias copyLastCmd='fc -ln -1 | awk '{$1=$1}1' | pbcopy '

Dopo aver aperto una nuova finestra (o eseguito source ~/.bash_profile ) dovresti essere in grado di eseguire copyLastCmd e avere il comando negli appunti.

Per spiegare cosa sta succedendo: in pratica stai utilizzando il "comando di correzione" ( fc ) per ottenere l'ultimo comando, rimuovere gli spazi bianchi iniziali e finali per una migliore formattazione con awk e quindi copiarlo nel Mac pasteboard con pbcopy .

Modifica

Ora che sappiamo che vuoi copiare per incollare in un'altra scheda del terminale, c'è un'altra opzione: Aggiungi queste righe al tuo ~/.bashrc ~/.bash_profile o dove ti piace:

shopt -s histappend
PROMPT_COMMAND='$PROMPT_COMMAND; history -a; history -n'

Quindi, dopo aver aperto alcune nuove schede (chiamiamole "scheda A" e "scheda B"):

  1. Esegui qualsiasi comando nella scheda A
  2. Passa alla scheda B, premi Invio su una riga vuota , dandoti una nuova linea "fresca" (e quindi rivalutando la cronologia)
  3. usa la freccia su una volta e dovresti avere il comando che hai appena inserito nella scheda A.

EDIT 2: Ho sostituito l'uso di sed con awk nella risposta originale di cui sopra, per occuparmi sia degli spazi bianchi iniziali che finali.

    
risposta data 12.11.2013 - 20:17
fonte
4

Puoi impostare la cronologia in modo che ignori i comandi che iniziano con uno spazio:

export HISTIGNORE=' *'

Quindi esegui il seguente comando per inserire l'ultimo comando negli appunti (assicurati di avere uno spazio all'inizio):

history 1 | cut -d " " -f 4- | pbcopy

Probabilmente vorresti salvare il comando come alias per renderlo più facile da ricordare.

    
risposta data 12.11.2013 - 20:19
fonte
4

Ecco un altro take basato sulla risposta di @Asmus. Per far funzionare il suo alias nel mio script bash, ho dovuto usare un po 'di quoting, dal momento che le virgolette singole non funzionano in un alias a virgolette singole senza qualche citazione aggiuntiva:

alias copyLastCmd='fc -ln -1 | awk '\''{$1=$1}1'\'' | pbcopy'

Il '\'' fondamentalmente chiuderà la quota corrente, quindi aggiungerà una citazione di escape e quindi riaprirà la citazione effettiva.

La versione precedente copierà l'ultimo comando negli appunti e, una volta incollato, verrà immediatamente eseguito, poiché alla fine avrà un newline .

Per sbarazzarti della nuova riga alla fine, in modo che tu possa effettivamente modificare il comando prima di eseguirlo, puoi fare quanto segue:

alias copyLastCmd='fc -ln -1 | awk '\''{$1=$1}1'\'' ORS='\'''\'' | pbcopy'

Il ORS='' (che è senza virgolette) rimuoverà il carattere di fine riga finale, quindi puoi modificare il testo incollato prima di eseguirlo.

    
risposta data 14.11.2013 - 12:05
fonte
1

Questo userà espansione della cronologia per afferrare l'ultimo comando ed echo Puoi reindirizzare a pbcopy per salvare l'ultimo comando negli Appunti.

> echo !! | pbcopy

Se vuoi un comando dalla tua cronologia che non era l'ultimo ultimo , puoi eseguire:

> history

E fai riferimento al numero di comando desiderato come:

> echo !5 | pbcopy
    
risposta data 07.12.2018 - 15:45
fonte

Leggi altre domande sui tag