Передача в / из буфера обмена в скрипте 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
ярлык.
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
как говорится в этой статьи.
в 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
наслаждайтесь.
хотя >1 год спустя, я разделяю немного другое решение. Надеюсь, это кому-то пригодится.
вчера я оказался с вопросом: " как разделить буфер обмена между различными сеансами пользователя?". При переключении между сеансами с ctrlaltF7 - ctrlaltф8, на самом деле, вы не можете вставить то, что скопировали.
Я придумал следующее быстрый и грязный решение, основанное на именованном канале. Он, конечно, довольно голый и сырой, но я нашел его функциональным:
user1@host:~$ mkfifo /tmp/sharedClip
затем на передающем терминале
user1@host:~$ cat > /tmp/sharedClip
последний, в приемном терминале:
user2@host:~$ cat /tmp/sharedClip
Теперь вы вводите или вставляете что-либо в первый терминал и (после нажатия возвращение), оно появится немедленно в получая терминале, от где вы можете скопировать/вставить снова везде вы любите.
Of конечно, это не просто строго берет контент из буфера обмена user1, чтобы сделать его доступным в буфере обмена user2, но скорее требует дополнительной пары кликов вставки и копирования.