¿Cómo puedo canalizar la salida de un comando en mi portapapeles y pegarlo cuando uso un terminal? Por ejemplo:
cat file | clipboard
apt install xclip
ycat file | xclip -sel clip
¿Cómo puedo canalizar la salida de un comando en mi portapapeles y pegarlo cuando uso un terminal? Por ejemplo:
cat file | clipboard
apt install xclip
ycat file | xclip -sel clip
Respuestas:
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 xclip
para 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 v
primero como un comando y luego lo sustituye en el lugar para cd
su uso.
Solo copie el contenido al X
portapapeles
cat file | xclip
Si desea pegar en otro lugar que no sea una X
aplicación, pruebe esta:
cat file | xclip -selection clipboard
alias "cs=xclip -selection clipboard"
y alias "vs=xclip -o -selection clipboard"
facilitar la copia / pegado desde el portapapeles del sistema
En OS X, use pbcopy
; pbpaste
va en la dirección opuesta.
pbcopy < .ssh/id_rsa.pub
pbcopy < .ssh/id_rsa.pub
pbcopy < git merge-base master some-branch
git merge-base master some-branch | pbcopy
He creado una herramienta para Linux / OSX / Cygwin que es similar a algunas de estas otras pero ligeramente única. Lo llamo cb
y 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.
_copy(){
cat | xclip -selection clipboard
}
_paste(){
xclip -selection clipboard -o
}
_copy(){
cat | pbcopy
}
_paste(){
pbpaste
}
_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".
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
$ date | cb
# clipboard contains: Tue Jan 24 23:00:00 EST 2017
# 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
$ 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
(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
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 clipboard
como se muestra en estos dos ejemplos.
$ cat file | clipboard
$ clipboard | less
pbcopy
y pbpaste
en Linux para que funcione tanto para Linux como para OS X.
~/.scripts/clipboard
* Haga que sea ejecutable chmod +x ~/.scripts/clipboard
para bash: * agregue export PATH=$PATH:~/.scripts
al final de ~/.bashrc
for fish: * add set PATH ~/.scripts $PATH
to ~/.config/fish/fish.config
Si alguno de los archivos o carpetas no existe, simplemente créelos.
clipboard(){ ... }
y pegarlo en .bashrc
date | cb | tee -a updates.log
. Eso enviaría el date
resultado del comando al portapapeles y lo pasaría al tee -a
comando 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 | cb
no obtendrá salida. Y finalmente también lo hace cb > file.txt
gist.github.com/RichardBronosky/…
xclip -i -selection clipboard
axargs echo -n | xclip -i -selection clipboard
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
Estoy usando Parcellite y xsel
para copiar el último mensaje de confirmación de git
mi administrador del portapapeles (por alguna razón xclip
no funciona):
$ git log -1 --pretty=%B | xsel -i -b
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).
Hice una pequeña herramienta que proporciona una funcionalidad similar, sin usar xclip o xsel. stdout
se 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.
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
Vengo de un fondo despojado de KDE y no tienen acceso a xclip
, xsel
o 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 -0
canaliza stdin en un solo argumento. Este argumento se pasa al ejecutable bash que envía una solicitud de "copia al portapapeles" para klipper
usar qdbus
. La canalización hacia /dev/null
es no imprimir el carácter de nueva línea devuelto por qdbus
a 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.
Normalmente ejecuto este comando cuando tengo que copiar mi ssh-key
:
cat ~/.ssh/id_rsa.pub | pbcopy
ctrl+v
en cualquier otro lugar.
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
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).
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 gdm
y 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