Terminal - copia do CLI sem usar o mouse

17

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

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

    
por prayagupd 22.09.2013 / 09:41

6 respostas

12

Você pode usar screen(1) no emulador de terminal de sua preferência ( xterm , gnome-terminal , ...).

A funcionalidade que você precisa está incorporada em screen . Você precisa se familiarizar com a maneira como isso funciona:

  • por padrão, a tecla de atalho "command" é Ctrl + A , você compõe comandos emitindo a sequência "command" mais a ação específica.
  • o comando "copy" é: AltGr + [
  • o comando "colar" é AltGr + ]

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

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

    
por 22.09.2013 / 10:04
4

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

Se você estivesse preparado para trocar de terminal para rxvt-unicode , você poderia usar uma ferramenta como < um href="https://github.com/muennich/urxvt-perls/"> urxvt-perls : uma coleção de scripts que fornecem a seguinte funcionalidade de teclado nesse emulador de terminal:

  • selecione, copie e cole o texto
  • pesquisa direta e inversa
  • destacar e abrir URLs no seu navegador preferido

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

    
por 22.09.2013 / 20:17
4

Você pode fazer isso usando um programa como xclip :

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

Depois de ter instalado, você pode usá-lo para se conectar à sua área de transferência do X. Infelizmente, isso não funcionará no seu ambiente mysql (ele tem seu próprio buffer para as linhas copiadas), mas funcionará se você desejar executar um comando 'normal'. Por exemplo:

$ This is a long command line

Digite Ctrl A para ir ao começo da linha, coloque o comando entre aspas e depois faça o eco:

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

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

Se você quiser colar sem usar um 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 com Ctrl K e depois colando com Ctrl Y .

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 bash especial. Se estiver definido, o valor é executado como um comando antes de emitir um novo prompt. history -a escreverá o histórico da sessão atual no arquivo de histórico e history -r recarregará esse arquivo. Isso significa que todos os comandos executados serão imediatamente gravados no arquivo de histórico.

Agora, quando você executa uma longa linha de comando, você pode alternar para outro terminal e pressionar Enter (só para executar $PROMT_COMMAND , alternativamente, abrir uma nova janela de terminal) e estará acessível ao histórico deste terminal. Se você pressionar Up , poderá executá-lo no novo terminal.

    
por 22.09.2013 / 18:49
1

O @evilsoup sugeriu uma boa solução, mas quebra frequentemente.

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 copiar o comando que você acabou de executar para a área de transferência.

Basicamente, o que ele faz é que ele imprime seu histórico de comandos e pega o segundo último comando e o alimenta na sua área de transferência (o último comando é ele mesmo, então 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 copia o último comando usado. Você também pode fornecer argumentos numéricos para copiar o último n-ésimo comando. Por exemplo. para copiar o segundo último comando, forneça 2 como 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 arquivo ~/.bashrc . Observe que, se você colocar isso em um arquivo de script bash separado e executar o script, ele não funcionará, pois o comando de histórico 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 ele se exclui do histórico depois de ser executado. Isso é útil porque o índice "atrasado" dos comandos não muda.

    
por 23.01.2015 / 08:51
0

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

echo "!!" | xclip -selection clipboard

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

Isto irá colocar o seu último comando na área de transferência Ctrl + v , assim você poderá colar em qualquer programa GUI (ou com Ctrl + Desloca + v na maioria dos emuladores de terminal, ou com "+p no vim).

Isso irá quebrar algumas linhas contendo 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

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

    
por 23.09.2013 / 13:47
0

Talvez não seja a solução mais conveniente, mas eu a uso e, portanto, ela pode ser útil para outras pessoas. Além disso, ela não requer instalação adicional 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 a transferência de direção, você pode usar

    echo $(pwd) 1> tempo
    
  3. Para obter orientação do comando use file

    cd $(tail -n 1 tempo)
    

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

    
por 11.02.2017 / 10:54