Come copiare un'intera riga di comando negli appunti, senza il mouse?


20

Immagina di avere questa linea nel mio terminale:

youtube-dl --get-thumbnail --extract-audio --audio-format mp3 https://www.youtube.com/watch?v=

Dopo averlo testato, vorrei copiare questa riga sopra negli appunti e incollarla in alcuni file di script. Non l'output del comando . Ma farlo senza usare il mouse. Mi piace tenere le mani solo sulla tastiera. Penso che sia più veloce in questo modo, fare un po 'di codice :)

Risposte:


22

La mia risposta offre un semplice comando in tre diverse sintassi, che funzionano tutti allo stesso modo, ma uno è un po 'più breve e più facile da digitare rispetto al secondo. La terza variante è un cosiddetto alias, il che significa che puoi assegnare al comando un nome personalizzato e chiamarlo eseguendolo senza ricordare le cose complesse.

Preparazione:

Innanzitutto, installa il pacchetto xselche ti consente di accedere agli Appunti X dal terminale:

sudo apt-get install xsel

Variante di comando 1 (breve):

Successivamente, è possibile digitare la seguente riga per copiare il comando precedente negli Appunti:

xsel -ib <<<!!:q

Se si desidera copiare il secondo comando più recente, sostituirlo !!con !-2, per il terzo utilizzo più recente !-3e così via.

