Tuyau vers / depuis le presse-papiers dans le script Bash
Est-il possible de diriger vers/depuis le presse-papiers dans Bash?
Qu'il s'agisse de la tuyauterie vers/depuis une poignée de périphérique ou de l'utilisation d'une application auxiliaire, Je ne trouve rien.
Par exemple, si /dev/clip
était un périphérique reliant le presse-papiers, nous pourrions faire:
cat /dev/clip # Dump the contents of the clipboard
cat foo > /dev/clip # Dump the contents of "foo" into the clipboard
23 réponses
Vous êtes un peu ambigu. Je m'attends à ce que vous soyez probablement un utilisateur Linux à L'intérieur de X qui veut mettre des choses dans le presse-papiers X PRIMARY
.
Il est important de comprendre que bash
n'a pas de presse-papiers. Il n'y a pas une telle chose comme "le" presse-papiers, parce que {[1] } peut fonctionner sur Windows, Mac OS X, beaucoup d'autres systèmes d'exploitation, à L'intérieur X, à L'extérieur X,... Sans oublier que X lui-même a trois presse-papiers différents. Il y a une multitude de presse-papiers avec lesquels vous pourriez avoir affaire. Habituellement le presse papiers que vous voulez parler a un utilitaire qui vous permet de parler à elle.
Dans le cas de X, oui, il y a xclip
(et d'autres). xclip -selection c
enverra des données au presse-papiers qui fonctionne avec Ctrl-C, Ctrl-V dans la plupart des applications.
Si vous essayez de parler au presse-papiers de Mac OS X, il y a pbcopy
.
Si vous êtes en mode terminal Linux (pas de X) alors peut - être que vous devez regarder dans gpm
.
Il y a aussi GNU screen
qui a un presse-papiers. Pour mettre des choses là-dedans, regardez la commande screen
"readreg
".
Sous Windows / cygwin, utilisez /dev/clipboard
ou clip
pour les nouvelles versions de Windows (Au Moins Windows 10).
Assurez-vous que vous utilisez alias xclip="xclip -selection c"
sinon, vous ne pouvez pas simplement utiliser pour Ctrl+v pour collez-le dans un endroit différent.
echo test | xclip
Ctrl+v === test
Installer
# You can install xclip using `apt-get`
apt-get install xclip
# or `pacman`
pacman -S xclip
# or `dnf`
dnf install xclip
Si vous n'avez pas accès à apt-get
ni pacman
ni dnf
, les sources sont disponibles sur sourceforge.
Configuration
Bash
Dans ~/.bash_aliases
, Ajouter:
alias setclip="xclip -selection c"
alias getclip="xclip -selection c -o"
n'oubliez pas de charger votre nouvelle configuration en utilisant . ~/.bash_aliases
ou en redémarrant votre profil.
Poisson
Dans ~/.config/fish/config.fish
, ajouter:
abbr setclip "xclip -selection c"
abbr getclip "xclip -selection c -o"
n'oubliez pas de redémarrer votre instance fish en redémarrant votre terminal pour appliquer.
Utilisation
Vous pouvez maintenant utiliser setclip
et getclip
, e.g:
$ echo foo | setclip
$ getclip
foo
Xsel sur Debian/Ubuntu/Mint
# append to clipboard:
cat 'the file with content' | xsel -ib
# or type in the happy face :) and ...
echo 'the happy face :) and content' | xsel -ib
# show clipboard
xsel -b
# Get more info:
man xsel
Installer
sudo apt-get install xsel
Voici un script bash prêt à l'emploi pour lire le presse-papiers qui fonctionne sur plusieurs plates-formes. Veuillez modifier le script ici si vous ajoutez des fonctionnalités (par exemple, plus de plates-formes).
#!/bin/bash
# WF 2013-10-04
# multi platform clipboard read access
# supports
# Mac OS X
# git shell / Cygwin (Windows)
# Linux (e.g. Ubuntu)
#
# display an error
#
error() {
echo "error: $1" 1>&2
exit 1
}
#
# getClipboard
#
function getClipboard() {
os=`uname`
case $os in
# git bash (Windows)
MINGW32_NT-6.1)
cat /dev/clipboard;;
# Mac OS X
Darwin*)
pbpaste;;
# Linux
Linux*)
# works only for X clipboard - a check that X is running might be due
xclip -o;;
*)
error "unsupported os $os";;
esac
}
tmp=/tmp/clipboard$$
getClipboard >$tmp
cat $tmp
# comment out for debugging
rm $tmp
Sur Windows (avec Cygwin) essayez
cat /dev/clipboard
ou echo "foo" > /dev/clipboard
comme mentionné dans Cet article.
Pour Mac uniquement:
echo "Hello World" | pbcopy
pbpaste
Ils sont situés /usr/bin/pbcopy
et /usr/bin/pbpaste
.
Il existe différents presse-papiers sous Linux; le serveur X en a un, le gestionnaire de fenêtres peut en avoir un autre, etc. Il n'existe pas de standard de l'appareil.
Oh, oui, sur CLI, le programme d'écran a son propre presse-papiers, tout comme d'autres applications comme Emacs et vi .
Dans X, vous pouvez utiliser xclip.
Vous pouvez vérifier ce fil pour d'autres réponses possibles: http://unix.derkeiler.com/Newsgroups/comp.unix.shell/2004-07/0919.html
Wow, je ne peux pas croire combien de réponses il y a pour cette question. Je ne peux pas dire que je les ai tous essayés mais j'ai essayé le top 3 ou 4 et aucun d'entre eux ne fonctionne pour moi. Ce qui a fonctionné pour moi était une réponse située dans l'un des commentaires écrits par un utilisateur appelé doug. Comme je l'ai trouvé si utile, j'ai décidé de reformuler dans une réponse.
Installez l'utilitaire xcopy et lorsque vous êtes dans le Terminal, Entrez:
Copie
Thing_you_want_to_copy|xclip -selection c
Coller
myvariable=$(xclip -selection clipboard -o)
, j'ai remarqué beaucoup de réponses recommandé pbpaste et pbcopy. Si vous êtes dans ces utilitaires, mais pour une raison quelconque, ils ne sont pas disponibles sur votre repo, vous pouvez toujours créer un alias pour les commandes xcopy et les appeler pbpaste et pbcopy.
alias pbcopy="xclip -selection c"
alias pbpaste="xclip -selection clipboard -o"
Alors cela ressemblerait à ceci:
Thing_you_want_to_copy|pbcopy
myvariable=$(pbpaste)
Copier et coller dans le presse-papiers dans Windows (Cygwin):
Voir:
$ clip.exe?
CLIP Description: Redirige la sortie des outils de ligne de commande vers le presse-papiers Windows. Cette sortie de texte peut ensuite être collée dans d'autres programmes. Liste Des Paramètres: /? Affiche ce message d'aide. Exemple: DIR / CLIP place une copie du répertoire courant liste dans le presse-papiers de Windows. CLIP
Existe aussi getclip (peut être utilisé à la place de shift+ins!), putclip (echo oaeuoa / putclip.exe pour le mettre dans le clip)
Sur le sous-système Windows pour Linux, vous pouvez copier dans le presse-papiers avec clip.EXE.
cat file | clip.exe
Gardez à l'esprit d'utiliser la |
tuyau de commande. Et pas une commande >
, puisque cela ne fonctionnera pas.
C'est un script Python simple qui fait exactement ce dont vous avez besoin:
#!/usr/bin/python
import sys
# Clipboard storage
clipboard_file = '/tmp/clipboard.tmp'
if(sys.stdin.isatty()): # Should write clipboard contents out to stdout
with open(clipboard_file, 'r') as c:
sys.stdout.write(c.read())
elif(sys.stdout.isatty()): # Should save stdin to clipboard
with open(clipboard_file, 'w') as c:
c.write(sys.stdin.read())
Enregistrez ceci en tant qu'exécutable quelque part dans votre chemin (je l'ai enregistré dans /usr/local/bin/clip
. Vous pouvez envoyer des choses à enregistrer dans votre presse-papiers...
echo "Hello World" | clip
Et vous pouvez diriger ce qui est dans votre presse-papiers vers un autre programme...
clip | cowsay
_____________
< Hello World >
-------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
L'exécuter seul affichera simplement ce qui est dans le presse-papiers.
xsel -b
Fait le travail pour x11, il est principalement déjà installé. Un coup d'oeil dans la page de manuel de xsel vaut l'effort.
Si vous êtes comme moi et que vous exécutez sur un serveur linux sans privilèges root et qu'il n'y a pas de xclip ou de gpm, vous pouvez contourner ce problème en utilisant simplement un fichier temporaire. Par exemple:
$ echo "hello world" > ~/clip
$ echo `cat ~/clip`
hello world
Quelques programmes Windows que j'ai écrits il y a des années. Ils vous permettent de vider, pousser, ajouter et imprimer le presse-papiers. Cela fonctionne comme ceci:
dumpclip | perl -pe "s/monkey/chimp/g;" | pushclip
Il inclut le code source: cmd_clip.zip
Il y a deux façons. Certaines des façons qui ont été mentionnées incluent (je pense) tmux, screen, vim, emacs et le shell. Je ne connais pas emacs ou screen, donc je vais passer en revue les trois autres.
Tmux
Bien qu'il ne s'agisse pas D'une sélection X, tmux dispose d'un mode de copie accessible via prefix-[
(prefix
est Ctrl+B par défaut). Le tampon utilisé pour ce mode est séparé et exclusif à tmux, ce qui ouvre pas mal de possibilités et le rend plus polyvalent que le X sélections dans les bonnes situations.
Pour quitter ce mode, frappé q; pour naviguer, utilisez votre vim
ou emacs
liaison (par défaut = vim), donc hjkl
pour le mouvement, v/V/C-v
pour des caractères/ligne/sélection de bloc, etc. Lorsque vous avez votre sélection, appuyez sur entrez pour copier et quitter le mode.
Pour coller à partir de ce tampon, utilisez prefix-]
.
Coquille
Toute installation de X11
semble venir avec deux programmes par défaut: xclip
et xsel
(un peu comme la façon dont cela vient avec startx
et xinit
). La plupart des autres réponses mention xclip
, et j'aime vraiment xsel
, pour sa concision, je vais couvrir xsel
.
À Partir de xsel(1x):
Options D'entrée
- a, -- append
Ajoute une entrée standard à la sélection. Implique -i.
- f, -- suivre
Ajouter à la sélection à mesure que l'entrée standard augmente. Implique -i.
- i, -- input
Lire l'entrée standard dans la sélection.
Options de sortie
- o, -- sortie
Ecrire la sélection dans la sortie standard.
Options D'Action
- c, -- effacer
Effacer la sélection. Remplace toutes les options d'entrée.
-d, --delete
Demande que la sélection actuelle soit supprimée. Cela efface non seulement la sélection, mais demande également au programme dans lequel la sélection réside que le contenu sélectionné sera supprimé. Remplace toutes les options d'entrée.
Options de sélection
- p, -- primaire
Fonctionne sur la sélection primaire (par défaut).
-s, --secondaire
Opérer sur la sélection secondaire.
-b, --presse-papiers
Fonctionne sur la sélection du presse-papiers.
Et c'est à peu près tout ce que vous devez savoir. p
(ou rien) pour PRIMARY
, s
pour SECONDARY
, b
pour CLIPBOARD
, o
pour sortie.
Exemple: disons que je veux copier la sortie de foo
à partir d'un TTY et la coller sur une page Web pour un rapport de bogue. Pour ce faire, il serait idéal de copier vers / depuis la session TTY/X. Donc, la question devient Comment puis-je accéder au presse-papiers à partir du TTY?
Pour cet exemple, nous supposerons que la session X est affichée :1
.
$ foo -v
Error: not a real TTY
details:
blah blah @ 0x0000000040abeaf4
blah blah @ 0x0000000040abeaf8
blah blah @ 0x0000000040abeafc
blah blah @ 0x0000000040abeb00
...
$ foo -v | DISPLAY=:1 xsel -b # copies it into clipboard of display :1
Alors je peux Ctrl-V
dans la forme comme d'habitude.
Maintenant, dites que quelqu'un sur le site de support me donne une commande pour exécutez pour résoudre le problème. C'est compliqué et long.
$ DISPLAY=:1 xsel -bo
sudo foo --update --clear-cache --source-list="http://foo-software.com/repository/foo/debian/ubuntu/xenial/164914519191464/sources.txt"
$ $(DISPLAY=:1 xsel -bo)
Password for braden:
UPDATING %%%%%%%%%%%%%%%%%%%%%%% 100.00%
Clearing cache...
Fetching sources...
Reticulating splines...
Watering trees...
Climbing mountains...
Looking advanced...
Done.
$ foo
Thank you for your order. A pizza should arrive at your house in the next 20 minutes. Your total is $6.99
Pizza de commande semble être une utilisation productive de la ligne de commande.
...aller de l'avant.
Vim
Si compilé avec +clipboard
(C'est important! Vérifiez votre vim --version
), Vim devrait avoir accès aux sélections X PRIMARY
et CLIPBOARD
. Les deux sélections sont accessibles à partir des registres *
et +
, respectivement, et peuvent être écrites et lues à votre guise comme n'importe quel autre inscrire. Par exemple:
:%y+ ; copy/yank (y) everything (%) into the CLIPBOARD selection (+)
"+p ; select (") the CLIPBOARD selection (+) and paste/put it
ggVG"+y ; Alternative version of the first example
Si votre copie de vim ne prend pas directement en charge l'accès aux sélections X, ce n'est pas la fin du monde. Vous pouvez simplement utiliser la technique xsel
comme décrit dans la dernière section.
:r ! xsel -bo ; read (r) from the stdout of (!) `xsel -bo`
:w ! xsel -b ; write (w) to the stdin of (!) `xsel -b`
Liez quelques combos clés et vous devriez être bon.
À partir de ce thread, il existe une option qui ne nécessite aucune installation gclip
/xclip
/xsel
logiciel tiers.
Un script perl (puisque perl est généralement toujours installé)
use Win32::Clipboard;
print Win32::Clipboard::GetText();
2018 réponse
Utiliser presse-papiers-cli. Il fonctionne avec macOS, Windows, Linux, OpenBSD, FreeBSD et Android sans aucun problème réel.
Installez-le avec:
npm install -g clipboard-cli
, Alors vous pouvez faire
echo foo | clipboard
Si vous le souhaitez, vous pouvez alias cb
en mettant la ligne suivante dans votre .bashrc
, .bash_profile
, ou .zshrc
:
alias cb=clipboard
Dans macOS utilisez pbpaste
Par exemple:
Mettre à jour le presse-papiers
pbpaste | ruby -ne ' puts "\|" + $_.split( )[1..4].join("\|") ' | pbcopy
Profitez.
Bien que > 1 an plus tard, je partage une solution légèrement différente. Espérons que cela est utile pour quelqu'un.
Hier, je me suis retrouvé avec la question: " Comment partager le presse-papiers entre différentes sessions utilisateur?". Lors de la commutation entre les sessions avec ctrlaltF7 - ctrlaltF8, en fait, vous ne pouvez pas coller ce que vous avez copié.
J'ai trouvé la solution quick & dirty suivante, basée sur un tuyau nommé. Il est sûrement assez nu et cru, mais je l'ai trouvé fonctionnel:
user1@host:~$ mkfifo /tmp/sharedClip
Puis dans le terminal d'envoi
user1@host:~$ cat > /tmp/sharedClip
, Dernier, dans le terminal de réception:
user2@host:~$ cat /tmp/sharedClip
Maintenant, vous tapez ou collez n'importe quoi dans le premier terminal, et (après avoir appuyé sur return), il apparaîtra immédiatement dans le terminal de réception, d'où vous pourrez copier/coller à nouveau n'importe où.
Bien sûr, cela ne prend pas seulement strictement le contenu du presse-papiers de user1 pour le rendre disponible dans user2 presse-papiers, mais il nécessite plutôt une paire supplémentaire de clics coller et copier.