Terminal - copia da CLI sem usar o mouse

20

Ao disparar comandos na CLI, quero copiar o comando que acabei de disparar ou qualquer coisa que escrevi no terminal e colá-lo em outro lugar sem usar o mouse.

Como na figura a seguir, quero copiar o comando update (total ou parcialmente) sem usar o mouse e colá-lo em algum lugar.

copiar da CLI sem usar o mouse

prayagupd
fonte
1
Você está usando o gnome sem um mouse?
ott-- 22/09/2013

Respostas:

11

Você pode usar screen(1) dentro do seu emulador de terminal de escolha ( xterm, gnome-terminal...).

A funcionalidade de que você precisa está integrada screen. Você precisa se familiarizar com o modo como funciona:

  • por padrão, a combinação de teclas "comando" é Ctrl+ A, você compõe comandos emitindo a sequência "comando" mais a ação específica.
  • o comando "cópia" é: AltGr+[
  • o comando "colar" é AltGr+]

Você pode "copiar" o comando e "colar" em outro terminal.

screen é divertido e, quando você começar a usá-lo, se perguntará como é possível que você não o tenha usado.

dawud
fonte
Como não havia screencomando, instalei-o no gnome-terminal e iniciei screenem um terminal. Mas não foi possível começar a partir daí. Também não entendi o que você quer dizer com tela embutida.
prayagupd
1
Leia man screen. Além disso, eu escrevi 'built-in na tela', ou seja, o copiar / colar funcionalidade está presente em screen pelo projeto .
dawud 22/09
Você precisa usar a spacetecla para selecionar a área desejada. Você precisa usar Ypara copiar a linha inteira ou a área desejada. Tela é viamigável movimentos.
FelikZ 18/05
o que é AltGrchave? Eu tenhoAlt
alhelal 25/05
1
A screenferramenta não funciona foi explicada aqui. E não parece fornecer uma resposta para a pergunta.
Luís de Sousa
7

Além das respostas já fornecidas, você pode considerar mudar para um emulador de terminal mais flexível.

Se você estava preparado para alterar os terminais para rxvt-unicode , poderia usar uma ferramenta como urxvt-perls : uma coleção de scripts que fornecem a seguinte funcionalidade de teclado nesse emulador de terminal:

  • selecionar, copiar e colar texto
  • pesquisa direta e reversa
  • realce e abra URLs no seu navegador preferido

Você simplesmente instala o pacote e adiciona algumas linhas ao seu ~/.Xresources, e pode desconectar o roedor para sempre.

jasonwryan
fonte
4

Você pode fazer isso usando um programa como xclip:

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

Depois de instalá-lo, você pode usá-lo para conectar-se à sua área de transferência. Infelizmente, isso não funcionará no seu mysqlambiente (ele possui seu próprio buffer para linhas copiadas), mas funcionará se você quiser executar um comando 'normal'. Por exemplo :

$ This is a long command line

Digite CtrlApara ir para o início da linha, coloque o comando entre aspas e faça o eco dele:

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

Agora você tem "Esta é uma longa linha de comando" na área de transferência do clique do meio.

Se você deseja colar sem usar o mouse, isso dependerá de onde você está colando. Você pode colar em outro terminal executando:

$ xclip -o

Você pode colar no mesmo terminal, simplesmente matando (cortando) o comando CtrlKe colando-o CtrlY.

Você também pode salvar comandos nos terminais usando o histórico do bash. Adicione esta linha ao seu ~/.bashrc:

PROMPT_COMMAND='history -a; history -r'

PROMPT_COMMANDé uma variável especial do bash. Se estiver definido, o valor será executado como um comando antes de emitir um novo prompt. history -agravará o histórico da sessão atual no arquivo de histórico e history -rrecarregará esse arquivo. Isso significa que todos os comandos que você executar serão gravados imediatamente no arquivo de histórico.

Agora, quando você executa uma longa linha de comando, pode alternar para outro terminal e pressionar return (apenas para executar $PROMT_COMMAND, alternativamente, abrir uma nova janela do terminal) e estará acessível ao histórico desse terminal. Se você acertar, Uppode executá-lo no novo terminal.

terdon
fonte
Tudo bem, mas ainda preciso usar o mouse?
prayagupd
@ PrayagUpd ah, sim, isso copiará para o buffer do meio do clique. Veja a resposta atualizada para outra maneira.
terdon
Eu acho $ xclip -oque não é o que eu quero, porque apenas imprime o que eu xcliped. Mas +1 para Ctrl+Aseguido de Ctrl+Ke Ctrl+Ypara recortar e colar no mínimo no mesmo terminal.
prayagupd
@ PrayagUpd, o problema é que existem vários buffers da área de transferência em jogo e a solução dependerá exatamente do que você deseja fazer. Você poderia atualizar sua pergunta com um exemplo específico do que você precisa? Quero dizer, copiar de onde (o mysql será complicado) e para onde.
terdon
1
@PrayagUpd veja a resposta atualizada para outro truque.
terdon
1

