web-dev-qa-db-fra.com

Pipe vers / depuis le Presse-papiers dans le script Bash

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
838
marcog

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 + CCtrl + 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 screenreadreg.

Sous Windows 10+ ou cygwin, utilisez /dev/clipboard ou clip.

770
lhunath

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

248
doug

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 .

Installer

Bash

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.

Poisson

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.

Usage

Vous pouvez maintenant utiliser setclip et getclip, par exemple:

$ echo foo | setclip
$ getclip
foo
160
tleb

Sur macOS, utilisez les commandes intégrées pbcopy et pbpaste .

Par exemple, si vous exécutez

cat ~/.bashrc | pbcopy

le contenu du fichier ~/.bashrc sera disponible pour être collé avec le raccourci Cmd + v.

132
jtruelove

Essayer

xclip

xclip - command line interface to X selections (clipboard) 

homme

36
Zoredache

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
22
Andrew_1510

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)
14
thebunnyrules

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
11
Wolfgang Fahl

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.

11
knowledge_is_power

Sous Windows (avec Cygwin), essayez cat /dev/clipboard ou echo "foo" > /dev/clipboard comme indiqué dans l'article this .

9
Norman H

2018 réponse

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

9
Evan Conrad

Pour Mac uniquement:

echo "Hello World" | pbcopy
pbpaste

Ceux-ci sont situés /usr/bin/pbcopy et /usr/bin/pbpaste.

8
nyitguy

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

8
Sunny Milenov

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)

5
Stenemo

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.

4
tysweat
  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.

4
Martin Fischer

À 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();
2
VonC

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

2
jeng

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.

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). 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-].

Coquille

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.

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 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.

2
Braden Best

sous macOS, utilisez pbpaste

par exemple:

mettre à jour le presse-papier

pbpaste | Ruby -ne ' puts "\|" + $_.split( )[1..4].join("\|") ' | pbcopy

prendre plaisir.

1
jiahut

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
1
horta

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"
1
SergioAraujo

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.

0
lurix66

Il y a aussi xclip-copyfile .

0
Jonathon Reinhart