Como copiar a saída de um comando diretamente na minha área de transferência?


529

Como canalizar a saída de um comando na minha área de transferência e colá-la novamente ao usar um terminal? Por exemplo:

cat file | clipboard


possível duplicação de superuser.com/questions/104981/…
Champ

Acabei de fazer uma pergunta relacionada, pois não consigo fazer o xclip funcionar ao fazer login no Ubuntu a partir do Git Bash no Windows: stackoverflow.com/q/60117294/470749
Ryan

1
Salve o conteúdo do arquivo na área de transferência. apt install xclipecat file | xclip -sel clip
EsmaeelE

Respostas:


598

Eu sempre quis fazer isso e encontrei uma maneira agradável e fácil de fazê-lo. Anotei o procedimento completo para o caso de mais alguém precisar.

Primeiro instale um programa de 16 kB chamado xclip:

sudo apt-get install xclip

Você pode canalizar a saída xclippara ser copiada na área de transferência:

cat file | xclip

Para colar o texto que você acabou de copiar, use:

xclip -o

Para simplificar a vida, você pode configurar um alias no seu arquivo .bashrc como eu fiz:

alias "c=xclip"
alias "v=xclip -o"

Para ver como isso é útil, imagine que eu queira abrir meu caminho atual em uma nova janela de terminal (pode haver outras maneiras de fazê-lo como Ctrl+ Tem alguns sistemas, mas isso é apenas para fins ilustrativos):

Terminal 1:
pwd | c

Terminal 2:
cd `v`

Observe o ` ` redor v. Isso é executado vprimeiro como um comando e depois o substitui no local para cduso.

Copie apenas o conteúdo para a Xárea de transferência

cat file | xclip

Se você deseja colar em outro lugar que não seja um Xaplicativo, tente este:

cat file | xclip -selection clipboard

146
"cat file | xclip" copia apenas o conteúdo para a área de transferência 'X', se você deseja colar em outro lugar que não seja um aplicativo 'X', tente o seguinte: "arquivo gato | xclip -selection clipboard"
khotyn

5
Sua escolha de alça é apropriada!
Matt Joiner

4
Se você deseja remover o caractere de nova linha para poder colar e editar diretamente o resultado de "pwd | c", você pode fazer "pwd | tr -d '\ n' | xclip -selection c"
Anake em

12
também definir alias "cs=xclip -selection clipboard"e alias "vs=xclip -o -selection clipboard"fazer copiar / colar da área de transferência do sistema mais fácil
Yibo Yang

1
Que tal uma solução em que eu não tenho acesso ao sudo e o xclip não está instalado?
DanGordon

179

No OS X, use pbcopy; pbpastevai na direção oposta.

pbcopy < .ssh/id_rsa.pub

14
Yups! Assim para ex:pbcopy < .ssh/id_rsa.pub
doublejosh

não funciona para saída de comando tho - por exemplopbcopy < git merge-base master some-branch
Ben

se você estiver usando o tmux, ele não funcionará, a menos que você reconecte sua sessão: superuser.com/a/413233/146254
Atav32

1
você também pode usar cat, se você já trabalha com ele: cat file.txt | pbcopy
rtrigoso 2/06

3
Eu sei que o comentário tem 5 anos, mas no caso de alguém se deparar com isso no futuro, para usar com saída de comando, façagit merge-base master some-branch | pbcopy
Sam

62

Eu criei uma ferramenta para Linux / OSX / Cygwin que é semelhante a alguns desses outros, mas um pouco exclusiva. Eu chamo cbe pode ser encontrado nesta essência do github .

Nessa essência, eu demonstro como copiar e colar via linha de comando usando Linux, macOS e Cygwin.

Linux

_copy(){
    cat | xclip -selection clipboard
}

_paste(){
    xclip -selection clipboard -o
}

Mac OS

_copy(){
    cat | pbcopy
}

_paste(){
    pbpaste
}

