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

745

Можно ли подключиться к/из буфера обмена в Bash?

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

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

cat /dev/clip        # Dump the contents of the clipboard
cat foo > /dev/clip  # Dump the contents of "foo" into the clipboard
  • 2
    Я использовал :%y+ в vim, который vim-говорит для "yank (скопировать) все строки в регистр '+' (буфер обмена X PRIMARY )". Вы можете заменить % на диапазон, если хотите быть конкретным. Но есть три предостережения: 1. Теперь вы должны сохранить любой текст в файл, прежде чем сможете скопировать его. Это в отличие от команды xclip упомянутой в ответах. 2. Если вы еще не знаете, как vim, это может быть утомительно. 3. Вы можете сделать это, только если определенная функция включена при компиляции vim. Если вы устанавливаете GVim, он должен быть включен по умолчанию как в графическом интерфейсе, так и в терминальных экземплярах vim.
  • 1
    @BradenBest вы должны поставить это в качестве ответа. Я нахожусь в среде NIX и не смог установить xclip . Ваш ответ работал как шарм.
Показать ещё 3 комментария
Теги:
macos
clipboard

24 ответа

727
Лучший ответ

Ты немного двусмыслен. Я ожидаю, что вы, вероятно, пользователь 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).

  • 32
    cygwin: / dev / clipboard
  • 20
    в Windows /dev/clipboard также работает для командных оболочек Msys / MinGW
Показать ещё 15 комментариев
223

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

echo test | xclip    

Ctrl + v === test

  • 1
    Как можно было бы вставить его без этого командного аргумента?
  • 14
    xclip -selection clipboard -o
Показать ещё 6 комментариев
135

Установка

# 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

В ~/.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
  • 3
    Для всех остальных дистрибутивов: вы можете скачать исходный код с sourceforge.net/projects/xclip
  • 0
    +1 Лучшее решение! В Arch, sudo pacman -S xclip . Но обратите внимание, что .bashrc не лучшее место. Я рекомендую конечному пользователю ознакомиться с правильными файлами bashrc, bash_aliases и .profile, а также с тем, как bash обрабатывает каждый из них. Совет: вместо этого поместите его в .bash_aliases.
Показать ещё 7 комментариев
106

На macOS используйте встроенные команды pbcopy и pbpaste.

Например, если вы запустите

cat ~/.bashrc | pbcopy

содержимое файла ~/.bashrc будет доступно для вставки с помощью ярлыка Cmd + v.

33

Try

xclip

xclip - command line interface to X selections (clipboard) 

man

18

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
  • 0
    Чем это отличается от echo "foo" | xclip -selection c ?
  • 0
    На этот вопрос Ask Ubuntu есть несколько ответов, но в основном xsel и xclip во всех отношениях эквивалентны, за исключением того, что xclip может читать / записывать файлы по имени, но xsel требует перенаправления оболочки, если вы хотите получить доступ к файлу.
10

Вот готовый к использованию 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
9

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

  • 1
    Это работает и с msys / mingw.
  • 1
    Как пользователь @maep упомянул в отдельном комментарии, более новые версии Windows (я могу подтвердить только для Win10) могут просто передать clip . Я использую msysgit 1.9.5, и это сработало.
Показать ещё 1 комментарий
8

Ничего себе, я не могу поверить, сколько ответов есть на этот вопрос. Я не могу сказать, что я пробовал их все, но я пробовал 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)
  • 0
    Отлично, ваш псевдоним вполне соответствует MacOS.
8

Только для Mac:

echo "Hello World" | pbcopy
pbpaste

Они расположены /usr/bin/pbcopy и /usr/bin/pbpaste.

8

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

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

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

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

  • 2
    Похоже, создание / dev / clip было бы хорошим проектом для кого-то.
  • 1
    Я прекрасно осведомлен о нескольких буферах обмена. Как это затрудняет ответ на мой вопрос?
Показать ещё 2 комментария
6

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

cat file | clip.exe

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

5

2018 ответ

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

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

npm install -g clipboard-cli

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

echo foo | clipboard

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

