it-roy-ru.com

Как я могу скопировать вывод команды прямо в буфер обмена?

Как я могу направить вывод команды в буфер обмена и вставить его обратно при использовании терминала? Например:

cat file | clipboard
388
Legend

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

Сначала установите программу размером 16 КБ с именем xclip:

Sudo apt-get install xclip

Затем вы можете направить вывод в xclip для копирования в буфер обмена:

cat file | xclip

Чтобы вставить текст, который вы только что скопировали, вы должны использовать:

xclip -o

Чтобы упростить жизнь, вы можете настроить псевдоним в вашем файле .bashrc, как я сделал:

alias "c=xclip"
alias "v=xclip -o"

Чтобы увидеть, насколько это полезно, представьте, что я хочу открыть свой текущий путь в новом окне терминала (могут быть другие способы сделать это, например, Ctrl+T в некоторых системах, но это только для иллюстрации):

Terminal 1:
pwd | c

Terminal 2:
cd `v`

Обратите внимание на ` ` вокруг v. Это сначала выполняет v как команду, а затем заменяет ее на месте для использования cd.

Скопируйте только содержимое в буфер обмена X

cat file | xclip

Если вы хотите вставить другое приложение, отличное от X, попробуйте следующее:

cat file | xclip -selection clipboard
504
Legend

В OS X используйте pbcopy; pbpaste идет в противоположном направлении.

138
DavidPhillipOster

Я написал этот небольшой скрипт, который берет на себя догадки из команд копирования/вставки.

Версия скрипта для Linux основана на том, что xclip уже установлен в вашей системе. Сценарий называется буфером обмена.

#!/bin/bash
# Linux version
# Use this script to pipe in/out of the clipboard
#
# Usage: someapp | clipboard     # Pipe someapp's output into clipboard
#        clipboard | someapp     # Pipe clipboard's content into someapp
#

if command -v xclip 1>/dev/null; then
    if [[ -p /dev/stdin ]] ; then
        # stdin is a pipe
        # stdin -> clipboard
        xclip -i -selection clipboard
    else
        # stdin is not a pipe
        # clipboard -> stdout
        xclip -o -selection clipboard
    fi
else
    echo "Remember to install xclip"
fi

Версия скрипта для OS X использует pbcopy и pbpaste, которые предустановлены на всех компьютерах Mac.

#!/bin/bash
# OS X version
# Use this script to pipe in/out of the clipboard
#
# Usage: someapp | clipboard     # Pipe someapp's output into clipboard
#        clipboard | someapp     # Pipe clipboard's content into someapp
#

if [[ -p /dev/stdin ]] ; then
    # stdin is a pipe
    # stdin -> clipboard
    pbcopy
else
    # stdin is not a pipe
    # clipboard -> stdout
    pbpaste
fi

Использовать сценарий очень просто, поскольку вы просто вводите или выводите clipboard, как показано в этих двух примерах.

$ cat file | clipboard

$ clipboard | less
40
Bob Enohp

Я создал инструмент для Linux/OSX/Cygwin, который похож на некоторые из этих других, но немного уникален. Я называю это cb и это можно найти в этом github Gist .

В этом Gist я демонстрирую, как выполнять копирование и вставку через командную строку, используя Linux, macOS и Cygwin.

Linux

_copy(){
    cat | xclip -selection clipboard
}

_paste(){
    xclip -selection clipboard -o
}

macos

_copy(){
    cat | pbcopy
}

_paste(){
    pbpaste
}

Cygwin

_copy(){
    cat > /dev/clipboard
}

_paste(){
    cat /dev/clipboard
}

Примечание: изначально я просто хотел упомянуть об этом в своем комментарии к ответу Боба Энохпа . Но потом я понял, что мне нужно добавить README в мой Gist. Поскольку редактор Gist не предлагает предварительный просмотр Markdown, я использовал здесь поле для ответа и после того, как скопировал/вставил его в свою мысль Gist: «Я мог бы также отправить ответ».

cb

Герметичная тройник в буфер обмена

Этот скрипт смоделирован после tee (см. man tee ).

Это похоже на ваши обычные команды копирования и вставки, но унифицированные и способные воспринимать, когда вы хотите, чтобы они были цепными

Примеры

Копия

$ date | cb
# clipboard contains: Tue Jan 24 23:00:00 EST 2017

Вставить

# clipboard retained from the previous block
$ cb
Tue Jan 24 23:00:00 EST 2017
$ cb | cat
Tue Jan 24 23:00:00 EST 2017
$ cb > foo
$ cat foo
Tue Jan 24 23:00:00 EST 2017

Цепной

$ date | cb | tee updates.log
Tue Jan 24 23:11:11 EST 2017
$ cat updates.log
Tue Jan 24 23:11:11 EST 2017
# clipboard contains: Tue Jan 24 23:11:11 EST 2017

Копировать через файл перенаправления

(хронологически имело смысл продемонстрировать это в конце)

