copia l'ultimo comando nel terminale


22

Vedo l'ultimo comando nel terminale premendo up arrowcome nell'esempio seguente:

Ho scritto cd /:

Makss-Mac:~ maks$ cd /

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

Makss-Mac:/ maks$ cd /

Voglio non solo vedere l'ultimo comando, ma copiarlo negli appunti.

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

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

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


Potrebbe essere più semplice trovare una soluzione qui se in seguito è possibile aggiungere alcuni dettagli su ciò che si intende fare con il contenuto degli Appunti. Dove lo incollerai?
Nohillside

Sì, per incollarlo in un'altra scheda del terminale
Maxim Yefremov,

Risposte:


17

Metti questo nel tuo ~/.bashrc ~/.bash_profileo dove vuoi:

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

Dopo aver aperto una nuova finestra (o in esecuzione source ~/.bash_profile) dovresti essere in grado di eseguire copyLastCmde avere il comando negli Appunti.

Per spiegare cosa sta succedendo: in pratica stai usando "fix command" ( fc) per ottenere l'ultimo comando, rimuovi sia gli spazi iniziali sia quelli finali per una formattazione migliore awke quindi copialo nel pannello di controllo del tuo Mac pbcopy.

MODIFICARE:

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_profileo dove vuoi:

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

Quindi, una volta aperte alcune nuove schede (chiamiamole "scheda A" e "scheda B"):

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

EDIT 2: ho sostituito l'uso di sedcon awknella risposta originale sopra, per occuparmi di spazi bianchi sia iniziali che finali.


È un grande alias! Per tagliare la nuova riga finale, in modo da poter modificare il comando dopo aver incollato, ho usato awk:alias copyLastCmd='fc -ln -1 | sed '1s/^[[:space:]]*//' | awk 1 ORS="" | pbcopy '
nwinkler

@nwinkler: OH hai ragione, avresti dovuto usare awk: fc -ln -1 | awk '{$1=$1}1'rimuoverà sia gli spazi finali sia quelli iniziali.
Asmus,

1
ha dovuto modificare l'alias per caratteri speciali alias copyLastCmd="fc -ln -1 | awk '{\$1=\$1}1' | pbcopy". ottiene ancora il mio voto
Mike D

1
L'ho usato fino a quando non ho fatto un "git -reset --hard" su un terminale e in un'altra "ignara cartella git" ho premuto la freccia verso l'alto ed entrare frettolosamente mentre pensavo di eseguire uno script che stavo usando prima. Potete immaginare cosa è successo, e quella è stata l'ultima volta che ho usato questa storia "globale" condivisa
MrGigu,

@MrGigu mi è successo con una storia "locale" in cui ho premuto due volte la freccia "su", anziché una volta, per caso - le lezioni apprese nel modo più duro, immagino.
Asmus,

5

Ecco un'altra interpretazione basata sulla risposta di @Asmus. Per far funzionare il suo alias nel mio script bash, ho dovuto usare un po 'di virgolette, dal momento che le virgolette singole non funzionano in un alias tra virgolette singole senza alcune citazioni aggiuntive:

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

Il '\''sarà essenzialmente chiudere la quotazione corrente, quindi aggiungere un preventivo fuggito, e quindi aprire di nuovo la citazione reale.

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

Per eliminare la nuova riga alla fine, in modo da poter effettivamente modificare il comando prima di eseguirlo, è possibile effettuare le seguenti operazioni:

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

Il ORS=''(senza virgolette) rimuoverà il carattere di nuova riga finale, in modo da poter modificare il testo incollato prima di eseguirlo.


5

Questo utilizzerà l' espansione della cronologia per afferrare l'ultimo comando ed eseguirne l'eco. È possibile reindirizzare a pbcopyper salvare l'ultimo comando negli Appunti.

> echo !! | pbcopy

Se si desidera un comando dalla cronologia che non era l' ultimo , è possibile eseguire:

> history

E fai riferimento al numero di comando desiderato come:

> echo !5 | pbcopy

Potrebbe essere il tuo preferito e potrebbe anche funzionare, ma è necessario fornire una piccola spiegazione su ciò che il comando effettivamente fa e su come l'OP (che ha accettato una delle risposte cinque anni fa) può usarlo in modo efficace.
IconDaemon

@IconDaemon buona chiamata. Penso che valga la pena aggiungere una vecchia domanda perché è più semplice della risposta accettata poiché non richiede alcuna personalizzazione del profilo.
Sam Berry,

4

Sono venuto qui come ho avuto la stessa risposta di Sam Berry, ma non funziona per me (OSX 10.14.6).

Gestito per farlo farlo con virgolette intorno a !!:

echo "!!" | pbcopy


3

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

export HISTIGNORE=' *'

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

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

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

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.