Передача в / из буфера обмена в скрипте Bash

можно ли передать в / из буфера обмена в Bash?

будь то трубопровод к / от ручки устройства или с помощью вспомогательного приложения, я ничего не могу найти.

например, если /dev/clip было устройство, связанное с буфером обмена, мы могли бы сделать:

cat /dev/clip        # Dump the contents of the clipboard
cat foo > /dev/clip  # Dump the contents of "foo" into the clipboard

23 ответов


вы немного двусмысленны. Я ожидаю, что вы, вероятно, пользователь Linux внутри X, который хочет поместить материал в X PRIMARY буфер обмена.

важно понимать, что bash не имеет буфера обмена. Нет такой вещи, как "буфер обмена", потому что bash может работать на Windows, Mac OS X, много других ОС, внутри X, вне X, ... Не говоря уже о том, что сам X имеет три разных клипборда. Есть множество клипбордов, с которыми вы могли бы иметь дело. Обычно буфер обмена, с которым вы хотите поговорить, имеет утилиту, которая позволяет вам разговаривать с ним.

в случае X, Да, есть xclip (и других). xclip -selection c будет отправлять данные в буфер обмена, который работает с Ctrl-C, Ctrl-V в большинстве приложений.

если вы пытаетесь поговорить с буфером обмена Mac OS X, есть pbcopy.

если вы находитесь в режиме терминала Linux (нет X), то, возможно, вам нужно посмотреть в gpm.

там же GNU screen, который имеет буфер. Чтобы положить туда вещи, посмотрите на screen команда "readreg".

под Windows / cygwin используйте /dev/clipboard или clip для более новых версий Windows (по крайней мере Windows 10).


убедитесь, что вы используете псевдоним xclip="xclip -selection c" в противном случае вы не можете просто использовать Ctrl+v чтобы вставить его обратно в другое место.

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

если у вас нет доступа к apt-get, ни pacman, nor dnf источники доступны на sourceforge.

настройки

Баш

на ~/.bash_aliases добавить:

alias setclip="xclip -selection c"
alias getclip="xclip -selection c -o"

не забудьте загрузить новую конфигурацию с помощью . ~/.bash_aliases или путем перезапуска вашего профиля.

Рыбное

на ~/.config/fish/config.fish, добавить:

abbr setclip "xclip -selection c"
abbr getclip "xclip -selection c -o"

не забудьте перезапустить экземпляр fish, перезапустив терминал для внесения изменений.

использование

теперь вы можете использовать setclip и getclip, электронной.г:

$ echo foo | setclip
$ getclip
foo

на Mac OS X вы можете найти эти инструменты командной строки удобно:

пример:

cat ~/.bashrc | pbcopy

после этого содержимое команды ~/.bashrc файл будет доступен для вставки с cmd+v ярлык.


попробовать

xclip

xclip - command line interface to X selections (clipboard) 

человек


xsel на 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

установить

sudo apt-get install xsel

вот готовый к использованию скрипт bash для чтения буфера обмена, который работает на нескольких платформах. Пожалуйста, отредактируйте сценарий здесь, Если вы добавляете функциональность (например, больше платформ).

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

в Windows (с Cygwin) попробуйте cat /dev/clipboard или echo "foo" > /dev/clipboard как говорится в этой статьи.


только для Mac:

echo "Hello World" | pbcopy
pbpaste

находятся /usr/bin/pbcopy и /usr/bin/pbpaste.


в Linux есть разные клипборды; у X-сервера есть один, у оконного менеджера может быть другой и т. д. Нет стандартного устройства.

О, да, на CLI, программа экрана имеет свой собственный буфер обмена, а также некоторые другие приложения, такие как Emacs и vi.

в X, вы можете использовать xclip.

вы можете проверить этот поток для других возможных ответы: http://unix.derkeiler.com/Newsgroups/comp.unix.shell/2004-07/0919.html


