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


529

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

cat file | clipboard


возможный дубликат superuser.com/questions/104981/…
Champ

Я только что задал связанный вопрос, так как не могу заставить работать xclip при входе в Ubuntu из Git Bash в Windows: stackoverflow.com/q/60117294/470749
Райан,

1
Сохраните содержимое файла в буфер обмена. apt install xclipиcat file | xclip -sel clip
EsmaeelE

Ответы:


598

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

Сначала установите программу 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

146
«cat file | xclip» только копирует содержимое в буфер обмена «X», если вы хотите вставить что-то еще, кроме приложения «X», попробуйте следующее: «cat file | xclip -selection clipboard»
хот

5
Ваш выбор ручки уместен!
Мэтт Джойнер

4
Если вы хотите удалить символ новой строки, чтобы вы могли напрямую вставить и отредактировать результат «pwd | c», вы можете выполнить «pwd | tr -d '\ n' | xclip -selection c»
Anake

12
также определить alias "cs=xclip -selection clipboard"и alias "vs=xclip -o -selection clipboard"сделать копирование / вставку из системного буфера обмена проще
Yibo Yang

1
Как насчет решения, где у меня нет доступа к sudo, а xclip не установлен ??
DanGordon

179

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

pbcopy < .ssh/id_rsa.pub

14
Yups! Точно так же для бывших:pbcopy < .ssh/id_rsa.pub
doublejosh

не работает для вывода команды tho - напримерpbcopy < git merge-base master some-branch
Ben

если вы используете tmux, он не будет работать, если вы не подключите ваш сеанс заново: superuser.com/a/413233/146254
Atav32

1
вы также можете использовать cat, если вы уже работаете с ним: cat file.txt | pbcopy
rtrigoso

3
Я знаю, что комментарию 5 лет, но в случае, если кто-то наткнется на это в будущем, чтобы использовать с выводом команды, сделайтеgit merge-base master some-branch | pbcopy
Сэм

62

Я создал инструмент для Linux / OSX / Cygwin, который похож на некоторые из этих других, но немного уникален. Я называю это, cbи это может быть найдено в этом github 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 не предлагает предварительный просмотр Markdown, я использовал здесь поле для ответа и после того, как скопировал / вставил его в свою мысль: «Я мог бы также отправить ответ».

центибар

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

Этот скрипт смоделирован после 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

Это отлично работает для меня, чтобы скопировать вывод команды в буфер обмена в терминале на MacOS, спасибо!
Джошуа Дейк

46

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

Версия скрипта для 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

3
Я использую имена pbcopyи pbpasteв Linux, поэтому он работает как для Linux, так и для OS X.
StackedCrooked

Чтобы заставить скрипт работать глобально в ubuntu: * Сохраните его в ~/.scripts/clipboard * Сделайте его исполняемым chmod +x ~/.scripts/clipboard для bash: * добавьте export PATH=$PATH:~/.scriptsв конец ~/.bashrc для fish: * добавьте set PATH ~/.scripts $PATHв ~/.config/fish/fish.config Если какие-либо файлы или папки еще не существуют, просто создайте их.
Хоккей

2
Вы также можете обернуть этот скрипт как функцию clipboard(){ ... }и вставить его в .bashrc
Себастьян Новак

Это очень похоже на то, что я сделал, но я разрешаю цепочку как date | cb | tee -a updates.log. Это отправит dateвывод команды в буфер обмена и передаст ее tee -aкоманде, которая добавляет его в файл и передает его stdout. Но это похоже на « герметичную тройник в буфер обмена», потому что если вы просто не date | cbполучите ничего, вы получите. И, наконец, это также делает cb > file.txt gist.github.com/RichardBronosky/…
Бруно Броноски

Одно из предложений - убрать завершающий символ новой строки, чтобы избежать выполнения команды при вставке (например, при копировании или вставке пути). Я делаю это, изменяя команду xclip -i -selection clipboardнаxargs echo -n | xclip -i -selection clipboard
Ивайло Странджев

23

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

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

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

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

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

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

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

Приведите пример использования, пожалуйста
Ульф Аслак

7

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

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

7

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

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

ssh user@server cat /etc/passwd | clip

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

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


1
@AfshinMoazami, название и сам вопрос являются общими, только подсказки для системы Unix, и мой ответ покрывает случай, когда вы пытаетесь получить дату С сервера Unix НА компьютер с Windows, что может пригодиться будущим читателям.
д.раев

1
Проголосовал, потому что да, полезно для администраторов Windows, у которых есть только Powershell, чтобы играть с ним локально (хотя теперь, когда LSW действительно работает, я могу перейти в bash прямо из Powershell и делать оттуда * * nixy).
flith

Его рабочий на DOS строке, а также мерзавец Баш на окнах 10 тecho Hello World | clip

5

Для Mac это пример способа скопировать (в буфер обмена) вставку (из буфера обмена) с помощью командной строки

Скопируйте результат pwdкоманды в буфер обмена как

$ pwd | pbcopy

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

$ cd $(pbpaste)

3

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

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

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



2

Основываясь на предыдущих постах, я получил следующее легкое решение для псевдонимов, которое можно добавить к .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

1

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

Реквизиты: qdbus klipper xargs bash

Создайте исполняемый файл 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 напрямую, если вам нужно скопировать аргумент.


1

Я обычно запускаю эту команду, когда мне нужно скопировать мой ssh-key:

cat ~/.ssh/id_rsa.pub | pbcopy

ctrl+v где-нибудь еще.



0

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

Error: Can't open display: (null)

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

echo hello | clip.exe

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


1
Обратите внимание, что если в Windows установлен xserver (например, vcxsvr или xming), дисплей работает, а xclipboard запущен, то вы действительно можете без проблем использовать xclip.
бит

0

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

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

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

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

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

tmux save-buffer - | xclip -i

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

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

ура

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.