Cygwin

_copy(){
    cat > /dev/clipboard
}

_paste(){
    cat /dev/clipboard
}

Nota: originalmente eu pretendia mencionar isso no meu comentário para resposta de Bob Enohp . Mas então percebi que deveria adicionar um README à minha essência. Como o editor de essência não oferece uma visualização do Markdown, usei a caixa de respostas aqui e depois de copiar / colar no meu pensamento de essência, "Eu também poderia enviar a resposta".

cb

Um tee à prova de vazamento para a área de transferência

Esse script é modelado depois tee(consulteman tee ).

É como seus comandos normais de copiar e colar, mas unificados e capazes de detectar quando você deseja que ele seja encadeado

Exemplos

cópia de

$ date | cb
# clipboard contains: Tue Jan 24 23:00:00 EST 2017

Colar

# clipboard retained from the previous block
$ cb
Tue Jan 24 23:00:00 EST 2017
$ cb | cat
Tue Jan 24 23:00:00 EST 2017
$ cb > foo
$ cat foo
Tue Jan 24 23:00:00 EST 2017

Encadeamento

$ date | cb | tee updates.log
Tue Jan 24 23:11:11 EST 2017
$ cat updates.log
Tue Jan 24 23:11:11 EST 2017
# clipboard contains: Tue Jan 24 23:11:11 EST 2017

Copiar via redirecionamento de arquivo

(cronologicamente, fazia sentido demonstrar isso no final)

# clipboard retained from the previous block
$ cb < foo
$ cb
Tue Jan 24 23:00:00 EST 2017
# note the minutes and seconds changed from 11 back to 00

Isso funcionou perfeitamente para mim copiar uma saída de comando para a área de transferência no terminal no macOS, obrigado!
Joshua Dyck

46

Eu escrevi esse pequeno script que tira o palpite dos comandos de copiar / colar.

A versão Linux do script depende do xclip já estar instalado no seu sistema. O script é chamado de área de transferência.

#!/bin/bash
# Linux version
# Use this script to pipe in/out of the clipboard
#
# Usage: someapp | clipboard     # Pipe someapp's output into clipboard
#        clipboard | someapp     # Pipe clipboard's content into someapp
#

if command -v xclip 1>/dev/null; then
    if [[ -p /dev/stdin ]] ; then
        # stdin is a pipe
        # stdin -> clipboard
        xclip -i -selection clipboard
    else
        # stdin is not a pipe
        # clipboard -> stdout
        xclip -o -selection clipboard
    fi
else
    echo "Remember to install xclip"
fi

A versão do script para OS X conta com o pbcopy e o pbpaste pré-instalados em todos os Macs.

#!/bin/bash
# OS X version
# Use this script to pipe in/out of the clipboard
#
# Usage: someapp | clipboard     # Pipe someapp's output into clipboard
#        clipboard | someapp     # Pipe clipboard's content into someapp
#

if [[ -p /dev/stdin ]] ; then
    # stdin is a pipe
    # stdin -> clipboard
    pbcopy
else
    # stdin is not a pipe
    # clipboard -> stdout
    pbpaste
fi

O uso do script é muito simples, uma vez que você simplesmente entra ou sai clipboardcomo mostra esses dois exemplos.

$ cat file | clipboard

$ clipboard | less

3
Eu uso os nomes pbcopye pbpasteno Linux para que ele funciona tanto para Linux e OS X.
StackedCrooked

Para fazer o script funcionar globalmente no ubuntu: * Salve-o em ~/.scripts/clipboard * Torne-o executável chmod +x ~/.scripts/clipboard para o bash: * adicione export PATH=$PATH:~/.scriptsno final do ~/.bashrc for fish: * adicione set PATH ~/.scripts $PATHao ~/.config/fish/fish.config Se algum arquivo ou pasta ainda não existir, apenas crie-o.
Hóquei

