Канал в / из буфера обмена в сценарии 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

person moinudin    schedule 14.04.2009    source источник
comment
Я использовал :%y+ в vim, что на языке vim означает копирование (копирование) всех строк в регистр «+» (буфер обмена X PRIMARY). Вы можете заменить % диапазоном, если хотите конкретизировать. Но есть три предостережения: 1. Теперь вам нужно сохранить любой текст в файл, прежде чем вы сможете его скопировать. Это контрастирует с командой xclip, упомянутой в ответах. 2. Если вы еще не знаете, как работать с vim, это может быть утомительно. 3. Вы можете сделать это, только если при компиляции vim включена определенная функция. Если вы устанавливаете GVim, он должен быть включен по умолчанию как в графическом интерфейсе, так и в терминальных экземплярах vim.   -  person Braden Best    schedule 22.10.2015
comment
@BradenBest, вы должны указать это в качестве ответа. Я нахожусь в среде NIX, и мне не удалось установить xclip. Ваш ответ сработал как шарм.   -  person HankCa    schedule 11.05.2017
comment
@HankCa Хорошо, я отправил ответ. Скажи мне, что ты думаешь.   -  person Braden Best    schedule 11.05.2017
comment
@BradenBest это очень исчерпывающий ответ. Мне просто понравился :%y+, но хорошо, у вас есть все основы! Хороший.   -  person HankCa    schedule 15.05.2017
comment
Другой вариант: использовать небольшой скрипт Perl: установка не требуется. См. мой ответ ниже.   -  person VonC    schedule 23.09.2017
comment
Вы отметили это как Linux, а Macos: MacOS не использует Linux. Вы имеете в виду Gnu / Linux с X11, Gnu / Linux с Wayland, Gnu / Linux на консоли (без gfx), Gnu / Linux через ssh или Mac OSX?   -  person ctrl-alt-delor    schedule 24.08.2019
comment
Мое простое решение для копирования, например, вывода ls: ls | xclip -i -selection clipboard.   -  person Antonio Feitosa    schedule 04.12.2020


Ответы (31)


Ответ 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
person Evan Conrad    schedule 05.04.2018
comment
Вы уверены, что это безопасный npm пакет? - person Johnny; 21.10.2018
comment
@Stas, я надеюсь, это сделано Sindresorhus (github.com/sindresorhus), наиболее плодовитым узлом участник. Он отвечает за библиотеку тестирования Ava, xo linter, Yeoman и множество других проектов. Он также отвечает за бесчисленное количество таких небольших библиотек, которые в совокупности размещают его код почти на каждом веб-сайте, использующем JS, в Интернете. Это не значит, что его нельзя скомпрометировать; просто количество наблюдений за его репозиториями и его собственная репутация делают его гораздо менее вероятным, чем большинство случайных репозиториев npm. - person Evan Conrad; 22.10.2018
comment
Прохладный! Работает в Ubuntu GNU / Linux, где xclip не работает. - person Kevin Buchs; 14.02.2020
comment
Пока это не работает в WSL - это линукс в windows. - person Kangqiao Zhao; 06.02.2021
comment
Круто, работает на WSL2. - person Kewin Remy; 01.05.2021
comment
Вокруг слишком много JS - person vatosarmat; 28.05.2021
comment
Также работает с Yarn: yarn global add clipboard-cli - person Wellington1993; 22.07.2021

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

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

Если вы используете Mac OS X, есть pbcopy. например cat example.txt | pbcopy

Если вы находитесь в режиме терминала Linux (без X), посмотрите на gpm или экран, на котором буфер обмена. Попробуйте screen команду readreg.

В Windows 10+ или cygwin используйте /dev/clipboard или clip.

