Доступ до буфера обміну командного рядка


10

Я будую інструмент командного рядка, щоб зробити деякі мої завдання більш ефективними. Мені потрібно вміти писати вміст у буфер обміну, але чомусь це не працює для мене.

Я намагався встановити і те, xclipі інше xsel, але обидві мають однакову поведінку: вони можуть добре читати / записувати до буфера обміну, але я не можу отримати доступ до нього з головного графічного інтерфейсу Ubuntu.

Я також спробував це в терміналі ...

echo "hello" | xclip

Тоді якщо Ctrl+ Shift+ V, я отримую свій оригінальний запис буфера обміну, а не "привіт". Але, якщо я спробую захопити вміст xclip, він працює чудово.

Основна мета - отримати вміст, який можна вставити у Firefox або будь-які інші програми на основі GUI, якими я користуюся.

Відповіді:


16

Ну, в X :) є кілька різних буферів обміну, один xclipза допомогою якого за замовчуванням копіює текст - "буфер вибору" - зазвичай ви просто вибираєте якийсь текст за допомогою миші, а потім можете вставити його середньою кнопкою миші. Цей буфер є окремим від того, з якого ви можете вставити Ctrl-Shift-V.

Спробуйте

echo "hello" | xclip -selection clipboard

також, див

man xclip

для більш детальної інформації про xclip


2
FYI, також можна скоротити до xclip -sel clip. Я особисто це використовую весь час
Сергій Колодяжний

Боже, чому це так заплутано, чому не було достатньо одного буфера обміну, дивітьсяman xclip -selection specify which X selection to use, options are "primary" to use XA_PRIMARY (default), "secondary" for XA_SECONDARY or "clipboard" for XA_CLIPBOARD
mxmlnkn

Здається, що часті дії - це "виділення тексту за допомогою миші". Чи можлива однакова дія з клавіатурою?
nilon

3

Щоб полегшити себе, я створив псевдонім для xclipтого, щоб імітувати функціональність pbcopyта pbpasteв Mac OS X.

sudo apt-get install xclip -y

Потім відредагуйте свій, ~/.bashrcщоб додати псевдоніми:

nano ~/.bashrc

Додайте ці нові рядки (ви можете помістити їх у кінці файлу):

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

Збережіть і вийдіть, а потім відкрийте нову оболонку або запустіть, source ~/.bashrcщоб використовувати псевдоніми.

Мій пост у блозі містить більш детальну інформацію.


2

Раніше я використовував утиліти wxcopy та wxpaste від windowsmaker, але останні версії Linux (або версії X), схоже, порушили їх - я підозрюю, що безпека була посилена, і вони не оновлювались на відповідність. Наприклад, ви можете робити такі речі:

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

щоб отримати вихід FRED. (Це надуманий приклад, оскільки ви отримаєте те саме, що не має остаточної пасти, але я думаю, це дає аромат того, чого ви можете досягти.)

Однак ви можете досягти такого ж ефекту, використовуючи пакет "xcb", який неймовірно легкий, а також забезпечує крихітний (узагальнений) візуальний дисплей з 8 буферів.

Я написав пару скриптів оболонки wcopy / wpaste років тому, щоб зробити wxcopy / wxpaste трохи приємнішим на мій смак. Я оновив їх сьогодні ввечері для роботи з wxcopy / wxpaste або xcb. Це робить їх трохи складнішими, ніж потрібно, але я вставлю їх сюди - сподіваюся, вони не надто довгі для цього форуму.

Ось wcopy:

#!/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

І ось папка:

#!/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

Якщо когось цікавить, я теж написав сторінки для скриптів - але ви, ймовірно, можете їх знайти (вони все ще дійсні), гуглюючи wcopy.1x та wpaste.1x


Ви можете відредагувати свою відповідь, щоб додати гіперпосилання на manpages. (Ви повинні мати можливість додати до 2 посилань, навіть якщо ви новий користувач AU.)
Eliah Kagan
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.