2
Você também pode envolver esse script como uma função clipboard(){ ... }e colá-lo .bashrc
Sebastian Nowak

Isso é muito parecido com o que eu fiz, mas eu permito o encadeamento date | cb | tee -a updates.log. Isso enviaria a datesaída do comando para a área de transferência e passaria para o tee -acomando que o anexa a um arquivo e o repassa para stdout. Mas é como um " tee à prova de vazamentos para a área de transferência", porque se você simplesmente não date | cbobtém saída. E, finalmente, também funciona cb > file.txt gist.github.com/RichardBronosky/…
Bruno Bronosky

Uma sugestão - retire o caractere de nova linha à direita para evitar executar o comando ao colar (por exemplo, se copiar e colar um caminho). Eu faço isso modificando o comando xclip -i -selection clipboardparaxargs echo -n | xclip -i -selection clipboard
Ivaylo Strandjev 25/05

23

Adicione isso ao seu ~/.bashrc:

# Now `cclip' copies and `clipp' pastes'
alias cclip='xclip -selection clipboard'
alias clipp='xclip -selection clipboard -o'

Agora, recorte p pastas ec c cópias - mas você também pode fazer coisas mais sofisticadas:

clipp | sed 's/^/    /' | cclip

↑ recua sua área de transferência; bom para sites sem o { }botão de estouro de pilha

Você pode adicioná-lo executando o seguinte:

printf "\nalias clipp=\'xclip -selection c -o\'\n" >> ~/.bashrc
printf "\nalias cclip=\'xclip -selection c -i\'\n" >> ~/.bashrc

Dê um exemplo de uso, por favor
Ulf Aslak

7

Estou usando o Parcellite e xselpara copiar a última mensagem de confirmação do gitmeu gerente da área de transferência (por algum motivo xclipnão funciona):

$ git log -1 --pretty=%B | xsel -i -b

7

Sem usar ferramentas externas, se você estiver se conectando ao SSH da visualização do servidor, este é um comando relativamente fácil:

Em um prompt de comando do Windows 7+:

ssh user@server cat /etc/passwd | clip

Isso colocará o conteúdo do arquivo remoto na área de transferência local.

(O comando requer a execução do Pageant para a chave, ou será solicitada uma senha.)


1
@AfshinMoazami, o título e a pergunta em si são genéricos. Somente as tags sugerem o sistema unix, e minha resposta cobre o caso quando você tenta obter a data DE um servidor unix para uma máquina Windows, o que pode ser útil para futuros leitores.
precisa saber é

1
Promovido porque sim, útil para administradores do Windows que só têm o Powershell para jogar localmente (embora agora com o LSW realmente funcional, eu possa entrar no bash diretamente do Powershell e fazer minhas coisas * nixy a partir daí).
Flith

Seu trabalho em prompt do DOS, bem como o bash git no Windows 10 ou sejaecho Hello World | clip

5

Para mac, este é um exemplo de maneira de copiar (na área de transferência) colar (da área de transferência) usando a linha de comando

Copie o resultado do pwdcomando para a área de transferência como

$ pwd | pbcopy

Use o conteúdo na área de transferência como

$ cd $(pbpaste)

3

Fiz uma pequena ferramenta fornecendo funcionalidade semelhante, sem usar o xclip ou o xsel. stdouté copiado para uma área de transferência e pode ser colado novamente no terminal. Vejo:

https://sourceforge.net/projects/commandlinecopypaste/

Observe que essa ferramenta não precisa de uma sessão X. A área de transferência pode ser usada apenas dentro do terminal e não deve ser colada Ctrl+Vou clique com o botão do meio do mouse em outras janelas X.


3

No Linux com o xclip instalado:

xclip -selection clipboard <arquivo


2

Com base nas postagens anteriores, acabei com a seguinte solução de alias de peso leve que pode ser adicionada a .bashrc:

if [ -n "$(type -P xclip)" ]
then
  alias xclip='xclip -selection clipboard'
  alias clipboard='if [ -p /dev/stdin ]; then xclip -in; fi; xclip -out'