person lhunath    schedule 15.04.2009
comment
cygwin: / dev / clipboard - person glenn jackman; 31.05.2011
comment
в Windows /dev/clipboard также работает с оболочками Msys / MinGW bash - person Mihai Rotaru; 07.06.2011
comment
Обратите внимание, что xclip -selection c будет отправлять данные в буфер обмена, который работает с ^ C, ^ V в большинстве приложений. - person Klaas van Schelven; 14.08.2011
comment
в более новых версиях Windows вы можете просто использовать clip вот так: dir | clip - person maep; 08.11.2011
comment
Печально, что GNU / Linux не имеет такого устройства, как /dev/clipboard, и вынуждает устанавливать либо xclip, либо gpm, который по умолчанию отсутствует, по крайней мере, в Kubuntu (я думаю, в большинстве других дистрибутивов тоже). - person Hi-Angel; 04.09.2014
comment
В X11 также есть xsel, который по умолчанию работает с выбором X. Таким образом, вы можете echo hello | xsel или xsel|wc и так далее без использования переключателя командной строки. - person mike; 29.09.2014
comment
Также в Windows: clip < <filename> или echo yes | clip - person FractalSpace; 11.07.2015
comment
@mike, xsel -ib у меня работает. xsel и xclip реализованы по-разному, я использовал xclip, но я работаю в режиме chroot, и xclip прекратил копирование данных в буфер обмена несколько недель назад, я переключился на xsel -ib, и с тех пор никаких проблем не было. - person ; 01.01.2016
comment
На странице github они предлагают использовать clip < ~/.ssh/id_rsa.pub для копирования SSH в буфер обмена. Читая этот ТАК вопрос, я задаюсь вопросом, как это возможно? clip - это настраиваемая процедура, поставляемая с git Bash? - person kr85; 07.01.2016
comment
есть идеи для Wayland? - person mh-cbon; 16.03.2017
comment
@ kr85 clip.exe - это встроенная программа Windows, к которой имеет доступ git-bash, но она работает только в одном направлении (копирование, а не вставка). Если вы используете git-bash, значит, вы тоже работаете в Windows. - person jpaugh; 05.09.2017
comment
Если вы используете подсистему Linux в Windows 10, cat file.txt | clip.exe может работать для копирования в системный буфер обмена. См. github.com/Microsoft/WSL/issues/1069. - person Gordon Bean; 19.07.2018
comment
bash действительно имеет буфер обмена, хотя в документации это называется kill ring. gnu.org/software/bash/manual/html_node/ - person Todd Walton; 03.10.2018
comment
К вашему сведению, это readline, а не сам bash, но да, он доступен из bash, но только в активном процессе. - person lhunath; 04.10.2018
comment
clip поставляется с окнами, начиная с Windows 7. Кроме того, поскольку мы говорим о Microsoft, им, очевидно, пришлось сделать ужасную программу - с клипом вы можете писать только в буфер обмена, он не может помочь вам его прочитать. - person hanshenrik; 25.10.2018
comment
xclip у меня не сработало, когда я вставил его в сценарий bash (я использую XFCE). xsel работает. В моем сценарии bash я использую: printf abc | xsel --input --clipboard. Подробности: unix.stackexchange.com/questions/316715/ - person Yngvar Kristiansen; 24.05.2019
comment
Запуск Debian в среде WSL в Windows 10 Pro и без сигаретных парней приходилось вручную копировать и вставлять. - person ledawg; 17.08.2019
comment
Добавление -r в xclip приведет к удалению новой строки в конце. Так что echo 'test string 456' | xclip -r -selection c будет хорошо работать в одной строке. - person kintsukuroi; 11.03.2020
comment
похоже, не работает с gnome с гипертерминала - person chovy; 02.06.2020
comment
@ mh-cbon Я считаю, что xclip работает и на сессиях Wayland. Я давно использую pass (диспетчер паролей CLI) на рабочей станции Fedora, и он использует xclip для копирования пароля в буфер обмена. - person crimson_king; 14.10.2020
comment
@crimson_king в wayland, теперь я использую wl-clipboard. Работает как шарм github.com/bugaevc/wl-clipboard - person mh-cbon; 14.10.2020
comment
Вопрос ответил более 10 лет назад, обновил только сейчас. Отлично, добро пожаловать в SO. - person Timo; 06.11.2020
comment
в bash Mac OSX используйте pbcopy и pbpaste - person izzulmakin; 29.12.2020

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

Пример: после запуска echo -n test | xclip, Ctrl + v вставит test

