Como copiar uma linha de comando inteira para minha área de transferência, sem o mouse?

20

Imagine que eu tenho essa linha no meu terminal:

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

Após testá-lo, gostaria de copiar esta linha acima para minha área de transferência e colá-la em algum arquivo de script. Não é a saída do comando . Mas, fazendo isso sem usar o mouse. Eu gosto de manter minhas mãos apenas no teclado. Eu acho que é mais rápido assim, para fazer alguma codificação:)

    
por Valter Silva 01.11.2015 / 16:23

3 respostas

22

Minha resposta oferece um comando simples em três sintaxes diferentes, que funcionam igualmente, mas uma é um pouco mais curta e mais fácil de digitar que a segunda. A terceira variação é um assim chamado alias, o que significa que você pode atribuir um nome personalizado ao comando e chamá-lo executando-o sem ter que se lembrar das coisas complexas.

Preparação:

Primeiro, instale o pacote xsel , que permite acessar a área de transferência X a partir do terminal:

sudo apt-get install xsel

Variação de comando 1 (curta):

Depois disso, você pode digitar a seguinte linha para copiar o comando anterior para a área de transferência:

xsel -ib <<<!!:q

Se você quiser copiar o segundo comando mais recente, substitua !! por !-2 , para o terceiro uso mais recente !-3 e assim por diante.

Para explicar o que você está executando, aqui está um pequeno resumo do comando:

  • xsel é uma ferramenta de linha de comando para acessar as áreas de transferência X.
    Para mais informações, leia a manpage online ou executando man xsel .

    • O parâmetro -i informa xsel para ler a partir do stdin (geralmente isso significa entrada de teclado, mas vamos redirecionar algo aqui)
    • O parâmetro -b especifica a utilização da área de transferência em vez das seleções "primária" ou "secundária" do X.
  • <<< é uma sintaxe especial de Bash chamada "Here String".
    Ele basicamente expande (não avalia!) O argumento (somente um!) Após ele e o redireciona como string para o stdin (entrada padrão) do comando antes / depois do qual ele permanece.

  • !!:q é chamado de "comando bang" para expansão de histórico no bash. Ele se substitui por qualquer linha de comando digitada anteriormente.
    Para mais informações, leia a página de manual local executando man history (a página de manual online não é útil).

    • O !! representa a linha de comando anterior e é sinônimo de !-1 .
      Obviamente !-2 significa então a segunda última linha de comando. Não se esqueça do sinal de menos - , caso contrário ele retornará o segundo (3º / ...) comando que você já digitou.
    • O :q modifica o comando bang e informa ao bash para incluir a substituição entre aspas simples ( ' ) para evitar expansão adicional pelo shell.

Variação de comando 2 (um pouco mais longa):

echo !!:q | xsel -ib
  • echo tem o trabalho simples de imprimir todos os seus argumentos no stdout do terminal.

  • !!:q é chamado de "comando bang" para expansão de histórico no bash. Ele se substitui por qualquer linha de comando digitada anteriormente.

    • O !! representa a linha de comando anterior e é sinônimo de !-1 . Obviamente !-2 significa então a segunda última linha de comando. Não se esqueça do sinal de menos - , caso contrário ele retornará o segundo (3º / ...) comando que você já digitou.
    • O :q modifica o comando bang e informa ao bash para incluir a substituição entre aspas simples ( ' ) para evitar expansão adicional pelo shell.
  • | é um canal. Ele redireciona a saída do terminal ("stdout") do comando antes dele para a entrada do terminal ("stdin") do comando após ele.

  • xsel é uma ferramenta de linha de comando para acessar as áreas de transferência X.
    Para mais informações, leia a manpage online ou executando man xsel .

    • O parâmetro -i informa xsel para ler a partir do stdin (geralmente isso significa entrada de teclado, mas vamos redirecionar algo aqui)
    • O parâmetro -b especifica a utilização da área de transferência em vez das seleções "primária" ou "secundária" do X.

Variação de comando 3 (alias):

Um pseudônimo bash é uma coisa legal se você não quiser lembrar de comandos longos ou complicados que você usa com frequência. Você pode atribuir este comando a um nome de alias simples, que pode ser executado em vez do comando longo para obter o mesmo.

Infelizmente, como os comandos bang são um recurso Bash especial e são expandidos antes que os aliases sejam resolvidos, você não pode simplesmente aliasar uma das variações acima porque a parte !! não funcionará. Existe uma solução alternativa.

Para definir o alias, execute a seguinte linha no seu terminal. Observe que você pode escolher qualquer nome de variável de Bash válido em vez de copylastcommand :

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

No entanto, isso é apenas persistente para sua sessão atual do Bash, o que significa que o alias desaparece depois que você fecha a janela do terminal. Você pode torná-lo persistente em todas as suas sessões Bash adicionando esta linha acima ao final do seu arquivo ~/.bashrc , ou ao seu arquivo ~/.bash_aliases se você tiver um.

Novamente, um breve intervalo da linha:

  • alias name='command' é a sintaxe para definir um alias no Bash. O command será executado sempre que você executar name a partir de agora.

  • history -p \!\! exibe a linha de comando executada anteriormente para stdout (saída padrão). Sem a opção -p , ela não só imprimiria como também executaria o comando novamente.
    Note que precisamos escapar da franja ( ! ) com barras invertidas ( \ ), porque do contrário o bash iria expandi-las quando tentássemos definir o alias, o que não faz sentido, já que elas precisam estar no alias

    Novamente, você também pode especificar o comando [n] -th recent substituindo o segundo com -n , por exemplo. \!-2 .

  • | é um canal. Ele redireciona a saída padrão ("stdout") do comando antes para o padrão de terminal ("stdin") do comando após ele.

  • xsel é uma ferramenta de linha de comando para acessar as áreas de transferência X.
    Para mais informações, leia a manpage online ou executando man xsel .

    • O parâmetro -i informa xsel para ler a partir do stdin (geralmente isso significa entrada de teclado, mas vamos redirecionar algo aqui)
    • O parâmetro -b especifica a utilização da área de transferência em vez das seleções "primária" ou "secundária" do X.
por Byte Commander 01.11.2015 / 16:48
5

Você pode usar xclip :

some_command | xclip -selection c

Então, no seu caso:

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

c significa área de transferência.

Pode ser necessário instalar xclip primeiro:

sudo apt-get install xclip

EDITAR:

Se você quer apenas que o comando que você digitou (não a saída) seja copiado para a área de transferência, você pode usar Aqui strings:

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

Ou um cachimbo:

echo foobar | xclip -selection c
    
por heemayl 01.11.2015 / 16:28
2

Acabei de criar um pequeno script para zsh que usa xclip para fazer isso:

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

Este script copia o último comando digitado no shell / terminal para a área de transferência do sistema. Não funcionaria em um servidor remoto típico.

Eu pensei que levaria apenas alguns minutos para escrever este roteiro, mas demorou surpreendentemente para fazê-lo funcionar enquanto eu tropeçava na maneira como o zsh lida com a história.

O tail -n 2 e o primeiro sed estão lidando com o fato de que o comando para este script está sendo gravado no histórico e, portanto, obtém duas linhas de histórico e remove o último. / em>

Este script funciona, e foi um quebra-cabeça divertido, mas estou realmente curioso para saber se há uma maneira mais simples ou mais elegante de fazer isso com zsh .

    
por alec 25.05.2017 / 19:20