Per spiegare cosa stai eseguendo, qui una breve interruzione del comando:

  • xselè uno strumento da riga di comando per accedere agli Appunti X.
    Per maggiori informazioni, leggi la sua manpage onlineIcona Manpage o eseguendo man xsel.

    • Il -iparametro dice xseldi leggere dallo stdin (di solito questo significa input da tastiera, ma reindirizzeremo qualcosa qui)
    • Il -bparametro consente di utilizzare gli Appunti anziché le selezioni "primaria" o "secondaria" di X.
  • <<<è una sintassi speciale di Bash chiamata "Here String".
    In pratica espande (non valuta!) L'argomento (solo uno!) Dopo di esso e lo reindirizza come stringa allo stdin (input standard) del comando prima / dopo il quale si trova.

  • !!:qviene chiamato "comando bang" per l'espansione della storia in bash. Si sostituisce con qualsiasi riga di comando precedentemente digitata.
    Per maggiori informazioni, leggi la manpage locale eseguendo man history(la manpage online non è utile).

    • La !!sta per la linea di comando precedente ed è sinonimo di !-1.
      Ovviamente !-2significa quindi la seconda ultima riga di comando. Non dimenticare il segno meno -, altrimenti restituirà il secondo comando (3 ° / ...) che hai mai digitato.
    • Le :qmodifica il comando scoppio e dice bash racchiudere la sostituzione tra apici ( ') per impedire un'ulteriore espansione dalla shell.

Variante di comando 2 (leggermente più lunga):

echo !!:q | xsel -ib
  • echo ha il semplice compito di stampare tutti i suoi argomenti sullo stdout del terminale.

  • !!:qviene chiamato "comando bang" per l'espansione della storia in bash. Si sostituisce con qualsiasi riga di comando precedentemente digitata.

    • La !!sta per la linea di comando precedente ed è sinonimo di !-1. Ovviamente !-2significa quindi la seconda ultima riga di comando. Non dimenticare il segno meno -, altrimenti restituirà il secondo comando (3 ° / ...) che hai mai digitato.
    • Le :qmodifica il comando scoppio e dice bash racchiudere la sostituzione tra apici ( ') per impedire un'ulteriore espansione dalla shell.
  • |è una pipa. Reindirizza l'output del terminale ("stdout") del comando prima dell'input del terminale ("stdin") del comando dopo di esso.

  • xselè uno strumento da riga di comando per accedere agli Appunti X.
    Per maggiori informazioni, leggi la sua manpage onlineIcona Manpage o eseguendo man xsel.

    • Il -iparametro dice xseldi leggere dallo stdin (di solito questo significa input da tastiera, ma reindirizzeremo qualcosa qui)
    • Il -bparametro consente di utilizzare gli Appunti anziché le selezioni "primaria" o "secondaria" di X.

Variante di comando 3 (alias):

Un alias bash è una cosa interessante se non vuoi ricordare comandi lunghi o complicati che usi spesso. È possibile assegnare questo comando a un semplice nome alias, che è possibile eseguire invece del comando lungo per ottenere lo stesso.

Sfortunatamente, poiché i comandi bang sono una funzione speciale di Bash e vengono espansi prima che gli alias vengano risolti, non puoi semplicemente alias una delle varianti sopra perché la !!parte non funzionerà. C'è una soluzione però.

Per impostare l'alias, esegui la seguente riga nel tuo terminale. Tieni presente che puoi scegliere qualsiasi nome di variabile Bash valido anziché copylastcommand:

alias copylastcommand='history -p \!\! | xsel -ib'

Questo è tuttavia persistente solo per la sessione Bash corrente, il che significa che l'alias svanirà dopo aver chiuso la finestra del terminale. Puoi renderlo persistente in ogni sessione di Bash aggiungendo questa riga sopra alla fine del tuo ~/.bashrcfile, o al tuo ~/.bash_aliasesfile se ne hai uno.

Ancora una volta, una breve interruzione della linea:

  • alias name='command'è la sintassi per impostare un alias in Bash. La commandverrà eseguito ogni volta che si esegue nameda ora in poi.

  • history -p \!\!emette la riga di comando precedentemente eseguita su stdout (output standard). Senza l' -popzione, non solo stampa, ma esegue nuovamente il comando.
    Nota che dobbiamo sfuggire a bangs ( !) con barre rovesciate ( \), perché altrimenti bash li espanderebbe quando proviamo a impostare l'alias, il che non ha senso in quanto devono essere nell'alias così come sono.
    Ancora una volta, puoi anche specificare il comando [n] -th recente sostituendo il secondo botto con -n, ad es \!-2.

  • |è una pipa. Reindirizza l'output standard ("stdout") del comando prima di esso allo standard terminale ("stdin") del comando dopo di esso.

  • xselè uno strumento da riga di comando per accedere agli Appunti X.
    Per maggiori informazioni, leggi la sua manpage onlineIcona Manpage o eseguendo man xsel.

    • Il -iparametro dice xseldi leggere dallo stdin (di solito questo significa input da tastiera, ma reindirizzeremo qualcosa qui)
    • Il -bparametro consente di utilizzare gli Appunti anziché le selezioni "primaria" o "secondaria" di X.

1
Bella risposta, ma potresti evitare la pipa? Abbastanza per favore? <<<"!!" xsel -ib
kos

@kos, grazie. Questo lo rende un po 'più semplice. Potresti aiutare la mia mente a ricordare come <<<viene chiamata di nuovo la struttura? E penso che <<<!!:q xsel -ibsia meglio (lasciando che il comando bang della storia faccia il preventivo), o non sei d'accordo?
Byte Commander

Ma !!:qusa virgolette singole ( ') ...
Byte Commander

Hai ragione, l'espansione verrebbe eseguita usando <<<"!!" xsel -ib. Sì, <<<!!:q xsel -ibè meglio, provaci.
kos,

Bello, xselha una sintassi interessante
Sergiy Kolodyazhnyy il

5

Puoi usare xclip:

some_command | xclip -selection c

Quindi nel tuo caso:

youtube-dl .... | xclip -selection c

c sta per appunti.

Potrebbe essere necessario installare xclipprima:

sudo apt-get install xclip

MODIFICARE:

Se vuoi solo copiare il comando che hai digitato (non l'output) negli appunti, puoi usare le stringhe Here:

 xclip -selection c <<<"$(echo foobar)"

O una pipa:

echo foobar | xclip -selection c

1
Ottengo ancora l'output dei comandi, ma voglio solo la riga stessa.
Valter Silva,

echo "command" | xclip -selection clipboard... O lo rendono uno script sotto~/.bin : echo "$@" | xclip -selection clipboard. Supponi di averlo salvato come "cpy", quindi potresti cpy youtube-dl stuffe verrebbe copiato negli appunti senza essere eseguito.
Alex

E se vuoi che venga eseguito ... echo "$@" | xclip -selection c && $@, o qualcosa di più intelligente con eval ...
Alex

@ValterHenrique Per favore, controlla le mie modifiche ..
heemayl

3

Ho appena creato un piccolo script zshche usa xclipper fare questo:

#!/bin/zsh
export HISTFILE=~/.zsh_history
fc -R
fc -l | tail -n 2 | sed -n '1p' | sed 's/[0-9]*  //' | xclip -selection c

Questo script copia l'ultimo comando immesso nella shell / terminale negli appunti del sistema. Non funzionerebbe su un tipico server remoto.

Ho pensato che mi sarebbe bastato un paio di minuti per scrivere questa sceneggiatura, ma ci è voluto sorprendentemente molto per farlo funzionare mentre inciampavo nel modo in cui zshgestisco la storia.

Il tail -n 2primo sedin questo riguarda il fatto che il comando per questo script stesso viene registrato nella storia e quindi ottiene due righe di storia e rimuove l'ultima.

Questa sceneggiatura funziona ed è stato un po 'un puzzle divertente, ma sono davvero curioso di sapere se esiste un modo più semplice o più elegante di farlo zsh.


Bene, probabilmente potresti semplificare i comandi taile sedin uno o due comandi. Questi comandi usano ciò !!che è spiegato qui - dovrebbe essere disponibile in ZSH ....
Wilf

Oh, in !!effetti sembra che sarebbe utile qui, grazie!
alec,

0

Sto usando come gestore degli appunti, quindi.

alias pbpaste='xclip -i -selection clipboard -o'
alias pbcopy='xclip -selection clipboard'
vimscratch='vim -c 'setlocal buftype=nofile bufhidden=wipe nobuflisted noswapfile' 

Ultimo comando negli Appunti

alias last2cb='fc -ln -1 | pbcopy'

Appunti per vim scratch

alias vcb='pbpaste | vimscratch -'

ZSH specifico

# Copy the most recent command to the clipboard
function _pbcopy_last_command(){
    fc -ln -1 | pbcopy
}
zle -N pbcopy-last-command _pbcopy_last_command
bindkey '^x^y' pbcopy-last-command
# Ctrl-x Ctrl-y  to copy last command to the clipboard


# Edit content of clipboard on vim (scratch buffer)
function _edit_clipboard(){
    pbpaste | vim -c 'setlocal buftype=nofile bufhidden=wipe nobuflisted noswapfile' -
}
zle -N edit-clipboard _edit_clipboard
bindkey '^x^v' edit-clipboard
# Ctrl-x Ctrl-v to edit clipboard on vim


# define function that retrieves and runs last command
function run-again {
    # get previous history item
    zle up-history
    # confirm command
    zle accept-line
}
# define run-again widget from function of the same name
zle -N run-again
bindkey '\er' run-again
# alt-r to run last command again

Penso che queste idee possano aiutarti a creare la tua soluzione

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.