person doug    schedule 17.11.2010
comment
Как можно было бы вставить его без этого аргумента команды? - person Jonah; 17.12.2013
comment
так как я часто переключаюсь между osx и linux, в моих точечных файлах есть следующее. alias pbcopy="xclip -selection c" alias pbpaste="xclip -selection clipboard -o" Надеюсь, что это поможет. - person doug; 18.12.2013
comment
Когда я использую этот метод, он всегда добавляет символ новой строки в конце скопированного текста. Вы знаете, как отключить или заблокировать этот символ новой строки? - person ApockofFork; 19.03.2014
comment
@ApockofFork, xclip не добавляет новую строку, echo есть. Попробуйте printf test | xclip -i -selection clipboard. (printf не добавляет новую строку, если вы не напишите 'test\n'.) - person David X; 28.04.2014
comment
Или используйте echo -n вместо printf. - person Christian Pietsch; 13.02.2015
comment
Чтобы добавить новый псевдоним: askubuntu.com/questions/17536/ - person Marcus Vinicius Pompeu; 15.10.2016
comment
Добавление -r в xclip приведет к удалению новой строки в конце. Итак echo 'test string 456' | xclip -r -selection c - person kintsukuroi; 11.03.2020
comment
Аргумент -r, похоже, не работает в текущем Ubuntu. Чтобы удалить новую строку, попробуйте следующее: uptime | tr -d '\n' | xclip -selection c - person peter karasev; 28.09.2020

Установить

# 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"

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

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

Теперь вы можете использовать setclip и getclip, например:

$ echo foo | setclip
$ getclip
foo
person tleb    schedule 13.12.2014
comment
Для всех других дистрибутивов: вы можете загрузить исходный код с sourceforge.net/projects/xclip - person Scz; 06.07.2015
comment
+1 Лучшее решение! В Arch sudo pacman -S xclip. Но учтите, что .bashrc - не лучшее место. Я рекомендую конечному пользователю ознакомиться с соответствующими файлами bashrc, bash_aliases и .profile, а также с тем, как bash обрабатывает каждый из них. Совет: вместо этого поместите его в .bash_aliases. - person eduncan911; 17.09.2015
comment
Спасибо, @ eduncan911! :) Добавил возможность использовать pacman менеджер пакетов и убрал предложение .bashrc. Я знаю, что .bash_aliases более адаптирован, но конечный результат тот же (.bashrc просто требует .bash_aliases, если он существует). Если людям нужна беспорядочная система, позвольте им ее иметь. :) - person tleb; 19.09.2015
comment
@ eduncan911 Я не могу найти упоминания о .bash_aliases в руководстве по bash. Я считаю, что это должна быть модификация .bashrc для конкретного дистрибутива. (Я видел .bashrc для конкретных дистрибутивов, которые импортируют .bash_profile, если он существует.) Исходя из этого, я бы сказал, что .bash_aliases не универсальное соглашение, а удобное сокращение для тех, у кого оно есть. - person jpaugh; 05.09.2017
comment
@jpaugh ты прав. мои .bashrc источники .bash_aliases в конце. ;) Я следую этому старому соглашению, которое остается на 100% совместимым с вариантами Arch, Ubuntu / Debian, Raspberry, macOS / OSX и Windows Bash: stefaanlippens.net/my_bashrc_aliases_profile_and_other_stuff В соответствии с этим соглашением я использую одни и те же файлы точек на всех машинах, которых я касаюсь. Это неплохо: github.com/eduncan911/dotfiles - person eduncan911; 06.09.2017
comment
@ eduncan911 Спасибо! Я работаю над своим собственным репозиторием dotfiles, так что это отличный ресурс. Хорошая вещь в наличии отдельного файла заключается в том, что вы можете легко перезагружать свой .bash_aliases всякий раз, когда он изменяется (с помощью $PROMPT_COMMAND, который сравнивает временные метки). Я уже проделал это сложным путем, с помощью автоматической перезагрузки .bashrc . - person jpaugh; 06.09.2017
comment
Я просто должен подчеркнуть: если вы когда-либо думаете, что будете использовать свои точечные файлы в любой другой операционной системе, отличной от того, для которой вы их пишете (OSX, Ubuntu, BSD, Arch, Windows Bash и т. Д.), Обратите внимание на мои файлы bash. в этом репо: посмотрите, как я всегда сначала запрашиваю ресурсы, и если они существуют, загружайте их. Иногда я ищу в нескольких местах (дистрибутивах ОС), чтобы загрузить один и тот же ресурс. Сделав это сейчас, всегда проверяя, существуют ли файлы, вы сэкономите много горя и сохраните совместимость. Также обратите внимание на точечную организацию в ссылке, которую я разместил ранее. В частности, как связано .bash_profile. - person eduncan911; 06.09.2017

В macOS используйте встроенный pbcopy < / a> и _2 _ команды.

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

cat ~/.bashrc | pbcopy

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

Чтобы сохранить текущий буфер обмена в файл, перенаправьте вывод _ 7_ в файл

