¿Cómo puedo copiar la salida de un comando directamente en mi portapapeles?

529

¿Cómo puedo canalizar la salida de un comando en mi portapapeles y pegarlo cuando uso un terminal? Por ejemplo:

cat file | clipboard
Leyenda
fuente
posible duplicado de Pipe to / from Clipboard
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
posible duplicado de superuser.com/questions/104981/…
Champ
Acabo de hacer una pregunta relacionada, ya que no puedo hacer que xclip funcione al iniciar sesión en Ubuntu desde Git Bash en Windows: stackoverflow.com/q/60117294/470749
Ryan
1
Guarde el contenido del archivo en el portapapeles. apt install xclipycat file | xclip -sel clip
EsmaeelE

Respuestas:

598

Siempre quise hacer esto y encontré una manera agradable y fácil de hacerlo. Escribí el procedimiento completo en caso de que alguien más lo necesite.

Primero instale un programa de 16 kB llamado xclip:

sudo apt-get install xclip

Luego puede canalizar la salida xclippara copiarla en el portapapeles:

cat file | xclip

Para pegar el texto que acaba de copiar, deberá usar:

xclip -o

Para simplificar la vida, puede configurar un alias en su archivo .bashrc como lo hice yo:

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

Para ver qué tan útil es esto, imagine que quiero abrir mi ruta actual en una nueva ventana de terminal (puede haber otras formas de hacerlo como Ctrl+ Ten algunos sistemas, pero esto es solo para fines ilustrativos):

Terminal 1:
pwd | c

Terminal 2:
cd `v`

Observe el ` ` alrededor v. Esto se ejecuta vprimero como un comando y luego lo sustituye en el lugar para cdsu uso.

Solo copie el contenido al Xportapapeles

cat file | xclip

Si desea pegar en otro lugar que no sea una Xaplicación, pruebe esta:

cat file | xclip -selection clipboard
Leyenda
fuente
146
"cat file | xclip" solo copia el contenido en el portapapeles 'X', si quieres pegarlo en otro lugar que no sea una aplicación 'X', prueba con este: "cat file | xclip -selection portapapeles"
khotyn
55
¡Su elección de manija es apropiada!
Matt Joiner
44
Si desea eliminar el carácter de nueva línea para poder pegar y editar directamente el resultado de "pwd | c", puede hacer "pwd | tr -d '\ n' | xclip -selection c"
Anake
12
también definir alias "cs=xclip -selection clipboard"y alias "vs=xclip -o -selection clipboard"facilitar la copia / pegado desde el portapapeles del sistema
Yibo Yang
1
¿Qué pasa con una solución donde no tengo acceso a sudo y xclip no está instalado?
DanGordon el
179

En OS X, use pbcopy; pbpasteva en la dirección opuesta.

pbcopy < .ssh/id_rsa.pub
DavidPhillipOster
fuente
14
Sip! Así por ejemplo:pbcopy < .ssh/id_rsa.pub
doublejosh
no funciona para la salida de comandos aunque, por ejemplopbcopy < git merge-base master some-branch
Ben
si usted está utilizando tmux, no funcionará a menos que vuelva a conectar su sesión: superuser.com/a/413233/146254
Atav32
1
también puede usar cat, si ya trabaja con él: cat file.txt | pbcopy
rtrigoso
3
Sé que el comentario tiene 5 años, pero en caso de que alguien se tope con esto en el futuro, para usarlo con la salida del comando, hazlogit merge-base master some-branch | pbcopy
Sam
62

He creado una herramienta para Linux / OSX / Cygwin que es similar a algunas de estas otras pero ligeramente única. Lo llamo cby se puede encontrar en este github gist .

En esa esencia, demuestro cómo copiar y pegar a través de la línea de comandos usando Linux, macOS y 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 solo pretendía mencionar esto en mi comentario a la respuesta de Bob Enohp . Pero luego me di cuenta de que debería agregar un LÉAME a mi esencia. Dado que el editor de Gist no ofrece una vista previa de Markdown, utilicé el cuadro de respuesta aquí y después de copiarlo / pegarlo en mi idea principal, "también podría enviar la respuesta".

cb

Una camiseta a prueba de fugas en el portapapeles

Este script está modelado después tee(ver man tee).

Es como sus comandos normales de copiar y pegar, pero unificado y capaz de detectar cuándo desea que se pueda encadenar

Ejemplos

Copiar

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

Pegar