fi

Exemplos:

# Copy
$ date | clipboard
Sat Dec 29 14:12:57 PST 2018

# Paste
$ date
Sat Dec 29 14:12:57 PST 2018

# Chain
$ date | clipboard | wc
   1       6      29

1

Eu venho de um histórico despojado do KDE e não tenho acesso xclip,xsel ou outro material extravagante. Eu tenho um TCSH Konsole para piorar a situação.

Requisitos: qdbus klipper xargs bash

Crie um executável bash foo.sh.

#!/bin/bash
qdbus org.kde.klipper /klipper setClipboardContents "$1" > /dev/null

Nota: necessário bash, pois o TCSH não suporta argumentos de várias linhas.

Seguido por um alias do TCSH no .cshrc.

alias clipboard xargs -0 /path/to/foo

Explicação:

xargs -0tubos stdin em um único argumento. Esse argumento é passado para o executável do bash, que envia uma solicitação de "copiar para a área de transferência" para klipperuso qdbus. O canal para /dev/nullnão imprimir o caractere de nova linha retornado pelo qdbusconsole.

Exemplo de uso:

ls | clipboard

Isso copia o conteúdo da pasta atual para a área de transferência.

Nota: Funciona apenas como um tubo. Use o executável bash diretamente se precisar copiar um argumento.


1

Eu costumo executar este comando quando tenho que copiar o meu ssh-key:

cat ~/.ssh/id_rsa.pub | pbcopy

ctrl+v em qualquer outro lugar.


1

no Wayland, o xcopy parece não funcionar, use wl-clipboard . por exemplo, no fedora

sudo dnf install wl-clipboard

tree | wl-copy

wl-paste > file

0

Para aqueles que usam o bash instalado no sistema Windows (conhecido como Windows Subsystem para Linux (WSL)), tentar o xclip apresentará um erro:

Error: Can't open display: (null)

Em vez disso, lembre-se de que o subsistema linux tem acesso aos executáveis ​​do Windows. É possível usar o clip.exe como

echo hello | clip.exe

que permite usar o comando colar (ctrl-v).


1
Observe que, se um xserver (como vcxsvr ou xming) estiver instalado no Windows, uma tela é exibida e o xclipboard está em execução, você pode realmente usar o xclip sem aparência.
bitbyte 16/09/18

0

Apenas para cobrir um caso extremo :) e porque o título da pergunta pergunta (pelo menos agora) como copiar a saída de um comando diretamente para a área de transferência.

Muitas vezes, acho útil copiar a saída do comando depois que ele já foi executado e não quero ou não posso executar o comando novamente.

Nesse cenário, podemos usar o gdm ou um utilitário semelhante do mouse e selecionar usando o mouse. apt-get install gdme, em seguida, clique com o botão direito do mouse ou nas combinações Cntrl + Shift + ce Cntrl + Shift + v para copiar e colar no terminal

Ou, qual é o método preferido para mim (como o mouse não pode selecionar corretamente dentro de um painel quando você tem vários painéis lado a lado e precisa selecionar mais de uma linha), usando o tmux, podemos copiar no buffer do tmux usando o padrão [, espaço, mova para selecionar, digite ou você pode selecionar um bloco de código. Além disso, isso é particularmente útil quando você está dentro de uma das faixas do multiplexador cli como o tmux E precisa selecionar um monte de texto, mas não os números das linhas (minha configuração do vim renderiza os números das linhas)

Depois disso, você pode usar o comando:

tmux save-buffer - | xclip -i

É claro que você pode fazer o alias de algo que você gosta ou ligar diretamente no arquivo de configuração do tmux

Isso serve apenas para fornecer uma resposta conceitual para cobrir esse caso extremo, quando não é possível executar o comando novamente. Se você precisar de exemplos de código mais específicos, informe-me

Felicidades

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.