pbpaste > my_clipboard.txt
person jtruelove    schedule 05.03.2011

xsel в Debian / Ubuntu / Mint

# append to clipboard:
cat 'the file with content' | xsel -ab

# 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
person Andrew_1510    schedule 18.08.2015
comment
Чем это отличается от echo "foo" | xclip -selection c? - person Léo Léopold Hertz 준영; 16.06.2016
comment
На этот ответ на вопрос Ubuntu есть несколько ответов, но в основном xsel и xclip эквивалентны во всех отношениях, за исключением того, что xclip может читать / записывать файлы по имени, но xsel требует перенаправления оболочки, если вы хотите получить доступ к файлу. - person Colin D Bennett; 09.08.2016
comment
xsel прекрасно работает из сценариев, а xclip работает только из командной строки. Не знаю почему. - person NVRM; 19.10.2019
comment
Также доступно в системах на базе Redhat. Не блокируется странным образом при использовании в таких скриптах, как xclip. - person TNT; 01.04.2021

Пытаться

xclip

xclip - command line interface to X selections (clipboard) 

мужчина

person Zoredache    schedule 14.04.2009

Вау, не могу поверить, сколько ответов на этот вопрос. Я не могу сказать, что пробовал их все, но я пробовал 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)
person thebunnyrules    schedule 11.12.2017
comment
Отлично, ваша часть псевдонима вполне соответствует MacOS. - person MeadowMuffins; 22.12.2017

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

cat file | clip.exe

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

person knowledge_is_power    schedule 28.03.2018

Вот готовый к использованию сценарий 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" 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
person Wolfgang Fahl    schedule 04.10.2013

Только для Mac:

echo "Hello World" | pbcopy
pbpaste

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

person nyitguy    schedule 22.08.2014

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

person Norman H    schedule 31.05.2011
comment
Как отметил пользователь @maep в отдельном комментарии, более новые версии Windows (я могу подтвердить только для Win10) могут просто подключаться к clip. Я использую msysgit 1.9.5, и это сработало. - person Shawn Erquhart; 17.12.2015
comment
echo "foo" > /dev/clipboard, похоже, полностью уничтожает символы новой строки (не \ r \ n \ n, но полностью исчез) - person user1529413; 11.02.2019
comment
исправление неработающей ссылки (не удалось изменить): pgrs.net / 2008/01/11 / command-line-clipboard-access - person Kipras Melnikovas; 26.01.2021
comment
Ссылка обновлена. - person Norman H; 07.02.2021

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

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

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

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

person Sunny Milenov    schedule 14.04.2009
comment
Похоже, создание / dev / clip было бы для кого-то хорошим проектом. - person T.E.D.; 15.04.2009
comment
Я прекрасно осведомлен о множестве буферов обмена. Как это затрудняет ответ на мой вопрос? - person moinudin; 15.04.2009
comment
Было бы разумно, если бы буферы обмена были стандартизированы, вероятно, не повредило бы, если бы вы могли использовать / dev / clip1, / ​​dev / clip2 .. / dev / clip ‹n› для доступа к ним, единственная проблема в том, что они зависят от пользователя и устройства являются общесистемными. Но если вы создадите драйвер устройства ядра, который маскируется в соответствии с UID доступа, он должен работать должным образом. - person ; 14.03.2015

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

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

person tysweat    schedule 06.05.2015
comment
Это работает, когда вы находитесь на одном компьютере, но не позволяет копировать данные между компьютерами. - person Charles Plager; 06.01.2016
comment
кажется, только `echo str› tmpfile` и cat tmpfile, а не операция с буфером обмена. // то же, что и ответы @horta. - person yurenchen; 26.09.2017
comment
похоже, это не устанавливает переменную буфера обмена, поэтому я не могу вставить содержимое в другое приложение - это не настоящий буфер обмена! - person jena; 28.11.2018

Я нашел хорошую ссылку: https://unix.stackexchange.com/questions/69111/

В моем случае я хотел бы вставить содержимое в буфер обмена, а также посмотреть, что туда было вставлено, поэтому я также использовал команду tee с файловым дескриптором:

echo "just a test" | tee >(xclip -i -selection clipboard)

>() - это форма замещения процесса. bash заменяет каждый путь к файловому дескриптору, который связан со стандартным вводом программы в круглых скобках.

teecommand разветвляет вашу команду, позволяя вам "передать ее содержимое по конвейеру" и увидеть результат в стандартном выводе "stdout"