# 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

Encadenamiento

$ 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 a través de la redirección de archivos

(cronológicamente tenía sentido demostrar esto al 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
Bruno Bronosky
fuente
Esto funcionó perfecto para mí para copiar una salida de comando al portapapeles en la terminal en macOS, ¡gracias!
Joshua Dyck
46

Escribí este pequeño script que elimina las conjeturas de los comandos copiar / pegar.

La versión de Linux del script se basa en que xclip ya está instalado en su sistema. El guión se llama portapapeles.

#!/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

La versión de OS X de la secuencia de comandos se basa en pbcopy y pbpaste, que están preinstalados en todos los Mac.

#!/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

Usar el script es muy simple, ya que simplemente entra o sale clipboardcomo se muestra en estos dos ejemplos.

$ cat file | clipboard

$ clipboard | less
Bob Enohp
fuente
3
Uso los nombres pbcopyy pbpasteen Linux para que funcione tanto para Linux como para OS X.
StackedCrooked
Para hacer que el script funcione globalmente en ubuntu: * Guárdelo en ~/.scripts/clipboard * Haga que sea ejecutable chmod +x ~/.scripts/clipboard para bash: * agregue export PATH=$PATH:~/.scriptsal final de ~/.bashrc for fish: * add set PATH ~/.scripts $PATHto ~/.config/fish/fish.config Si alguno de los archivos o carpetas no existe, simplemente créelos.
Hockey
2
También puede envolver este script como una función clipboard(){ ... }y pegarlo en .bashrc
Sebastian Nowak
Esto es muy similar al que hice, pero permito encadenar date | cb | tee -a updates.log. Eso enviaría el dateresultado del comando al portapapeles y lo pasaría al tee -acomando que lo agrega a un archivo y lo pasa a él stdout. Pero es como una " camiseta a prueba de fugas en el portapapeles" porque si lo hace, date | cbno obtendrá salida. Y finalmente también lo hace cb > file.txt gist.github.com/RichardBronosky/…
Bruno Bronosky
Una sugerencia: elimine el carácter de nueva línea final para evitar ejecutar el comando al pegar (por ejemplo, si copia una ruta). Lo hago modificando el comando xclip -i -selection clipboardaxargs echo -n | xclip -i -selection clipboard
Ivaylo Strandjev
23

Agregue esto a su ~/.bashrc:

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

Ahora recorte las pastas p y las copias c , pero también puede hacer cosas más elegantes:

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

↑ sangra tu portapapeles; bueno para sitios sin { }botón de desbordamiento de pila

Puede agregarlo ejecutando esto:

printf "\nalias clipp=\'xclip -selection c -o\'\n" >> ~/.bashrc
printf "\nalias cclip=\'xclip -selection c -i\'\n" >> ~/.bashrc
usuario3276552
fuente
Dé un ejemplo de uso, por favor
Ulf Aslak
7

Estoy usando Parcellite y xselpara copiar el último mensaje de confirmación de gitmi administrador del portapapeles (por alguna razón xclipno funciona):

$ git log -1 --pretty=%B | xsel -i -b
Michal Przybylowicz
fuente
7

Sin usar herramientas externas, si se está conectando a la vista de servidor SSH, este es un comando relativamente fácil:

Desde un símbolo del sistema de Windows 7+:

ssh user@server cat /etc/passwd | clip

Esto colocará el contenido del archivo remoto en su portapapeles local.

(El comando requiere ejecutar el concurso para la clave, o le pedirá una contraseña).

d.raev
fuente
1
@AfshinMoazami, el título y la pregunta en sí son genéricos, solo las etiquetas insinúan para el sistema Unix, y mi respuesta cubre el caso cuando intenta obtener la fecha DESDE un servidor Unix a una máquina Windows, lo que puede ser útil para futuros lectores.
d.raev
1
Votado porque sí, útil para los administradores de Windows que solo tienen Powershell para jugar localmente (aunque ahora con LSW realmente funcional, puedo pasar a bash directamente desde Powershell y hacer mis cosas * nixy desde allí).
flith
Está funcionando en el indicador de DOS, así como en git bash en Windows 10, es decirecho Hello World | clip
5

Para mac, esta es una forma de ejemplo para copiar (en el portapapeles) pegar (desde el portapapeles) usando la línea de comandos

Copie el resultado del pwdcomando al portapapeles como

$ pwd | pbcopy

Usa el contenido en el portapapeles como

$ cd $(pbpaste)
mcvkr
fuente
3

Hice una pequeña herramienta que proporciona una funcionalidad similar, sin usar xclip o xsel. stdoutse copia en un portapapeles y se puede pegar nuevamente en el terminal. Ver:

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

Tenga en cuenta que esta herramienta no necesita una sesión X. El portapapeles solo se puede usar dentro del terminal y no se debe pegar Ctrl+Vni hacer clic con el botón central del mouse en otras ventanas X.

Dirk Duschinger
fuente
3

En Linux con xclip instalado:

xclip -selection portapapeles <archivo

tristobal
fuente
2

Basado en publicaciones anteriores, terminé con la siguiente solución de alias de peso ligero que se puede agregar 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

Ejemplos:

# 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
kornieff
fuente
1

Vengo de un fondo despojado de KDE y no tienen acceso a xclip, xselo la otra materia de lujo. Tengo un TCSH Konsole para empeorar las cosas.

Requisitos: qdbus klipper xargs bash

Crea un bash ejecutable foo.sh.

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

Nota: Esto debe ser bash ya que TCSH no admite argumentos de varias líneas.

Seguido de un alias TCSH en el .cshrc.

alias clipboard xargs -0 /path/to/foo

Explicación:

xargs -0canaliza stdin en un solo argumento. Este argumento se pasa al ejecutable bash que envía una solicitud de "copia al portapapeles" para klipperusar qdbus. La canalización hacia /dev/nulles no imprimir el carácter de nueva línea devuelto por qdbusa la consola.

Ejemplo de uso:

ls | clipboard

Esto copia el contenido de la carpeta actual en el portapapeles.

Nota: Solo funciona como una tubería. Use el ejecutable bash directamente si necesita copiar un argumento.

Ryan Dsouza
fuente
1

Normalmente ejecuto este comando cuando tengo que copiar mi ssh-key:

cat ~/.ssh/id_rsa.pub | pbcopy

ctrl+v en cualquier otro lugar.

Yamen Ashraf
fuente
1

en Wayland xcopy no parece funcionar, use wl-clipboard en su lugar. por ejemplo, en fedora

sudo dnf install wl-clipboard

tree | wl-copy

wl-paste > file
Jens Timmerman
fuente
0

Para aquellos que usan bash instalado en su sistema de Windows (conocido como Windows Subsystem for Linux (WSL)), intentar xclip dará un error:

Error: Can't open display: (null)

En cambio, recuerde que el subsistema de Linux tiene acceso a los ejecutables de Windows. Es posible usar clip.exe como

echo hello | clip.exe

que le permite usar el comando pegar (ctrl-v).

DFeng
fuente
1
Tenga en cuenta que si un servidor x (como vcxsvr o xming) está instalado en Windows, hay una pantalla activa y xclipboard se está ejecutando, en realidad puede usar xclip aparentemente.
bitbyte
0

Solo para cubrir un caso límite :) y porque el título de la pregunta pregunta (al menos ahora) cómo copiar la salida de un comando directamente al portapapeles.