Вау, я не могу поверить, сколько ответов есть на этот вопрос. Я не могу сказать, что пробовал их все, но я пробовал 3 или 4, и ни один из них не работает для меня. Что действительно сработало для меня, так это ответ, расположенный в одном из комментариев, написанных пользователем по имени дуг. Поскольку я нашел это настолько полезным, я решил повторить ответ.

установите утилиту xcopy и когда вы находитесь в терминале, ввод:

скопировать

Thing_you_want_to_copy|xclip -selection c

вставить

myvariable=$(xclip -selection clipboard -o)

Я заметил много ответов рекомендуется pbcopy и pbpaste. Если вы используете эти утилиты, но по какой-то причине они недоступны в вашем РЕПО, вы всегда можете сделать псевдоним для команд xcopy и вызвать их pbpaste и pbcopy.

alias pbcopy="xclip -selection c" 
alias pbpaste="xclip -selection clipboard -o" 

тогда это будет выглядеть так:

Thing_you_want_to_copy|pbcopy
myvariable=$(pbpaste)

копировать и вставлять в буфер обмена в Windows (Cygwin):

посмотреть:

$ clip.exe -?

клип Описание:: Перенаправляет вывод из командной строки в буфер обмена Windows. Затем этот текст можно вставить в другие программы. список параметров: /? Отображает это сообщение справки. Образцы: DIR / CLIP помещает копию текущего каталога список в буфер обмена Windows. КЛИП

также существует getclip (может использоваться вместо shift+ins!), putclip (echo oaeuoa / putclip.exe, чтобы поместить его в клип)


в подсистеме Windows для Linux вы можете скопировать в буфер обмена с помощью clip.исполняемый.

cat file | clip.exe

имейте в виду, чтобы использовать | командная труба. И не > команда, так как это не будет работать.


это простой скрипт Python, который делает именно то, что вам нужно:

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

