Как я могу скопировать вывод команды прямо в буфер обмена?
Как я могу передать вывод команды в буфер обмена и вставить его обратно при использовании терминала? Например:
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, чтобы усугубить ситуацию.
Реквизиты: 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 напрямую, если вам нужно скопировать аргумент.
В 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
Для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