Можно ли подключиться к/из буфера обмена в Bash?
Независимо от того, является ли это конвейером в/из дескриптора устройства или с помощью вспомогательного приложения, я ничего не могу найти.
Например, если /dev/clip
было устройством, связанным с буфером обмена, мы могли бы сделать:
cat /dev/clip # Dump the contents of the clipboard
cat foo > /dev/clip # Dump the contents of "foo" into the clipboard
Ты немного двусмыслен. Я ожидаю, что вы, вероятно, пользователь 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).
/dev/clipboard
также работает для командных оболочек Msys / MinGW
Убедитесь, что вы используете псевдоним xclip="xclip -selection c"
иначе вы не можете просто использовать Ctrl + v, чтобы вставить его обратно в другое место.
echo test | xclip
Ctrl + v === test
xclip -selection clipboard -o
# You can install xclip using `apt-get`
apt-get install xclip
# or `pacman`
pacman -S xclip
# or `dnf`
dnf install xclip
Если у вас нет доступа к apt-get
и pacman
, а не 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"
Не забудьте перезагрузить экземпляр вашей рыбы, перезапустив терминал для внесения изменений.
Теперь вы можете использовать setclip
и getclip
, например:
$ echo foo | setclip
$ getclip
foo
sudo pacman -S xclip
. Но обратите внимание, что .bashrc
не лучшее место. Я рекомендую конечному пользователю ознакомиться с правильными файлами bashrc, bash_aliases и .profile, а также с тем, как bash обрабатывает каждый из них. Совет: вместо этого поместите его в .bash_aliases.
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
echo "foo" | xclip -selection c
?
xsel
и xclip
во всех отношениях эквивалентны, за исключением того, что xclip
может читать / записывать файлы по имени, но xsel
требует перенаправления оболочки, если вы хотите получить доступ к файлу.
Вот готовый к использованию bash script для чтения буфера обмена, который работает на нескольких платформах. Пожалуйста, отредактируйте script здесь, если вы добавите функциональность (например, больше платформ).
#!/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
В Windows (с Cygwin) попробуйте
cat /dev/clipboard
или echo "foo" > /dev/clipboard
, как указано в этой статье.
clip
. Я использую msysgit 1.9.5, и это сработало.
Ничего себе, я не могу поверить, сколько ответов есть на этот вопрос. Я не могу сказать, что я пробовал их все, но я пробовал 3 или 4 лучших, и никто из них не работает для меня. То, что работало для меня, было ответом, расположенным в одном из комментариев, написанном пользователем под названием doug. Поскольку я нашел это настолько полезным, я решил повторить в ответе.
Установите утилиту xcopy и, когда вы находитесь в терминале, введите:
копия
Thing_you_want_to_copy|xclip -selection c
Вставить
myvariable=$(xclip -selection clipboard -o)
Я заметил много ответов, рекомендованных pbpaste и pbcopy. Если вы используете эти утилиты, но по какой-либо причине они недоступны в вашем репо, вы всегда можете сделать псевдоним для команд xcopy и называть их pbpaste и pbcopy.
alias pbcopy="xclip -selection c"
alias pbpaste="xclip -selection clipboard -o"
Итак, это будет выглядеть так:
Thing_you_want_to_copy|pbcopy
myvariable=$(pbpaste)
Только для 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
В подсистеме Windows для Linux вы можете скопировать в буфер обмена с помощью clip.exe.
cat file | clip.exe
Имейте в виду использовать |
pipe. А не >
команда, так как это не сработает.
Используйте clipboard-cli. Он работает с MacOS, Windows, Linux, OpenBSD, FreeBSD и Android без каких-либо реальных проблем.
Установите его с помощью:
npm install -g clipboard-cli
Тогда вы можете сделать
echo foo | clipboard
Если вы хотите, вы можете использовать псевдоним cb
, поместив следующее в свои .bashrc
, .bash_profile
или .zshrc
:
alias cb=clipboard
npm
?
Скопируйте и вставьте в буфер обмена в Windows (Cygwin):
см
$clip.exe -?
CLIP Описание: Перенаправляет вывод инструментов командной строки в буфер обмена Windows. Этот текст можно затем вставить в другие программы. Список параметров: /? Отображает это справочное сообщение. Примеры: DIR | CLIP Задает копию текущего каталога перечисление в буфер обмена Windows. CLIP < README.TXT Помещает копию текста из файла readme.txt в буфер обмена Windows.
Также существует getclip (может использоваться вместо shift + ins!), putclip (echo oaeuoa | putclip.exe, чтобы поместить его в клип)
Это простой Python script, который делает только то, что вам нужно:
#!/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 |
|| ||
Запуск сам по себе будет просто выводить то, что в буфере обмена.
cat tmpfile
, а не работа с буфером обмена. // так же, как @horta ответы.
В этом потоке есть опция, которая не требует установки стороннего программного обеспечения gclip
/xclip
/xsel
.
A perl script (поскольку perl обычно всегда устанавливается)
use Win32::Clipboard;
print Win32::Clipboard::GetText();
Есть несколько способов. Некоторые из упомянутых способов включают (я думаю) tmux, screen, vim, emacs и оболочку. Я не знаю emacs или экран, поэтому я перейду через три других.
Пока нет выбора X, tmux имеет режим копирования, доступный через prefix-[
(prefix
is Ctrl + B по умолчанию). Буфер, используемый для этого режима, является отдельным и эксклюзивным для tmux, что открывает множество возможностей и делает его более универсальным, чем выбор X в правильных ситуациях.
Чтобы выйти из этого режима, нажмите q; для навигации, используйте привязку vim
или emacs
(по умолчанию = vim), поэтому hjkl
для перемещения, v/V/C-v
для выбора символа/строки/блока и т.д. Когда у вас есть выбор, нажмите Enter на копировать и выходить из режима.
Чтобы вставить из этого буфера, используйте prefix-]
.
Любая установка X11
, по-видимому, поставляется с двумя программами по умолчанию: xclip
и xsel
(вроде как он также поставляется с startx
и xinit
). В большинстве других ответов упоминается xclip
, и мне очень нравится xsel
за его краткость, поэтому я собираюсь покрыть xsel
.
От xsel (1x):
Параметры ввода
-a, --append
добавить стандартный ввод к выбору. Подразумевает -i.
-f, --follow
добавить к выбору в качестве стандартного ввода. Подразумевает -i.
-i, --input
читать стандартный ввод в выбор.
Параметры вывода
-o, --output
напишите выделение на стандартный вывод.
Варианты действий
-c, --clear
очистить выбор. Переопределяет все параметры ввода.
-d, --delete
Запросить удаление текущего выделения. Это не только очищает выбор, но также запрашивает программу, в которой находится выбор, что выбранное содержимое будет удалено. Переопределяет все параметры ввода.
Параметры выбора
-p, --primary
работают с выбором PRIMARY (по умолчанию).
-s, -secondary
работают с выбором SECONDARY.
-b, --clipboard
работают с выбором 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 $6.99
Порядок пиццы кажется полезным для использования командной строки.
... перемещение.
Если скомпилировано с помощью +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`
Привяжите пару комбинаций клавиш, и вы должны быть хорошими.
DISPLAY=
при вызове приложения X из не-X среды. X-приложениям нужна переменная окружения DISPLAY
чтобы выяснить, с каким сервером (или только один сервер обрабатывает несколько сеансов?) Они общаются. Попробуйте DISPLAY=:1 firefox
(или каким-либо другим идентификатором вашего дисплея; например, мой может быть :1
) из TTY.
:%y+
в VIM.
Если вы похожи на меня и запускаете на Linux-сервере без привилегий root, и нет xclip или gpm, вы можете решить эту проблему, просто используя временный файл. Например:
$ echo "hello world" > ~/clip
$ echo `cat ~/clip`
hello world
xsel -b
Выполняется ли задание для x11, оно в основном уже установлено. Взгляд в man-странице xsel стоит усилий.
Несколько программ Windows, которые я написал много лет назад. Они позволяют вам сбрасывать, нажимать, добавлять и печатать буфер обмена. Он работает следующим образом:
dumpclip | perl -pe "s/monkey/chimp/g;" | pushclip
Он включает исходный код: cmd_clip.zip
в macOS использовать pbpaste
например:
обновить буфер обмена
pbpaste | ruby -ne ' puts "\|" + $_.split( )[1..4].join("\|") ' | pbcopy
наслаждаться.
Один из наиболее эффективных и эффективных способов подготовки экзаменов CA Technologies CAT-540 - это ответы на вопросы отвалов CAT-540 и тестовое программное обеспечение CAT-540. VceTests известны тем, что предоставили лучшие сертификационные экзамены CA Technologies для студентов CA Technologies. Подготовьте экзамен CAT-540 на наших тестовых тестах VTS VAT и убедитесь, что они сертифицированы.
Хотя > 1 год спустя, я разделяю немного другое решение. Надеюсь, это полезно для кого-то.
Вчера я столкнулся с вопросом: "Как разделить буфер обмена между различными сеансами пользователя?". При переключении между сеансами с ctrl alt F7 - ctrl alt F8 на самом деле вы не можете вставить скопированные файлы.
Я придумал следующее быстрое и грязное решение, основанное на именованном канале. Он, конечно, довольно голый и сырой, но я нашел его функциональным:
user1@host:~$ mkfifo /tmp/sharedClip
то в отправляющем терминале
user1@host:~$ cat > /tmp/sharedClip
last, в приемном терминале:
user2@host:~$ cat /tmp/sharedClip
Теперь вы вводите или вставляете что-либо в первый терминал, и (после нажатия return) он будет немедленно отображаться в принимающем терминале, откуда вы можете снова и снова копировать/вставлять в любом месте.
Конечно, это не просто строго берет контент из буфера обмена user1, чтобы сделать его доступным в буфере обмена user2, а требует дополнительной пары кликов "Вставить" и "Копировать".
xsel/xclip
. Например, один конец слушает, чтобы увидеть, изменился ли какой-либо из вариантов, и затем автоматически передает его (через именованный FIFO) другому сценарию, который прослушивает один или несколько каналов, который вставляет его в свой собственный выбор X. Таким образом, копирование текста автоматически приведет к тому, что тот же текст появится в выделении другого сеанса X. И не забывайте о $DISPLAY
.
Существует также xclip-copyfile.
:%y+
в vim, который vim-говорит для "yank (скопировать) все строки в регистр '+' (буфер обмена XPRIMARY
)". Вы можете заменить%
на диапазон, если хотите быть конкретным. Но есть три предостережения: 1. Теперь вы должны сохранить любой текст в файл, прежде чем сможете скопировать его. Это в отличие от командыxclip
упомянутой в ответах. 2. Если вы еще не знаете, как vim, это может быть утомительно. 3. Вы можете сделать это, только если определенная функция включена при компиляции vim. Если вы устанавливаете GVim, он должен быть включен по умолчанию как в графическом интерфейсе, так и в терминальных экземплярах vim.xclip
. Ваш ответ работал как шарм.