# clipboard retained from the previous block
$ cb < foo
$ cb
Tue Jan 24 23:00:00 EST 2017
# note the minutes and seconds changed from 11 back to 00
38
Bruno Bronosky

Добавьте это к своему ~/.bashrc:

# Now `cclip' copies and `clipp' pastes'
alias cclip='xclip -selection clipboard'
alias clipp='xclip -selection clipboard -o'

Теперь обрежьте p вставьте и c обрежьте копии - но вы также можете делать более интересные вещи:

clipp | sed 's/^/    /' | cclip

↑ сделать отступ в вашем буфере обмена; хорошо для сайтов без переполнения стека { } кнопка

Вы можете добавить его, запустив это:

printf "\nalias clipp=\'xclip -selection c -o\'\n" >> ~/.bashrc
printf "\nalias cclip=\'xclip -selection c -i\'\n" >> ~/.bashrc
20
user3276552

Я использую Parcellite и xsel, чтобы скопировать последнее сообщение коммита из git в мой менеджер буфера обмена (по какой-то причине xclip не работает):

$ git log -1 --pretty=%B | xsel -i -b
7
Michal Przybylowicz

Без использования внешних инструментов, если вы подключаетесь к серверу SSH, это довольно простая команда:

Из командной строки Windows 7+:

ssh [email protected] cat /etc/passwd | clip

Это поместит содержимое удаленного файла в ваш локальный буфер обмена.

(Команда требует запуска Pageant для ключа, или она попросит вас ввести пароль.)

5
d.raev

В Linux с установленным xclip:

буфер обмена xclip -selection <файл

3
tristobal

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

https://sourceforge.net/projects/commandlinecopypaste/

Обратите внимание, что этот инструмент не требует X-сеанса. Буфер обмена может использоваться только в терминале и не должен быть вставлен Ctrl+V или щелчок средней кнопкой мыши в других X-окнах.

3
Dirk Duschinger

Для тех, кто использует bash, установленный в их системе Windows (известной как Windows Subsystem for Linux (WSL)), попытка xclip выдаст ошибку:

Error: Can't open display: (null)

Напомним, что подсистема Linux имеет доступ к исполняемым файлам Windows. Можно использовать clip.exe как

echo hello | clip.exe

который позволяет использовать команду вставки (ctrl-v).

0
DFeng

Я пришел из урезанного фона KDE и не имею доступа к xclip, xsel или другим модным вещам. У меня есть TCSH Konsole, чтобы сделать дела хуже.

Реквизиты: qdbusklipperxargsbash

Создайте исполняемый файл bash foo.sh.

#!/bin/bash
qdbus org.kde.klipper /klipper setClipboardContents "$1" > /dev/null

Примечание: Это должно быть bash, поскольку TCSH не поддерживает многострочные аргументы.

Вслед за псевдонимом TCSH в .cshrc.

alias clipboard xargs -0 /path/to/foo

Объяснение:

xargs -0 передает stdin в один аргумент. Этот аргумент передается исполняемому файлу bash, который отправляет запрос «copy to clipboard» в klipper, используя qdbus. Канал к /dev/null не должен выводить символ новой строки, возвращаемый qdbus на консоль.

Пример использования:

ls | clipboard

Это копирует содержимое текущей папки в буфер обмена. 

Примечание: Работает только как труба. Используйте исполняемый файл bash direct, если вам нужно скопировать аргумент.

0
Ryan Dsouza

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

if [ -n "$(type -P xclip)" ]
then
  alias xclip='xclip -selection clipboard'
  alias clipboard='if [ -p /dev/stdin ]; then xclip -in; fi; xclip -out'
fi

Примеры:

# Copy
$ date | clipboard
Sat Dec 29 14:12:57 PST 2018

# Paste
$ date
Sat Dec 29 14:12:57 PST 2018

# Chain
$ date | clipboard | wc
   1       6      29
0
kornieff

Просто для покрытия случая Edge :) и потому, что заголовок вопроса спрашивает (по крайней мере, сейчас), как скопировать вывод команды непосредственно в буфер обмена.

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

Для этого сценария мы можем использовать либо gdm, либо аналогичную утилиту мыши и выбирать с помощью мыши. apt-get install gdm и затем либо правый клик, либо комбинации Cntrl + Shift + c и Cntrl + Shift + v для копирования и вставки в терминал

Или, который является предпочтительным для меня способом (так как мышь не может правильно выбрать внутри одной панели, когда у вас есть несколько панелей рядом и вам нужно выбрать более одной строки), используя tmux, мы можем скопировать в буфер tmux, используя стандартный [ пробел, переместить, чтобы выбрать, введите или вы можете выбрать блок кода. Также это особенно полезно, когда вы находитесь внутри одной из полос мультиплексора cli, например tmux, и вам нужно выбрать группу текста, но не номера строк (моя установка vim отображает номера строк)

После этого вы можете использовать команду:

tmux save-buffer - | xclip -i

Конечно, вы можете присвоить ему псевдоним или привязать его напрямую в конфигурационном файле tmux.

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

Ура

0
George Mogilevsky