вы также можете создавать псевдонимы для получения и записи в буфер обмена, что позволяет вам использовать «pbcopy» и «pbpaste», как если бы вы находились на MAC. В моем случае, поскольку я использую zsh, у меня есть это в моем файле псевдонимов:

(( $+commands[xclip] )) && {
    alias pbpaste='xclip -i -selection clipboard -o'
    alias pbcopy='xclip -selection clipboard'
}

(( $+command[name] )) в zsh проверяет, установлена ​​ли команда "name" в вашей системе, тогда оба псевдонима сгруппированы с {}. && - это двоичное И, если a, то b, следовательно, если у вас есть xclip, будут установлены псевдонимы.

echo "another test" | tee >(pbcopy)

Чтобы получить содержимое буфера обмена, просто введите:

pbpaste | "any-command-you-need-here"
person SergioAraujo    schedule 22.08.2019

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

Видеть:

$ clip.exe -?

CLIP
Description:
    Redirects output of command line tools to the Windows clipboard.
    This text output can then be pasted into other programs.
Parameter List:
/?                  Displays this help message.
Examples:
DIR | CLIP          Places a copy of the current directory
                        listing into the Windows clipboard.
CLIP < README.TXT   Places a copy of the text from readme.txt
                        on to the Windows clipboard.

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

person Stenemo    schedule 21.06.2013

pbcopy встроен в OSX:

Копирование содержимого .bash_profile:

cat ~/.bash_profile | pbcopy
person Skulas    schedule 30.01.2020

  xsel -b

Выполняет работу для X Window, и в основном он уже установлен. Просмотр справочной страницы xsel стоит затраченных усилий.

person Martin Fischer    schedule 11.06.2015

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

Tmux