alias cb=clipboard

  • 0
    Вы уверены, что это безопасный пакет npm ?
  • 1
    @Stas, я надеюсь, это сделано Sindresorhus ( github.com/sindresorhus ), самым плодовитым разработчиком узлов. Он отвечает за библиотеку тестирования Ava, xo linter, Yeoman и многие другие проекты. Он также отвечает за бесчисленные небольшие библиотеки, подобные этой, которые коллективно размещают свой код почти на каждом веб-сайте, использующем JS, в Интернете. Это не значит, что он не мог быть скомпрометирован; только то, что количество глаз на его репо и его собственная репутация делают его гораздо менее вероятным, чем в большинстве случайных репо npm.
5

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

см

$clip.exe -?

CLIP Описание:   Перенаправляет вывод инструментов командной строки в буфер обмена Windows.   Этот текст можно затем вставить в другие программы. Список параметров: /? Отображает это справочное сообщение. Примеры: DIR | CLIP Задает копию текущего каталога                       перечисление в буфер обмена Windows. CLIP < README.TXT Помещает копию текста из файла readme.txt                       в буфер обмена Windows.

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

4

Это простой 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 |
                ||     ||

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

  • 0
    Это работает, когда вы находитесь на одном компьютере, но не позволит вам копировать вещи между компьютерами.
  • 0
    кажется только `echo str> tmpfile` и cat tmpfile , а не работа с буфером обмена. // так же, как @horta ответы.
Показать ещё 1 комментарий
2

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

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

use Win32::Clipboard;
print Win32::Clipboard::GetText();
  • 0
    Как бы я использовал это? Сохранить скрипт в PATH и передать в него? Я пытаюсь написать dropbox cli wrapper для копирования ссылок, поэтому мне просто нужно, чтобы он обрабатывал текст.
  • 0
    @jena Пример: metacpan.org/pod/Win32::Clipboard или perlmonks.org/?node_id=143637 или bribes.org/perl/docfr/win32clipboard.html .
2

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

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

добавить стандартный ввод к выбору. Подразумевает -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

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

... перемещение.

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`

Привяжите пару комбинаций клавиш, и вы должны быть хорошими.

  • 0
    Обязательно всегда не забывайте использовать DISPLAY= при вызове приложения X из не-X среды. X-приложениям нужна переменная окружения DISPLAY чтобы выяснить, с каким сервером (или только один сервер обрабатывает несколько сеансов?) Они общаются. Попробуйте DISPLAY=:1 firefox (или каким-либо другим идентификатором вашего дисплея; например, мой может быть :1 ) из TTY.
  • 0
    Для меня выбор в моей среде был :%y+ в VIM.
2

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

$ echo "hello world" > ~/clip
$ echo `cat ~/clip`
hello world
  • 0
    Я не вижу, как на это влияет отсутствие корневых привилегий.
  • 1
    @BradenBest Отсутствие привилегий root означает, что я не могу установить что-либо.
Показать ещё 3 комментария
2
  xsel -b

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

2

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

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

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

1

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

например:

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

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

наслаждаться.

0

Один из наиболее эффективных и эффективных способов подготовки экзаменов CA Technologies CAT-540 - это ответы на вопросы отвалов CAT-540 и тестовое программное обеспечение CAT-540. VceTests известны тем, что предоставили лучшие сертификационные экзамены CA Technologies для студентов CA Technologies. Подготовьте экзамен CAT-540 на наших тестовых тестах VTS VAT и убедитесь, что они сертифицированы.

0

Хотя > 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, а требует дополнительной пары кликов "Вставить" и "Копировать".

  • 0
    Не кажется слишком удивительным. Два разных X-сервера = два разных набора выбора. Однако вы можете настроить скрипт, который принимает ввод / вывод через xsel/xclip . Например, один конец слушает, чтобы увидеть, изменился ли какой-либо из вариантов, и затем автоматически передает его (через именованный FIFO) другому сценарию, который прослушивает один или несколько каналов, который вставляет его в свой собственный выбор X. Таким образом, копирование текста автоматически приведет к тому, что тот же текст появится в выделении другого сеанса X. И не забывайте о $DISPLAY .
0

Существует также xclip-copyfile.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню