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

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

cat file | clipboard

25 ответов

Решение

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

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

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

Я создал инструмент для 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

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

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

Ubuntu/Debian на WSL

При использовании ОС Windows Subsystem для Linux наxclipрешение не сработает. Вместо этого используйтеclip.exe а также powershell.exe вот так:

if grep -q -i microsoft /proc/version; then
    # on WSL
    alias copy="clip.exe"
    alias paste="powershell.exe Get-Clipboard"
else
    # on "normal" linux
    alias copy="xclip -sel clip"
    alias paste="xclip -sel clip -o"
fi

Применение

Копировать:

cat file | copy

И вставить:

paste > new_file

Добавьте это к вашему ~/.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

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

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

$ pwd | pbcopy

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

$ cd $(pbpaste)

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

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

ssh user@server cat /etc/passwd | clip

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

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

macOS:

      pbcopy < your_command_which_gives_output

WSL / GNU / Linux (требуется пакет xclip):

      xclip -sel clip < your_command_which_gives_output

Git Bash в Windows:

      your_command_which_gives_output | clip

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

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

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

cat ~/.ssh/id_rsa.pub | pbcopy

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

На Wayland xcopy, похоже, не работает, используйте вместо этого wl-clipboard. например, на Fedora

sudo dnf install wl-clipboard

tree | wl-copy

wl-paste > file

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

Error: Can't open display: (null)

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

echo hello | clip.exe

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

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

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

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

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

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

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

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

Вот отличное решение для пользователей Arch Linux . Установите xsel с помощью pacman, например:

      sudo pacman -S xsel

Создайте псевдоним в файле ~ / .bashrc, например:

      alias pbcopy='xsel --clipboard --input'
alias pbpaste='xsel --clipboard --output'

перезагрузите терминал с исходным кодом:

      source ~/.bashrc

используйте его, как указано выше:

      cat your_file.txt | pbcopy

fyi, хорошая практика заключается в том, чтобы использовать все псевдонимы в ~ / .aliases и вызывать их в файле .bashrc

Ответ 2021 года

Если вы искали ответ на вопрос: «Как скопировать вывод одной команды в буфер обмена, чтобы использовать его для следующей команды?» как и я тогда, это работает для моего Mac, тогда это решение отлично работает.

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

Я решил это, выполнив свою первую команду $ which postgres с участием $ pbcopy.

      which postgres | pbcopy

Тогда я мог просто coomand+, Vчто дало желаемый результат:

      /usr/local/bin/postgres

Есть способ, который работает без установки xclip/ xsel, полезно, если у вас нет доступа к sudo.

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

Сохраните этот скрипт как ~/copy_to_clipboard.sh,

      #!/bin/sh
if [ -z "$1" ]
  then
  str=" "
else
  str=$1
fi

vimx -u NONE -U NONE -N -c "let @a=\".\"" -c "let @*= \"$str\" " -c " put a " -c "sleep 2" -c " q!"

дать разрешение на выполнение: chmod +x ~/copy_to_clipboardи вызовите его с помощью:

      ~/copy_to_clipboard.sh STRING

Почему-то нужно поставить пустышку @aзарегистрируйтесь и вставьте во временный файл. В противном случае регистр буфера обмена не будет установлен правильно. В конце удалите временный файл Vim.

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

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

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

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

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

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

tmux save-buffer - | xclip -i

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

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

ура

С привилегиями sudo:

      echo '#!/usr/bin/python3
# -*- coding: utf-8 -*-
import sys
from tkinter import Tk
r = Tk()
r.withdraw()
r.clipboard_clear()
data = ""
for i in sys.stdin:
        data = data + i
r.clipboard_append(data)
r.update()
r.destroy()' | sudo tee /usr/bin/copy > /dev/null
sudo chmod +x /usr/bin/copy

В качестве альтернативы без привилегий sudo (только для одного пользователя):

      echo '#!/usr/bin/python3
# -*- coding: utf-8 -*-
import sys
from tkinter import Tk
r = Tk()
r.withdraw()
r.clipboard_clear()
data = ""
for i in sys.stdin:
        data = data + i
r.clipboard_append(data)
r.update()
r.destroy()' > ~/.local/bin/copy
chmod +x ~/.local/bin/copy

Применение:

      echo "hi" | copy

Я создал инструмент здесь

зависит от пакета xclip

ДляmacOS, это мой обычайpbcopy/pbpasteобертка в моей библиотеке, чтобы я мог

  • "copy"что-нибудь прямо из буфера обмена (при обработке других данных),

  • напрямую"paste into" awk,

  • иметь дополнительные псевдонимы функций для тех, кто исходит из парадигмы Windows


      function  copy2pb(_) { return cmdC(_) }
function    CtrlC(_) { return cmdC(_) }
function cmdC(_, __) { 
                        # 1st argument : item to copy out
                        # 2nd argument : optional custom trailing byte
    
    printf("%s%s",_, __~/^[\0\12-\15]+$/ \
                                     ? __ \
            :        __~/^[Yyn]/    ?  ORS \
            : "") | (_ = " LC_ALL=C pbcopy ")
    return close(_)
}

      function       pb2paste() { return cmdV() }
function          CtrlV() { return cmdV() }
function cmdV(__, ___, _) {
                            # since this is for pasting in, 
                            # any and every argument made would be ignored
    return \
    substr((___ = RS) (RS = "^$"),
    (_ = " LC_ALL=C pbpaste ") | getline __,
     -close(_) ^ (RS = ___)^sub("\n$", "", __))__
}

Простота !:
Две строчки кода в каждом методе!
# Нечего устанавливать с множеством зависимостей, которые могут иметь проблемы с безопасностью.

2 метода, 2-й метод не работает с редактором nano в Debian
1-й метод:
1.
sudo printf "\ n #$(date)" >> /path /tended_file

добавление любой строки с ведущим знаком комментария # не повреждает ни один файл

sudo gedit / путь / предназначенный_файл

скопируйте дату в буфер обмена внутри редактора и вставьте в любое место.


2hd метод

1.
sudo find / -iname 'uniqueFile' >> delete.txt
# в этом примере путь / uniqueFile записывается в файл delete.txt
2.
gedit delete.txt #
копирует (Ctrl-c) выделенный желаемый длинный-длинный путь в буфер обмена от редактора. Или вы также можете использовать редактор терминала nano без стандартного Ctrl-c
3. Необязательно, потому что delete.txt может быть вашим личным файлом журнала
rm delete.txt
или
mv delete.txt memo-uniqueFile.txt

Другие вопросы по тегам