Хотя это и не выбор X, tmux имеет режим копирования, доступный через prefix-[ (prefix по умолчанию равен 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, - следовать

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

-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 $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`

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

person Braden Best    schedule 11.05.2017
comment
Определенно всегда не забывайте использовать DISPLAY= при вызове приложения X из среды, отличной от X. X-приложениям нужна переменная среды DISPLAY, чтобы определить, с каким сервером (или есть только один сервер, обрабатывающий несколько сеансов?), С которым они разговаривают. Попробуйте, например, DISPLAY=:1 firefox (или какой у вас идентификатор дисплея; у меня просто :1) с TTY. - person Braden Best; 11.05.2017
comment
Для меня выбор в моей среде был :%y+ в VIM. - person HankCa; 15.05.2017

просто искал то же самое в моей среде KDE. Не стесняйтесь использовать clipcopy и clippaste

KDE:

> echo "TEST CLIP FROM TERMINAL" | clipcopy 
> clippaste 
TEST CLIP FROM TERMINAL
person whati001    schedule 21.10.2020

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

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

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

person jeng    schedule 08.06.2014

В этом потоке есть вариант, который не требует установки какого-либо _1 _ / _ 2 _ / _ 3_ стороннего программного обеспечения.

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

use Win32::Clipboard;
print Win32::Clipboard::GetText();
person VonC    schedule 23.09.2017
comment
Как мне это использовать? Сохранить сценарий в PATH и подключиться к нему? Я пытаюсь написать оболочку dropbox cli для копирования ссылок для совместного использования, поэтому мне просто нужно обрабатывать текст. - person jena; 27.11.2018
comment

В macOS используйте pbpaste.

Например:

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

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

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

$ echo "Hello, World!" > ~/clip
$ echo `cat ~/clip`
Hello, World!
person horta    schedule 17.09.2015
comment
Я не понимаю, как на это влияет отсутствие привилегий root. - person Braden Best; 15.05.2017
comment
@BradenBest Отсутствие привилегий root означает, что я не могу устанавливать какие-либо вещи. - person horta; 16.05.2017
comment
Но что бы вы устанавливали? ИКС? На сервере? Если у вас нет какой-то странной службы пересылки X, я не понимаю, зачем вам вообще это нужно. - person Braden Best; 16.05.2017
comment
@BradenBest Не уверен. Какая бы программа или сервис позволили мне выполнить копипасту. - person horta; 16.05.2017
comment
Что ж, если вы используете какой-либо из X selections (что обязательно подразумевается буфером обмена и любыми упоминаниями xclip / xsel), вам нужен активный сеанс X (и, следовательно, X-сервер), чтобы вы могли получить доступ к выбору в первом место. Чтобы понять, что я имею в виду, попробуйте запустить DISPLAY="" xsel на своем локальном компьютере. Он выйдет из-за ошибки, невозможности найти сеанс "", и никакое взаимодействие с любым выбранным X не будет выполнено. Вот почему я изначально сказал, что не понимаю, как на это влияют привилегии root: root или отсутствие root, вы вряд ли найдете выбор X полезным в серверной среде. - person Braden Best; 16.05.2017

В Linux это работает:

cat filename | xclip
person otto    schedule 28.01.2020

Рубиновый лайнер вдохновил меня попробовать Python.

Скажем, нам нужна команда, которая делает отступ в 4 пробела для всего, что находится в буфере обмена. Идеально подходит для обмена фрагментами в stackoverflow.

$ pbpaste | python -c "import sys
 for line in sys.stdin:
   print(f'    {line}')" | pbcopy

это не опечатка. Python нужны символы новой строки для выполнения цикла for. Мы хотим изменить строки за один проход, чтобы не создавать лишний массив в памяти.

Если вы не против создать дополнительный массив, попробуйте:

$ pbpaste | python -c "import sys; print(''.join([f'    {l}' for l in sys.stdin]))" | pbcopy

но, честно говоря, для этого лучше awk, чем python. Я определил этот псевдоним в моем ~/.bashrc файле

alias indent="pbpaste | awk '{print \"    \"\$0}' | pbcopy"

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

person Harry Moreno    schedule 17.04.2020
comment
Вы можете просто снять скобки и использовать выражение генератора вместо понимания списка. ''.join(f' {l}' for l in sys.stdin) - также для большинства пользователей python будет указывать на python2 в MacOS. Таким образом, вы можете вместо этого указать python3. - person sytech; 20.01.2021

на Wayland xcopy не работает, используйте вместо него wl-clipboard. например на федоре

sudo dnf install wl-clipboard

tree | wl-copy

wl-paste > file
person Jens Timmerman    schedule 29.04.2020

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

person Jonathon Reinhart    schedule 29.08.2016

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

Вчера я столкнулся с вопросом: «Как разделить буфер обмена между разными пользовательскими сеансами?». При переключении между сеансами с помощью ctrl alt F7 - ctrl alt F8 , по сути, вы не можете вставить то, что скопировали.

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

user1@host:~$ mkfifo /tmp/sharedClip

затем в отправляющем терминале

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

наконец, в приемном терминале:

user2@host:~$ cat /tmp/sharedClip

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

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

person lurix66    schedule 07.10.2016
comment
Это не кажется слишком удивительным. Два разных X-сервера = два разных набора выбора. Однако вы можете создать сценарий, который принимает ввод / вывод через xsel/xclip. Например, один конец слушает, изменился ли какой-либо из выбранных вариантов, а затем автоматически передает его (через именованный FIFO) другому скрипту, который прослушивает один или несколько каналов, который вставляет его в свой собственный X-выбор. Таким образом, копирование текста автоматически приведет к тому, что тот же текст появится в выборе другого X-сеанса. И не забывайте о $DISPLAY. - person Braden Best; 11.05.2017

Эта функция проверяет, какой буфер обмена существует, и использует его.

Чтобы проверить скопированное прошлое в вашу оболочку, вызовите функцию clippaste.

clippaste () {
    if [[ $OSTYPE == darwin* ]]
    then
            pbpaste
    elif [[ $OSTYPE == cygwin* ]]
    then
            cat /dev/clipboard
    else
            if command -v xclip &> /dev/null
            then
                    xclip -out -selection clipboard
            elif command -v xsel
            then
                    xsel --clipboard --output
            else
                    print "clipcopy: Platform $OSTYPE not supported or xclip/xsel not installed" >&2
                    return 1
            fi
    fi
}
person Shaboti    schedule 17.09.2020

Способ вставки из буфера обмена в файл без каких-либо инструментов, кроме echo.

  1. Избегайте одинарных кавычек в тексте, который вы хотите вставить: замените все вхождения ' на '\'' и скопируйте результат в буфер обмена.
  2. Тип echo -n '
  3. Нажмите Shift+Insert
  4. Тип ' > filename.txt
  5. Нажмите Enter

В основном вы делаете это:

echo -n 'copied text with single quotes escaped' > filename.txt

Он работает, даже если в скопированном тексте есть новые строки.

person Ilyich    schedule 25.11.2020