Est-il possible de diriger vers/depuis le Presse-papiers dans Bash?
Que ce soit la tuyauterie vers/depuis un handle de périphérique ou en utilisant une application auxiliaire, je ne trouve rien.
Par exemple, si /dev/clip
était un périphérique liant le presse-papier, nous pourrions faire:
cat /dev/clip # Dump the contents of the clipboard
cat foo > /dev/clip # Dump the contents of "foo" into the clipboard
Vous pourriez avoir affaire à une profusion de presse-papiers. Je suppose que vous êtes probablement un utilisateur Linux qui souhaite placer des éléments dans le presse-papiers principal de X Windows. En règle générale, le Presse-papiers auquel vous voulez parler a un utilitaire qui vous permet de lui parler.
Dans le cas de X, il y a xclip
(et 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 utilisez Mac OS X, il existe pbcopy
.
Si vous êtes en mode terminal Linux (pas de X), cherchez gpm
ou screen qui a un presse-papier. Essayez la commande screen
readreg
.
Sous Windows 10+ ou cygwin, utilisez /dev/clipboard
ou clip
.
Assurez-vous que vous utilisez l'alias xclip="xclip -selection c"
sinon vous ne pouvez pas simplement utiliser Ctrl+v pour le coller dans un endroit différent.
echo test | xclip
Ctrl+v === test
# 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 .
Dans ~/.bash_aliases
, ajoutez:
alias setclip="xclip -selection c"
alias getclip="xclip -selection c -o"
N'oubliez pas de charger votre nouvelle configuration à l'aide de . ~/.bash_aliases
ou en redémarrant votre profil.
Dans ~/.config/fish/config.fish
, ajoutez:
abbr setclip "xclip -selection c"
abbr getclip "xclip -selection c -o"
N'oubliez pas de redémarrer votre instance de poisson en redémarrant votre terminal pour que les modifications soient appliquées.
Vous pouvez maintenant utiliser setclip
et getclip
, par exemple:
$ 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
Wow, je ne peux pas croire combien il y a de réponses à 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, c’est une réponse située dans l’un des commentaires écrits par un utilisateur appelé doug. Comme je l’ai trouvé très utile, j’ai décidé de reformuler ma réponse.
Installez l'utilitaire xcopy et lorsque vous êtes dans le terminal, entrez:
Copier
Thing_you_want_to_copy|xclip -selection c
Coller
myvariable=$(xclip -selection clipboard -o)
J'ai remarqué beaucoup de réponses recommandées pbpaste et pbcopy. Si vous utilisez ces utilitaires mais que, pour une raison quelconque, ils ne sont pas disponibles sur votre référentiel, 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)
Voici un script bash prêt à utiliser pour la lecture du presse-papier qui fonctionne sur plusieurs plates-formes. Veuillez éditer le script ici si vous ajoutez des fonctionnalités (par exemple, plusieurs 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 le sous-système Windows pour Linux, vous pouvez copier dans le presse-papiers avec clip.exe.
cat file | clip.exe
N'oubliez pas d'utiliser la commande |
pipe. Et pas une commande >
, car cela ne fonctionnera pas.
Sous Windows (avec Cygwin), essayez cat /dev/clipboard
ou echo "foo" > /dev/clipboard
comme indiqué dans l'article this .
Utilisez clipboard-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 tu peux faire
echo foo | clipboard
Si vous le souhaitez, vous pouvez créer un alias pour cb
en mettant les éléments suivants dans votre .bashrc
, .bash_profile
ou .zshrc
:
alias cb=clipboard
Pour Mac uniquement:
echo "Hello World" | pbcopy
pbpaste
Ceux-ci sont situés /usr/bin/pbcopy
et /usr/bin/pbpaste
.
Il existe différents presse-papiers dans Linux; le serveur X en a un, le gestionnaire de fenêtres peut en avoir un autre, etc. Il n'y a pas de périphérique standard.
Oh, oui, sur CLI, le programme d’écran a aussi son propre presse-papiers, de même que d’autres applications telles que Emacs et vi .
En X, vous pouvez utiliser xclip .
Vous pouvez consulter ce fil pour d’autres réponses possibles: http://unix.derkeiler.com/Newsgroups/comp.unix.Shell/2004-07/0919.html
Copier et coller dans le presse-papier sous Windows (Cygwin):
voir:
$ clip.exe -?
CLIP Description: redirige la sortie des outils de ligne de commande vers le Presse-papiers Windows. Ce texte peut ensuite être collé dans d’autres programmes. Liste de paramètres: /? Affiche ce message d'aide. Exemples: DIR | CLIP Place une copie de la liste du répertoire en cours dans le presse-papier de Windows. CLIP <README.TXT Place une copie du texte de readme.txt dans le presse-papier Windows.
Existe également getclip (peut être utilisé à la place de shift + ins!), Putclip (echo oaeuoa | putclip.exe pour le mettre en clip)
Ceci est un simple script Python 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 sauvegardé dans /usr/local/bin/clip
.). Vous pouvez diriger des éléments à enregistrer dans votre presse-papiers ...
echo "Hello World" | clip
Et vous pouvez diriger le contenu de votre presse-papiers vers un autre programme ...
clip | cowsay
_____________
< Hello World >
-------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
L'exécuter par lui-même produira simplement ce qu'il y a dans le presse-papier.
xsel -b
Fait le travail pour x11, il est généralement déjà installé. Un coup d’œil dans la page de manuel de xsel en vaut la chandelle.
À partir de ce fil, il existe une option qui ne nécessite pas l'installation d'un logiciel tiers gclip
/xclip
/xsel
.
Un script Perl (puisque Perl est généralement toujours installé)
use Win32::Clipboard;
print Win32::Clipboard::GetText();
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 comprend le code source: cmd_clip.Zip
Il y a deux façons. Parmi les moyens mentionnés, citons (je pense) tmux, screen, vim, emacs et le shell. Je ne connais ni emacs ni screen, je passerai donc en revue les trois autres.
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). La mémoire tampon utilisée pour ce mode est distincte et exclusive de tmux, ce qui ouvre de nombreuses possibilités et le rend plus polyvalent que les sélections X dans les bonnes situations.
Pour quitter ce mode, appuyez sur q; pour naviguer, utilisez votre liaison vim
ou emacs
(valeur par défaut = vim), donc hjkl
pour le déplacement, v/V/C-v
pour la sélection de caractère/ligne/bloc, etc. votre sélection, appuyez sur Enter pour copier et quitter le mode.
Pour coller à partir de ce tampon, utilisez prefix-]
.
Toute installation de X11
semble être livrée avec deux programmes par défaut: xclip
et xsel
(un peu comme il en va de même avec startx
et xinit
). La plupart des autres réponses mentionnent xclip
, et j'aime beaucoup xsel
pour sa brièveté, je vais donc couvrir xsel
.
De xsel (1x) :
Options d'entrée
-a, --append
ajouter l'entrée standard à la sélection. Implique - i .
-f, --suivre
ajouter à la sélection à mesure que l'entrée standard grandit. Implique - i .
-i, --input
lire l'entrée standard dans la sélection.
Options de sortie
-o, --output
écrire la sélection sur la sortie standard.
Options d'action
-c, --clear
effacer la sélection. Remplace toutes les options d'entrée.
-d, --delete
Demander que la sélection actuelle soit supprimée. Cela efface non seulement la sélection, mais demande également au programme dans lequel réside la sélection que le contenu sélectionné soit supprimé. Remplace toutes les options d'entrée.
Options de sélection
-p, --primary
opère sur la sélection PRIMAIRE (par défaut).
-s, --secondaire
opérer sur la sélection SECONDAIRE.
-b, --Clipboard
opérer sur la sélection CLIPBOARD.
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 la sortie.
Exemple: disons que je veux copier le résultat de foo
d'un TTY et le coller dans 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 téléscripteur?
Pour cet exemple, supposons 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
Ensuite, je peux Ctrl-V
-le dans le formulaire comme d'habitude.
Maintenant, disons que quelqu'un sur le site de support me donne une commande à exécuter 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
La commande de pizzas semble être une utilisation productive de la ligne de commande.
... passer à autre chose.
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 tout autre registre. 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`
Lier quelques combinaisons clés et vous devriez être bon.
sous macOS, utilisez pbpaste
par exemple:
mettre à jour le presse-papier
pbpaste | Ruby -ne ' puts "\|" + $_.split( )[1..4].join("\|") ' | pbcopy
prendre plaisir.
Si vous êtes comme moi et que vous travaillez sur un serveur Linux sans privilèges root et qu'il n'y a pas de xclip ni de gpm, vous pouvez résoudre ce problème en utilisant simplement un fichier temporaire. Par exemple:
$ echo "hello world" > ~/clip
$ echo `cat ~/clip`
hello world
J'ai trouvé une bonne référence: https://unix.stackexchange.com/questions/69111/
Dans mon cas, je voudrais coller du contenu dans le presse-papiers et voir ce qui y a été collé. J'ai donc également utilisé la commande tee
avec un descripteur de fichier:
echo "just a test" | tee >(xclip -i -selection clipboard)
>()
est une forme de substitution de processus. bash les remplace par le chemin d'accès à un descripteur de fichier qui est connecté à l'entrée standard du programme entre parenthèses.
La commande tee
_ _ commande votre commande vous permettant de "diriger son contenu" et de voir le résultat sur la sortie standard "stdout".
vous pouvez également créer des alias pour obtenir et écrire dans le presse-papiers, ce qui vous permet d'utiliser "pbcopy" et "pbpaste" comme si vous étiez sur MAC. Dans mon cas, lorsque j'utilise zsh, j'ai ceci sur mon fichier d'alias:
(( $+commands[xclip] )) && {
alias pbpaste='xclip -i -selection clipboard -o'
alias pbcopy='xclip -selection clipboard'
}
le (( $+command[name] ))
dans zsh teste si la commande "name" est installée sur votre système, puis les deux alias sont regroupés avec {}
. le &&
est un AND binaire, si a alors b, donc si vous avez xclip, les alias seront définis.
echo "another test" | tee >(pbcopy)
Pour obtenir le contenu de votre presse-papiers, tapez simplement:
pbpaste | "any-command-you-need-here"
Bien que> 1 an plus tard, je partage une solution légèrement différente. J'espère 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 du changement de session avec ctrlaltF7 - ctrlaltF8En fait, vous ne pouvez pas coller ce que vous avez copié.
Je suis venu avec la solution suivante rapide et sale, basée sur un tuyau nommé. C'est sûrement assez simple et brut, mais je l'ai trouvé fonctionnel:
user1@Host:~$ mkfifo /tmp/sharedClip
puis dans le terminal d'envoi
user1@Host:~$ cat > /tmp/sharedClip
enfin, dans le terminal de réception:
user2@Host:~$ cat /tmp/sharedClip
Maintenant, vous tapez ou collez quelque chose dans le premier terminal, et (après avoir appuyé sur return), il apparaîtra immédiatement dans le terminal de réception, à partir duquel vous pourrez copier/coller à nouveau où bon vous semble.
Bien sûr, cela ne prend pas uniquement le contenu du presse-papiers de l'utilisateur1 pour le rendre disponible dans le presse-papiers de l'utilisateur2, mais nécessite plutôt une paire supplémentaire de clics Coller et copier.
Il y a aussi xclip-copyfile .