сохраните это как исполняемый файл где-то на вашем пути (я сохранил его в /usr/local/bin/clip. Вы можете передать материал, который будет сохранен в буфер обмена...

echo "Hello World" | clip

и вы можете передать то, что находится в буфере обмена, в другую программу...

clip | cowsay
 _____________
< Hello World >
 -------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

запуск его сам по себе будет просто выводить то, что находится в буфере обмена.


  xsel -b

выполняет работу для x11, она в основном уже установлена. Взгляд на man-страницу xsel стоит усилий.


Если вы похожи на меня и работаете на сервере linux без привилегий root, и нет xclip или gpm, вы можете обойти эту проблему, просто используя временный файл. Например:

$ echo "hello world" > ~/clip
$ echo `cat ~/clip`
hello world

несколько программ для Windows, которые я написал несколько лет назад. Они позволяют сбрасывать, нажимать, добавлять и печатать буфер обмена. Он работает следующим образом:

dumpclip | perl -pe "s/monkey/chimp/g;" | pushclip

Он включает исходный код:cmd_clip.zip


есть несколько способов. Некоторые из упомянутых способов включают (я думаю) tmux, screen, vim, emacs и оболочку. Я не знаю emacs или screen, поэтому я пройдусь по остальным трем.

Tmux

хотя это не выбор X, tmux имеет режим копирования, доступный через prefix-[ (prefix is Ctrl+B по умолчанию). Буфер, используемый для этого режима, является отдельным и эксклюзивным для tmux, что открывает довольно много возможностей и делает он более разносторонний чем выборы X в правых ситуациях.

для выхода из этого режима нажмите q; для навигации используйте свой vim или emacs привязка (по умолчанию = vim), поэтому hjkl движение, v/V/C-v для выбора символа / строки / блока и т. д. Когда у вас есть выбор, нажмите Enter для копирования и выхода из режима.

вставить из буфера, используйте prefix-].

Shell

установки X11 кажется прийти с двумя программами по умолчанию: xclip и xsel (вроде как он также поставляется с обоими startx и xinit). Большинство других ответов упоминают xclip, и мне очень нравится xsel для его краткости, так что я собираюсь покрыть xsel.

С xsel (1x):

функции ввода

- a, -- append

добавить стандартный ввод на выбор. Подразумевает .

- f, -- follow

добавить к выбору по мере роста стандартного ввода. Подразумевает .

- i, --input

прочитайте стандартный входной сигнал в выбор.

параметры вывода

- o, --output

напишите выбор к стандартному выходу.

варианты действий

- c, -- clear

снимите выделение. Перекрывает все входные опции.

- d, -- delete

запросить удаление текущего выделения. Это не только очищает выделение, но и запрашивает программу, в которой находится выделение, чтобы выбранное содержимое было удалено. Переопределяет все параметры ввода.

параметры отбора

- p, -- primary

работать с основным выбором (по умолчанию).

- s, -- secondary

работать о вторичном отборе.

- b, --clipboard

работать с выбором буфера обмена.

и это все, что вам нужно знать. p (или ничего) для PRIMARY, s на SECONDARY, b на CLIPBOARD, o для вывода.

пример: скажем, я хочу скопировать вывод foo из TTY и вставьте его на веб-страницу для отчета об ошибке. Для этого было бы идеально скопировать в/из сеанса TTY / X. Так возникает вопрос как получить доступ к буферу обмена из TTY?

в этом примере мы предположим, что сеанс X отображается :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

тогда я могу Ctrl-V это в форме, как обычно.

теперь скажите, что кто-то на сайте поддержки дает мне команду запустить, чтобы устранить проблему. Это сложно и долго.

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

пицца заказ похоже на продуктивное использование команды линия.

...двигаться дальше.

Vim

если скомпилировать с +clipboard (это важно! Проверьте свой vim --version), Vim должен иметь доступ к X PRIMARY и CLIPBOARD выбор. Два выбора доступны из * и + регистры, соответственно, и могут быть записаны и прочитаны на досуге так же, как и любой другой регистр. Например:

:%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

если ваша копия vim напрямую не поддерживает доступ к X но это еще не конец света. Вы можете просто использовать xsel техника, как описано в предыдущем разделе.

:r ! xsel -bo ; read  (r) from the stdout of (!) `xsel -bo`
:w ! xsel -b  ; write (w) to the stdin of    (!) `xsel -b`

привязать пару ключевых комбо и вы должны быть хорошо.


из этого потока есть опция, которая не требует установки каких-либо gclip/xclip/xsel стороннее программное обеспечение.

скрипт perl (так как perl обычно всегда устанавливается)

use Win32::Clipboard;
print Win32::Clipboard::GetText();

ответа 2018

использовать буфер обмена-cli. Он работает с macOS, Windows, Linux, OpenBSD, FreeBSD и Android без каких-либо реальных проблем.

установите его с помощью:

npm install -g clipboard-cli

затем вы можете сделать

echo foo | clipboard

если вы хотите, вы можете псевдоним cb поместив следующее в свой .bashrc, .bash_profile или .zshrc:

alias cb=clipboard


в macOS использовать pbpaste

например:

обновить буфер обмена

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

наслаждайтесь.


есть еще xclip-copyfile.


хотя >1 год спустя, я разделяю немного другое решение. Надеюсь, это кому-то пригодится.

вчера я оказался с вопросом: " как разделить буфер обмена между различными сеансами пользователя?". При переключении между сеансами с ctrlaltF7 - ctrlaltф8, на самом деле, вы не можете вставить то, что скопировали.

Я придумал следующее быстрый и грязный решение, основанное на именованном канале. Он, конечно, довольно голый и сырой, но я нашел его функциональным:

user1@host:~$ mkfifo /tmp/sharedClip

затем на передающем терминале

user1@host:~$ cat > /tmp/sharedClip

последний, в приемном терминале:

user2@host:~$ cat /tmp/sharedClip

Теперь вы вводите или вставляете что-либо в первый терминал и (после нажатия возвращение), оно появится немедленно в получая терминале, от где вы можете скопировать/вставить снова везде вы любите.

Of конечно, это не просто строго берет контент из буфера обмена user1, чтобы сделать его доступным в буфере обмена user2, но скорее требует дополнительной пары кликов вставки и копирования.