Muchas veces encuentro útil copiar la salida del comando después de que ya se ejecutó y no quiero o no puedo ejecutar el comando nuevamente.

Para este escenario, podemos usar gdm o una utilidad de mouse similar y seleccionar usar el mouse. apt-get install gdmy luego el clic derecho o las combinaciones Cntrl + Shift + c y Cntrl + Shift + v para copiar y pegar en el terminal

O, cuál es el método preferido para mí (ya que el mouse no puede seleccionar correctamente dentro de un panel cuando tiene varios paneles uno al lado del otro y necesita seleccionar más de una línea), usando tmux podemos copiar en el búfer tmux usando el estándar [, espacio, mover para seleccionar, ingresar o puede seleccionar un bloque de código. Además, esto es particularmente útil cuando está dentro de uno de los carriles del multiplexor cli como tmux Y necesita seleccionar un montón de texto, pero no los números de línea (mi configuración de vim representa los números de línea)

Después de esto, puede usar el comando:

tmux save-buffer - | xclip -i

Por supuesto, puede asignarle un alias a algo que le guste o vincular directamente en el archivo de configuración de tmux

Esto es solo para darle una respuesta conceptual para cubrir este caso límite cuando no es posible ejecutar el comando nuevamente. Si necesita ejemplos de código más específicos, avíseme

Salud

George Mogilevsky
fuente