O @evilsoup sugeriu uma boa solução, mas é interrompido com frequência.

Uma solução rápida

Aqui está uma solução que nunca quebra .

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

Basta executar este comando e ele copiará o comando que você acabou de executar na área de transferência.

Basicamente, o que ele faz é que ele imprima seu histórico de comandos e pegue o segundo último comando e o alimente na área de transferência (o último comando é esse, ele seleciona o segundo último comando).

Uma Função Personalizada

Desenvolvendo a solução rápida, aqui está uma pequena função que escrevi que é bastante inteligente e copiará o último comando usado. Você também pode fornecer argumentos numéricos para copiar o último enésimo comando. Por exemplo, para copiar o segundo último comando, forneça 2como argumento

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
}

Copie e cole a função acima no seu ~/.bashrcarquivo. Observe que, se você colocar isso em um arquivo de script bash separado e executar o script, ele não funcionará, pois o comando history não poderá acessar seu histórico nesse caso.

Por fim, execute-o como:

myclipcopy 3
# This copies the third-last command

Além disso, um recurso interessante adicionado a essa função é que ela se exclui do histórico após ser executada. Isso é útil porque o índice "reverso" dos comandos não muda.

shivams
fonte
Isso não é robusto .
mikeserv
@ MikeServ: Eu mudei o nome agora para "Custom Function". Mas por que você diminuiu o voto? Você não percebe que isso responde adequadamente à pergunta? Além disso, o motivo pelo qual eu disse "robusto" foi porque na verdade nunca deveria quebrar. Com o voto negativo, você está apenas ocultando uma resposta apropriada da postagem.
shivams
Fiz uma votação baixa porque você assume muito : particularmente o bash e o linux, nenhum dos quais está especificado na pergunta. Além disso, o gasoduto é ridiculamente demasiado complicada, eo mesmo é verdade para o seu regex
mikeserv
@ mikeserv: Obrigado pelo comentário. Espero que isso me ajude a produzir melhores respostas. Aceito que meu regex e pipelines sejam feios. Mas eles são bem testados e eu tenho usado isso. E quanto às premissas, você notou que a resposta com a classificação mais alta assumiu a suposição de que o usuário estava usando screen. A segunda resposta mais bem classificada também assumiu bashe linux. Além disso, assumir que bashnão é grande coisa, porque o script ainda funcionaria em zsh ou na maioria dos outros shells.
shivams
Eu não disse que era feio - eu disse que era muito complicado. E não, não funcionará bem na maioria das outras conchas . Além disso, a CLI realmente retratada na pergunta é o MySQL. Bom ponto sobre as outras respostas, no entanto.
mikeserv
0

Este comando usa a expansão do histórico do bash (então se !!expande para a última linha que você digitou no terminal). Você provavelmente terá que instalar um xclipou xsel.

echo "!!" | xclip -selection clipboard

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

Isso colocará seu último comando na área de transferência Ctrl+ v, assim você poderá colar em qualquer programa da GUI (ou com Ctrl+ Shift+ vna maioria dos emuladores de terminal ou com "+pno vim).

Isso será interrompido para algumas linhas que contêm aspas duplas, por exemplo:

$ 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

Porém, funcionará para o comando que você deu como exemplo; você só deve ter problemas se as aspas duplas estiverem escapando ; & && | ||e assim por diante.

evilsoup
fonte
Obrigado por esta resposta, esta foi a solução mais prática que eu poderia implementar imediatamente. E acredito que os problemas com "podem ser evitados simplesmente não citando o !!, basta fazê echo !!-lo e ele funcionará perfeitamente (exceto no caso improvável em que seu comando anterior começou com -nou -eou com as poucas outras opções que echoele mesmo usa).
sundar - Restabelece Monica
0

Talvez não seja a solução mais conveniente, mas eu a uso e, portanto, pode ser útil para outros, pois não requer nenhuma instalação adicional.

  1. Você precisa criar um arquivo temporário em qualquer diretório conveniente

  2. Transfira a direção ou o texto necessário para esse arquivo. Para transferir a direção, você pode usar

    echo $(pwd) 1> tempo
    
  3. Para obter direção do arquivo, use o comando

    cd $(tail -n 1 tempo)
    

Para copiar e colar comandos, este sistema funcionará, é claro. Espero que tenha sido útil

Dmitriy Kormulev
fonte
Kusalananda, obrigado pela edição. Agora, a resposta parece muito melhor
Dmitriy Kormulev