web-dev-qa-db-fra.com

Accès au Presse-papiers en ligne de commande

Je construis un outil de ligne de commande afin de rendre certaines de mes tâches plus efficaces. Je dois pouvoir écrire du contenu dans le presse-papiers, mais pour une raison quelconque, cela ne fonctionne pas pour moi.

J'ai essayé d'installer xclip et xsel, mais les deux ont le même comportement: ils peuvent très bien lire/écrire dans le presse-papiers, mais je ne peux pas y accéder à partir de l'interface graphique principale d'Ubuntu.

Je l'ai aussi essayé dans le terminal ...

echo "hello" | xclip

Puis si Ctrl+Shift+V, Je reçois mon entrée de presse-papiers originale, pas "bonjour". Mais si j'essaie de récupérer le contenu de xclip, cela fonctionne bien.

L'objectif principal est de faire en sorte que le contenu puisse être collé dans Firefox ou tout autre programme basé sur une interface graphique que j'utilise.

Toute aide serait appréciée!

Merci

7
Adrian Schneider

Bien, il existe plusieurs presse-papiers dans X :) Celui xclip copie le texte par défaut est "tampon de sélection" - en général, il vous suffit de sélectionner du texte avec votre souris, puis de le coller avec le bouton central de la souris. Ce tampon est distinct de celui à partir duquel vous pouvez coller avec Ctrl-Maj-V.

Essayer

echo "hello" | xclip -selection clipboard

regarde aussi

man xclip

pour plus de détails sur xclip

15
Sergey

J'avais l'habitude d'utiliser les utilitaires wxcopy et wxpaste de windowmaker, mais les versions récentes de Linux (ou versions X) semblent les avoir cassées - je suppose que la sécurité a été renforcée et qu'elles n'ont pas été mises à jour pour correspondre. Par exemple. vous pourriez faire des choses comme:

echo fred | wxcopy | tr "a-z" "A-Z" | wxpaste

pour obtenir la sortie FRED. (Il s'agit d'un exemple artificiel, car vous obtiendriez la même chose sans le wxpaste final, mais je pense que cela donne une idée de ce que vous pouvez réaliser.)

Cependant, vous pouvez obtenir le même effet en utilisant le paquetage "xcb", qui est incroyablement léger et fournit également un affichage visuel minuscule (résumé) de 8 presse-papiers.

J'ai écrit une paire de scripts Shell il y a plusieurs années, afin de rendre wxcopy/wxpaste un peu plus agréable à mon goût. Je les ai mis à jour ce soir pour fonctionner avec wxcopy/wxpaste ou xcb. Cela les rend un peu plus complexes qu'ils ne le devraient, mais je vais les coller ici - espérons qu'ils ne seront pas trop longs pour ce forum.

Voici la copie:

#!/bin/sh
#
# Provide some enhancements to the wxcopy command, which copies standard input
# to an X11 clipboard text buffer.
#
# Allow copying from stdin to any of the cutbuffers.  Note that they are
# indexed counting from 0.
#
# Author: Luke Kendall
#

if [ `uname -s` = "Darwin" ]
then
    WXCOPY=pbcopy
    WXPASTE=pbpaste
else
    WXCOPY=wxcopy
    WXPASTE=wxpaste
    BUFSPEC="-cutbuffer"
    xcb -p 0 > /tmp/wc$$
    if echo "fred$$" | wxcopy -cutbuffer 0 && [ `wxpaste` = "fred$$" ]
    then
        : # Great, they're actually working.  Not common on modern Linuxes.
        echo "working" > $HOME/.wcopyok
    else
        rm -f $HOME/.wcopyok
        WXCOPY="xcb -s"
        WXPASTE="xcb -p"
        BUFSPEC=
    fi
    xcb -s 0 < /tmp/wc$$
fi

unset WXARGS
if [ $# = 0 ]
then
    $WXCOPY ${WXCOPY_DEFS:-0}
else
    MYNAME=`basename $0`
    USAGE="usage: $MYNAME [ [0-9]... ] [$WXCOPY's args]"
    numlist=true
    for n
    do
        if $numlist && expr "x$n" : 'x[0-9][0-9]*$' > /dev/null
        then
            NUMARGS="$NUMARGS $n"
        else
            numlist=false
            if [ "x$n" = "x-h" ]
            then
                echo "$USAGE" >&2
                exit 0
            else
                WXARGS="$WXARGS $n"
            fi
        fi
    done
    set - $NUMARGS
    $WXCOPY $WXCOPY_DEFS $WXARGS $BUFSPEC $1
    ORIG="$1"
    shift
    for n
    do
        $WXPASTE $BUFSPEC $ORIG | $WXCOPY $WXCOPY_DEFS $WXARGS $BUFSPEC $n
    done
fi

Et voici wpaste:

#!/bin/sh
#
# Provide some enhancements to the wxpaste command, which pastes from X11
# clipboard text buffers to standard output.
#
# Allow pasting to stdout from any of the cutbuffers.  Note that they are
# indexed counting from 0.
#
# Author: Luke Kendall
#

if [ `uname -s` = "Darwin" ]
then
    WXCOPY=pbcopy
    WXPASTE=pbpaste
else
    WXCOPY=wxcopy
    WXPASTE=wxpaste
    BUFSPEC="-cutbuffer"
    if [ -s $HOME/.wcopyok ]
    then
        : # Great, they're actually working.  Not common on modern Linuxes.
    else
        WXCOPY="xcb -s"
        WXPASTE="xcb -p"
        BUFSPEC=
    fi
fi

if [ $# = 0 ]
then
    $WXPASTE ${WXPASTE_DEFS:-0}
else
    MYNAME=`basename $0`
    USAGE="usage: $MYNAME [ [0-9]... ] [$WXPASTE's args]"
    for n
    do
        if expr "x$n" : 'x[0-9][0-9]*$' > /dev/null
        then
            NUMARGS="$NUMARGS $n"
        Elif [ "x$n" = "x-h" ]
        then
            echo "$USAGE" >&2
            exit 0
        else
            WXARGS="$WXARGS $n"
        fi
    done
    set - $NUMARGS
    : echo "Num args: $#"
    for n
    do
        : echo "Doing: $WXPASTE $WXPASTE_DEFS $WXARGS $BUFSPEC $n"
        $WXPASTE $WXPASTE_DEFS $WXARGS $BUFSPEC $n
    done
fi

Si cela vous intéresse, j’ai aussi écrit des pages de manuel pour les scripts - mais vous pouvez probablement les trouver (elles sont toujours valables) en googlant wcopy.1x et wpaste.1x

2
LukeJKendall

Pour me faciliter la tâche, j'ai créé un alias pour xclip afin de reproduire les fonctionnalités de pbcopy et et pbpaste dans macosx.

Sudo apt-get install xclip -y

puis éditez votre ~/.bashrc pour ajouter des alias

nano ~/.bashrc

ajouter ces lignes

alias pbcopy='xclip -selection clipboard'
alias pbpaste='xclip -selection clipboard -o'

Enregistrez et quittez, puis ouvrez un nouveau Shell ou exécutez source ~/.bashrc pour utiliser les alias.

Mon blog contient plus de détails.

1
Gary Woodfine