ไปป์จาก / ไปยังคลิปบอร์ดใน Bash script


946

เป็นไปได้ที่จะไปป์จาก / ไปที่คลิปบอร์ดใน Bash?

ไม่ว่าจะเป็นท่อไปยัง / จากที่จับอุปกรณ์หรือใช้แอพพลิเคชั่นเสริมฉันไม่พบอะไรเลย

ตัวอย่างเช่นหาก/dev/clipเป็นอุปกรณ์ที่เชื่อมโยงไปยังคลิปบอร์ดเราสามารถทำได้:

cat /dev/clip        # Dump the contents of the clipboard
cat foo > /dev/clip  # Dump the contents of "foo" into the clipboard

3
ฉันใช้:%y+ในกลุ่มซึ่งเป็นกลุ่มสำหรับ "งัด (คัดลอก) ทุกบรรทัดในการลงทะเบียน '+' ( PRIMARYคลิปบอร์ดX )" คุณสามารถแทนที่%ด้วยช่วงถ้าคุณต้องการที่จะเฉพาะเจาะจง แต่มีสามประการ: 1. ตอนนี้คุณต้องบันทึกข้อความใด ๆ ลงในไฟล์ก่อนจึงจะสามารถคัดลอกได้ ตรงข้ามกับxclipคำสั่งที่กล่าวถึงในคำตอบ 2. หากคุณยังไม่รู้วิธีในการเป็นกลุ่มนี้อาจเป็นเรื่องน่าเบื่อ 3. คุณสามารถทำสิ่งนี้ได้หากเปิดใช้งานคุณสมบัติบางอย่างเมื่อรวบรวม vim หากคุณติดตั้ง GVim ควรเปิดใช้งานตามค่าเริ่มต้นในทั้งอินสแตนซ์ GUI และ terminal ของ vim
Braden สุดยอด

1
@BradenBest คุณควรใส่นี่เป็นคำตอบ ฉันอยู่ในสภาพแวดล้อม NIX และไม่สามารถติดตั้งxclipได้ คำตอบของคุณทำงานได้อย่างมีเสน่ห์
HankCa

@HankCa เอาล่ะผมโพสต์คำตอบ บอกสิ่งที่คุณคิดว่า.
Braden ที่ดีที่สุด

@BradenBest เป็นคำตอบที่ครอบคลุมมาก ฉันแค่ชอบ:%y+แต่ก็โอเคคุณมีฐานครอบคลุมทั้งหมดแล้ว! สิ่งที่ดี.
HankCa

ตัวเลือกอื่น: ใช้สคริปต์ Perl เล็กน้อย: ไม่จำเป็นต้องติดตั้ง ดูคำตอบของฉันด้านล่าง
VonC

คำตอบ:


862

มีคลิปบอร์ดมากมายที่คุณสามารถจัดการได้ ฉันคาดว่าคุณอาจเป็นผู้ใช้ Linux ที่ต้องการใส่ข้อมูลลงในคลิปบอร์ดหลักของ X Windows โดยปกติแล้วคลิปบอร์ดที่คุณต้องการคุยด้วยจะมียูทิลิตี้ที่ช่วยให้คุณสามารถพูดคุยได้

ในกรณีของ X มีxclip(และอื่น ๆ ) xclip -selection cจะส่งข้อมูลไปยังคลิปบอร์ดที่ทำงานร่วมกับCtrl + C, Ctrl + Vในการใช้งานมากที่สุด

หากคุณบน Mac OS X pbcopyมี

หากคุณอยู่ในโหมดเทอร์มินัล Linux (ไม่ใช่ X) ให้ดูที่หน้าจอgpmหรือที่มีคลิปบอร์ด ลองใช้คำสั่งscreenreadreg

ภายใต้ Windows 10+ หรือ Cygwin ใช้หรือ/dev/clipboardclip



24
บน Windows /dev/clipboardสามารถใช้งานได้กับ Msys / MinGW bash shells ด้วย
Mihai Rotaru

71
โปรดทราบว่าxclip -selection cจะส่งข้อมูลไปยังคลิปบอร์ดที่ทำงานร่วมกับ ^ C, ^ V ในแอปพลิเคชันส่วนใหญ่
Klaas van Schelven

31
สำหรับ Windows รุ่นที่ใหม่กว่าคุณสามารถใช้clipสิ่งนี้:dir | clip
maep

11
มันเป็นเรื่องน่าเศร้าที่ GNU / Linux ไม่มีอุปกรณ์เช่น/dev/clipboard, และกองกำลังในการติดตั้งอย่างใดอย่างหนึ่งอย่างใดอย่างหนึ่ง xclip แกลลอนต่อนาทีซึ่งจะหายไปโดยปริยายอย่างน้อยใน Kubuntu (ฉันเดาใน distros อื่น ๆ ส่วนใหญ่เกินไป)
Hi-Angel

282

ตรวจสอบให้แน่ใจว่าคุณกำลังใช้อยู่alias xclip="xclip -selection c" มิฉะนั้นคุณจะไม่สามารถใช้Ctrl+ vเพื่อวางกลับในที่อื่นได้

echo test | xclip    

Ctrl+v === test


1
ใครจะไปเกี่ยวกับการวางโดยไม่มีอาร์กิวเมนต์คำสั่งที่?
โยนาห์

15
xclip -selection clipboard -o
doug

32
ตั้งแต่ฉันกลับไปกลับมาระหว่าง osx และ linux มากฉันมีสิ่งต่อไปนี้ใน dotfiles ของฉัน alias pbcopy="xclip -selection c" alias pbpaste="xclip -selection clipboard -o" หวังว่าจะช่วย
doug

15
@ApockofFork xclipไม่ได้เพิ่มบรรทัดใหม่echoคือ ลองprintf test | xclip -i -selection clipboardดู ( printfไม่ต้องเพิ่มบรรทัดใหม่นอกจากว่าคุณจะเขียน'test\n')
David X

7
หรือใช้แทนecho -n printf
Christian Pietsch

182

ติดตั้ง

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

อย่าลืมรีสตาร์ทอินสแตนซ์ปลาโดยรีสตาร์ทเครื่องเพื่อรับการเปลี่ยนแปลง

การใช้

ตอนนี้คุณสามารถใช้setclipและgetclipเช่น:

$ echo foo | setclip
$ getclip
foo

3
สำหรับ distros อื่น ๆ ทั้งหมด: คุณสามารถดาวน์โหลดซอร์สได้จากsourceforge.net/projects/xclip
Scz

+1 ทางออกที่ดีที่สุด! sudo pacman -S xclipในโค้ง แต่โปรดทราบว่า.bashrcไม่ใช่สถานที่ที่ดีที่สุด ฉันขอแนะนำให้ผู้ใช้อ่านไฟล์ bashrc, bash_aliases และ. profile ที่เหมาะสมและวิธีทุบตีจัดการแต่ละไฟล์ เคล็ดลับ: ใส่ไว้ใน. bash_aliases แทน
eduncan911

1
ขอบคุณ @ eduncan911! :) เพิ่มตัวเลือกในการใช้ตัวpacmanจัดการแพ็กเกจและลบ.bashrcข้อเสนอออก ฉันรู้ว่า.bash_aliasesมีการดัดแปลงมากขึ้น แต่ผลลัพธ์ที่ได้ก็เหมือนกัน ( .bashrcเพียงต้องการ.bash_aliasesหากมี) หากคนต้องการระบบยุ่งให้พวกเขามีหนึ่ง :)
tleb

@EladTabak มีความสุขมันช่วยได้
2560

1
@ jpaugh คุณถูกต้อง .bashrcแหล่ง.bash_aliasesที่มาของฉันในตอนท้าย ;) ฉันทำตามแบบแผนเดิมที่ยังคงเข้ากันได้ 100% กับ Arch, Ubuntu / Debian, Raspberry รุ่นต่างๆ, macOS / OSX และ Windows Bash: stefaanlippens.net/my_bashrc_aliases_profile_and_other_stuff ด้วยการประชุมนั้นฉันใช้ dotfiles เดียวกันกับทุกเครื่อง ฉันสัมผัส. มันค่อนข้างดี: github.com/eduncan911/dotfiles
eduncan911

143

บน macOS ใช้คำสั่งในตัวpbcopyและpbpaste

ตัวอย่างเช่นหากคุณเรียกใช้

cat ~/.bashrc | pbcopy

เนื้อหาของ~/.bashrcไฟล์จะพร้อมใช้งานสำหรับการวางด้วยCmd+ vทางลัด



25

xselบน Debian / Ubuntu / Mint

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

# 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

สิ่งนี้แตกต่างจากecho "foo" | xclip -selection cอย่างไร
LéoLéopold Hertz 준영

มีคำตอบบางอย่างสำหรับคำตอบสำหรับคำถามนี้ของUbuntuแต่ส่วนใหญ่xselและxclipเทียบเท่าในทุก ๆ ด้านยกเว้นว่าxclipสามารถอ่าน / เขียนไฟล์ตามชื่อได้ แต่xselต้องการการเปลี่ยนเส้นทางเชลล์หากคุณต้องการเข้าถึงไฟล์
โคลินดีเบนเน็ตต์

xselทำงานได้ดีจากสคริปต์ในขณะที่xclip ทำงานจากพร้อมท์เท่านั้น ไม่แน่ใจว่าทำไม
NVRM

16

ว้าวฉันไม่อยากจะเชื่อเลยว่ามีคำตอบสำหรับคำถามนี้กี่คำ ฉันไม่สามารถพูดได้ว่าฉันได้ลองพวกเขาทั้งหมดแล้ว แต่ฉันได้ลองท็อป 3 หรือ 4 และพวกมันก็ไม่เหมาะกับฉัน สิ่งที่ใช้ได้ผลสำหรับฉันคือคำตอบซึ่งอยู่ในความคิดเห็นข้อหนึ่งที่เขียนโดยผู้ใช้ชื่อ doug เนื่องจากฉันพบว่ามีประโยชน์มากฉันจึงตัดสินใจตอบคำตอบใหม่

ติดตั้งยูทิลิตี xcopy และเมื่อคุณอยู่ในเทอร์มินัลอินพุต:

สำเนา

Thing_you_want_to_copy|xclip -selection c

วาง

myvariable=$(xclip -selection clipboard -o)

ฉันสังเกตเห็นคำตอบมากมายที่แนะนำ pbpaste และ pbcopy หากคุณอยู่ในยูทิลิตี้เหล่านั้น แต่ด้วยเหตุผลบางอย่างที่ไม่มีใน repo คุณสามารถสร้างนามแฝงสำหรับคำสั่ง xcopy และเรียกพวกเขาว่า pbpaste และ pbcopy

alias pbcopy="xclip -selection c" 
alias pbpaste="xclip -selection clipboard -o" 

ดังนั้นมันจะเป็นดังนี้:

Thing_you_want_to_copy|pbcopy
myvariable=$(pbpaste)

เยี่ยมมากส่วนชื่อแทนของคุณตรงกับ MacOS ค่อนข้างดี
MeadowMuffins

15

2018 คำตอบ

ใช้คลิปบอร์ด CLI มันทำงานร่วมกับ macOS, Windows, Linux, OpenBSD, FreeBSD และ Android โดยไม่มีปัญหาจริงใด ๆ

ติดตั้งด้วย:

npm install -g clipboard-cli

จากนั้นคุณสามารถทำได้

echo foo | clipboard

ถ้าคุณต้องการคุณสามารถนามแฝงไปcbโดยวางต่อไปในของคุณ.bashrc, .bash_profileหรือ.zshrc:

alias cb=clipboard


2
คุณแน่ใจหรือว่าเป็นnpmแพ็คเกจที่ปลอดภัย
จอห์นนี่

3
@Stas ฉันหวังว่ามันจะทำโดย Sindresorhus ( github.com/sindresorhus ) ผู้มีส่วนร่วมในโหนดที่มีผลมากที่สุด เขารับผิดชอบห้องสมุดทดสอบ Ava, xo linter, Yeoman และโครงการอื่น ๆ อีกนับไม่ถ้วน เขายังรับผิดชอบห้องสมุดขนาดเล็กนับไม่ถ้วนเช่นนี้ที่รวมรหัสของเขาไว้ในเกือบทุกเว็บไซต์ที่ใช้งาน JS บนอินเทอร์เน็ต นั่นไม่ได้หมายความว่าเขาไม่สามารถประนีประนอมได้ เพียงว่าปริมาณตาของ repos ของเขาและชื่อเสียงของเขาเองทำให้มีโอกาสน้อยกว่า repos npm ที่สุ่มมากที่สุด
Evan Conrad

เย็น! ทำงานบน Ubuntu GNU / Linux โดยที่ xclip ไม่ทำงาน
Kevin Buchs

14

บนระบบย่อย Windows สำหรับ Linux คุณสามารถคัดลอกไปยังคลิปบอร์ดด้วย clip.exe

cat file | clip.exe

จำไว้ว่าให้ใช้|คำสั่งไพพ์ และไม่ใช่>คำสั่งเนื่องจากจะไม่ทำงาน


11

นี่คือสคริปต์สคริปต์ทุบตีที่พร้อมสำหรับการอ่านคลิปบอร์ดซึ่งทำงานบนหลายแพลตฟอร์ม โปรดแก้ไขสคริปต์ที่นี่หากคุณเพิ่มฟังก์ชัน (เช่นแพลตฟอร์มอื่น ๆ )

#!/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

bruhh นี่ใช้งานได้จริงทำไมคำตอบนี้ไม่ได้หรือไม่
255.tar.xz

9

บน Windows (กับ Cygwin) ลอง cat /dev/clipboardหรือecho "foo" > /dev/clipboardเป็นที่กล่าวถึงในนี้บทความ


1
ในฐานะที่เป็นผู้ใช้ @maep กล่าวถึงในความคิดเห็นที่แยกต่างหากรุ่นใหม่ของ Windows (ฉันเท่านั้นที่สามารถยืนยันได้ Win10) clipสามารถเพียงท่อ ฉันใช้ msysgit 1.9.5 และใช้งานได้
Shawn Erquhart

echo "foo" > /dev/clipboardดูเหมือนจะทำลายการขึ้นบรรทัดใหม่อย่างสมบูรณ์ (ไม่ใช่สิ่ง \ r \ n \ n แต่หายไปโดยสิ้นเชิง)
user1529413

9

สำหรับ Mac เท่านั้น:

echo "Hello World" | pbcopy
pbpaste

เหล่านี้จะอยู่และ/usr/bin/pbcopy/usr/bin/pbpaste


8

มีคลิปบอร์ดที่แตกต่างกันใน Linux; เซิร์ฟเวอร์ X มีหนึ่งตัวจัดการหน้าต่างอาจมีอีกตัวหนึ่งเป็นต้นไม่มีอุปกรณ์มาตรฐาน

โอ้ใช่แล้วบน CLI โปรแกรมหน้าจอมีคลิปบอร์ดของตัวเองเช่นเดียวกับแอปพลิเคชั่นอื่น ๆ เช่นEmacsและvi vi

ใน X คุณสามารถใช้xclip xclip

คุณสามารถตรวจสอบกระทู้นี้สำหรับคำตอบอื่น ๆ ที่เป็นไปได้: http://unix.derkeiler.com/Newsgroups/comp.unix.shell/2004-07/0919.html


2
ดูเหมือนว่าการสร้าง / dev / clip น่าจะเป็นโครงการที่ดีสำหรับใครบางคน
TED

2
ฉันตระหนักดีถึงคลิปบอร์ดหลายอัน สิ่งนี้ทำให้คำถามของฉันตอบยากขึ้นได้อย่างไร
moinudin

มันจะสมเหตุสมผลถ้าคลิปบอร์ดมีมาตรฐานอาจไม่เจ็บถ้าคุณสามารถใช้ / dev / clip1, / ​​dev / clip2 .. / dev / clip <n> เพื่อเข้าถึงพวกเขาปัญหาเดียวคือพวกเขาเฉพาะผู้ใช้และ อุปกรณ์ทั่วทั้งระบบ แต่ถ้าคุณสร้างไดรเวอร์อุปกรณ์เคอร์เนลที่ปิดบังตามการเข้าถึง UID มันควรจะทำงานได้อย่างที่คาดไว้

5

คัดลอกและวางไปยังคลิปบอร์ดใน 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 เพื่อใส่ลงในคลิปได้)


4

นี่เป็นสคริปต์ 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 |
                ||     ||

การรันด้วยตัวเองจะเป็นการแสดงสิ่งที่อยู่ในคลิปบอร์ด


สิ่งนี้จะทำงานเมื่อคุณอยู่บนคอมพิวเตอร์เครื่องเดียว แต่จะไม่อนุญาตให้คุณคัดลอกสิ่งต่าง ๆ ระหว่างคอมพิวเตอร์
Charles Plager

ดูเหมือนว่า `echo str> tmpfile` เท่านั้นและ cat tmpfileไม่ใช่การทำงานของคลิปบอร์ด // เหมือนกับ @horta คำตอบ
yurenchen

ดูเหมือนจะไม่ตั้งค่าตัวแปรคลิปบอร์ดดังนั้นฉันจึงไม่สามารถวางเนื้อหาในแอปพลิเคชันอื่น - ไม่ใช่คลิปบอร์ดจริง!
jena

4

ฉันพบข้อมูลอ้างอิงที่ดี: /unix/69111/

ในกรณีของฉันฉันต้องการวางเนื้อหาบนคลิปบอร์ดและดูว่ามีการวางอะไรอยู่ที่นั่นดังนั้นฉันจึงใช้teeคำสั่งพร้อมด้วย file descriptor:

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

>()เป็นรูปแบบของการทดแทนกระบวนการ bash จะแทนที่แต่ละอันด้วยพา ธ ไปยัง file descriptor ซึ่งเชื่อมต่อกับอินพุตมาตรฐานของโปรแกรมภายในวงเล็บ

teeคำสั่งส้อมคำสั่งของคุณช่วยให้คุณสามารถ "ท่อเนื้อหา" และดูผลที่ได้มาตรฐานการส่งออก "stdout"

คุณยังสามารถสร้างนามแฝงเพื่อรับและเขียนบนคลิปบอร์ดทำให้คุณสามารถใช้ "pbcopy" และ "pbpaste" ราวกับว่าคุณอยู่บน MAC ในกรณีของฉันเนื่องจากฉันใช้ zsh ฉันมีสิ่งนี้ในไฟล์นามแฝง:

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

(( $+command[name] ))ในการทดสอบ zsh ถ้าคำสั่ง "ชื่อ" {}ติดตั้งในระบบของคุณแล้วทั้งนามแฝงจะถูกจัดกลุ่มด้วย the &&binary และถ้า a แล้ว b ดังนั้นถ้าคุณมี xclip alias จะถูกตั้งค่า

echo "another test" | tee >(pbcopy)

หากต้องการรับเนื้อหาคลิปบอร์ดของคุณให้พิมพ์:

pbpaste | "any-command-you-need-here"

4
  xsel -b

ทำงานกับ X Window หรือไม่และส่วนใหญ่ติดตั้งไว้แล้ว การดูหน้า man ของxselนั้นคุ้มค่ากับความพยายาม


2

โปรแกรม Windows บางโปรแกรมที่ฉันเขียนเมื่อหลายปีก่อน มันช่วยให้คุณถ่ายโอนข้อมูลเพิ่มผนวกและพิมพ์คลิปบอร์ด มันได้ผลเช่นนี้:

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

มันมีรหัสแหล่งที่มา: cmd_clip.zip


2

มีสองวิธี บางวิธีที่ได้รับการกล่าวถึงรวมถึง (ฉันคิดว่า) tmux, หน้าจอ, เป็นกลุ่ม, emacs และเปลือก ฉันไม่รู้ emacs หรือหน้าจอดังนั้นฉันจะไปอีกสามคน

Tmux

แม้ว่าจะไม่ใช่การเลือก X แต่ tmux มีโหมดการคัดลอกที่สามารถเข้าถึงได้ผ่านทางprefix-[( prefixคือCtrl+ Bตามค่าเริ่มต้น) บัฟเฟอร์ที่ใช้สำหรับโหมดนี้แยกต่างหากและเป็นเอกสิทธิ์ของ tmux ซึ่งเปิดโอกาสได้ค่อนข้างน้อยและทำให้มีความหลากหลายมากกว่าการเลือก X ในสถานการณ์ที่เหมาะสม

หากต้องการออกจากโหมดนี้ให้กดq; เพื่อนำทางใช้ของคุณvimหรือemacsผูกพัน (default = vim) ดังนั้นhjklสำหรับการเคลื่อนไหวv/V/C-vสำหรับการเลือกตัวละคร / สาย / บล็อก ฯลฯ เมื่อคุณมีการเลือกของคุณกดEnterเพื่อคัดลอกและออกจากโหมด

prefix-]ในการวางจากบัฟเฟอร์นี้การใช้งาน

เปลือก

การติดตั้งใด ๆX11ดูเหมือนว่าจะมาพร้อมกับสองโปรแกรมโดยค่าเริ่มต้น: xclipและxsel(เหมือนว่ามันยังมาพร้อมกับทั้งสองstartxและxinit) ส่วนใหญ่คำตอบอื่น ๆ พูดถึงxclipและผมชอบสำหรับความกะทัดรัดของตนเพื่อที่ฉันจะปกxselxsel

จากxsel (1x) :

ตัวเลือกการป้อนข้อมูล

-, - ผนวก

ผนวกอินพุตมาตรฐานเข้ากับส่วนที่เลือก หมายถึง-i

-f, - ติดตาม

ผนวกเข้ากับส่วนที่เลือกเมื่ออินพุตมาตรฐานเติบโตขึ้น นัย- ฉัน -i

-i, - อินพุต

อ่านอินพุตมาตรฐานลงในส่วนที่เลือก

ตัวเลือกการส่งออก

-o, - เอาต์พุต

เขียนการเลือกไปยังเอาต์พุตมาตรฐาน

ตัวเลือกการดำเนินการ

-c, - ชัดเจน

ล้างการเลือก แทนที่ตัวเลือกการป้อนข้อมูลทั้งหมด

-d, - ลบ

ขอให้ลบการเลือกปัจจุบัน สิ่งนี้ไม่เพียง แต่ล้างสิ่งที่เลือก แต่ยังขอให้โปรแกรมที่มีการเลือกอยู่ว่าเนื้อหาที่เลือกถูกลบ แทนที่ตัวเลือกการป้อนข้อมูลทั้งหมด

ตัวเลือกการเลือก

-p, - นายกรัฐมนตรี

ดำเนินการกับการเลือกหลัก (ค่าเริ่มต้น)

-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

การสั่งพิซซ่านั้นดูเหมือนจะเป็นการใช้ประโยชน์จากบรรทัดคำสั่ง

...กำลังเดินทางไป.

เป็นกลุ่ม

หากคอมไพล์ด้วย+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

หากสำเนาของเสียงเรียกเข้าของคุณไม่สนับสนุนการเข้าถึงการเลือก X โดยตรงนั่นไม่ใช่จุดสิ้นสุดของโลก คุณสามารถใช้xselเทคนิคตามที่อธิบายไว้ในส่วนสุดท้าย

:r ! xsel -bo ; read  (r) from the stdout of (!) `xsel -bo`
:w ! xsel -b  ; write (w) to the stdin of    (!) `xsel -b`

ผูกคอมโบคีย์คู่และคุณควรจะดี


อย่าลืมใช้เสมอDISPLAY=เมื่อเรียกแอปพลิเคชัน X จากสภาพแวดล้อมที่ไม่ใช่ X แอพ X ต้องการDISPLAYตัวแปรสภาพแวดล้อมเพื่อพิจารณาว่าเซิร์ฟเวอร์ใด (หรือมีเพียงเซิร์ฟเวอร์เดียวที่จัดการหลายเซสชันได้) พวกเขากำลังคุยด้วย ลองDISPLAY=:1 firefox(หรือรหัสที่แสดงของคุณอาจเป็นของฉันก็ได้:1) จาก TTY
Braden สุดยอด

สำหรับฉันตัวเลือกในสภาพแวดล้อมของฉันคือ:%y+VIM
HankCa

2

จากหัวข้อนี้มีตัวเลือกที่ไม่จำเป็นต้องติดตั้งซอฟต์แวร์ใด ๆgclip/ xclip/ xselบุคคลที่สาม

สคริปต์ Perl (เนื่องจากมักติดตั้ง Perl ไว้เสมอ)

use Win32::Clipboard;
print Win32::Clipboard::GetText();

ฉันจะใช้สิ่งนี้ได้อย่างไร บันทึกสคริปต์ลงใน PATH และไพพ์ลงไปไหม? ฉันกำลังพยายามเขียน wrapper cli ของ dropbox เพื่อคัดลอกลิงก์การแชร์ดังนั้นฉันแค่ต้องการมันเพื่อจัดการกับข้อความ
jena

@jena ตัวอย่าง: metacpan.org/pod/Win32::Clipboardหรือperlmonks.org/?node_id=143637หรือbribes.org/perl/docfr/win32clipboard.html
VonC


1

ใน macOS ใช้ pbpasteใช้

ตัวอย่างเช่น:

อัปเดตคลิปบอร์ด

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

1

หากคุณเป็นเหมือนฉันและทำงานบนเซิร์ฟเวอร์ Linux ที่ไม่มีสิทธิ์รูทและไม่มีxclipหรือGPMใด ๆคุณสามารถแก้ไขปัญหานี้ได้โดยใช้ไฟล์ชั่วคราว ตัวอย่างเช่น:

$ echo "Hello, World!" > ~/clip
$ echo `cat ~/clip`
Hello, World!

ฉันไม่เห็นว่าการขาดสิทธิ์ของรูทเป็นอย่างไร
Braden Best

3
@BradenBest การไม่มีสิทธิ์รูทหมายความว่าฉันไม่สามารถติดตั้งได้
Horta

แต่คุณจะติดตั้งอะไร X? บนเซิร์ฟเวอร์หรือไม่? ถ้าคุณไม่ได้โฮสต์บริการส่งต่อ X แปลก ๆ ฉันไม่สามารถเห็นได้ว่าทำไมคุณถึงอยากทำเช่นนั้น
Braden ที่ดีที่สุด

@BradenBest ไม่แน่ใจ โปรแกรมหรือบริการใดก็ตามที่อนุญาตให้ฉันทำสำเนาวาง
horta

1
ถ้าคุณใช้อันใดอันหนึ่งX selections(ซึ่งจำเป็นต้องบอกเป็นนัยโดย "คลิปบอร์ด" และกล่าวถึง xclip / xsel) คุณต้องมีเซสชัน X ที่ใช้งานอยู่ (และเป็นเซิร์ฟเวอร์ X) เพื่อให้คุณสามารถเข้าถึงตัวเลือกใน ที่แรก. หากต้องการดูว่าฉันหมายถึงอะไรลองใช้งานDISPLAY="" xselเครื่องท้องถิ่นของคุณ มันจะออกจากข้อผิดพลาดไม่พบเซสชัน""และจะไม่มีการโต้ตอบกับการเลือก X ใด ๆ นั่นเป็นสาเหตุที่ฉันกล่าวในตอนแรกว่าฉันไม่เห็นว่าสิทธิ์การใช้งานรูทมีผลอย่างไร: รูทหรือรูทคุณไม่น่าจะพบการเลือก X ที่มีประโยชน์ในสภาพแวดล้อมเซิร์ฟเวอร์
Braden ที่ดีที่สุด




0

แม้ว่า> 1 ปีต่อมาฉันแบ่งปันโซลูชันที่แตกต่างกันเล็กน้อย หวังว่านี่จะเป็นประโยชน์สำหรับใครบางคน

เมื่อวานนี้ฉันพบว่าตัวเองมีคำถาม: "จะแชร์คลิปบอร์ดระหว่างเซสชันผู้ใช้ต่างกันได้อย่างไร" . เมื่อสลับระหว่างเซสชันด้วยctrlaltF7-ctrlaltF8จริงแล้วคุณไม่สามารถวางสิ่งที่คุณคัดลอก

ฉันคิดวิธีแก้ปัญหาที่รวดเร็วและสกปรกดังต่อไปนี้โดยอ้างอิงจากไปป์ที่มีชื่อ มันค่อนข้างเปลือยและดิบ แต่ฉันพบว่ามันใช้งานได้:

user1@host:~$ mkfifo /tmp/sharedClip

จากนั้นในสถานีส่ง

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

สุดท้ายในเทอร์มินัลที่รับ:

user2@host:~$ cat /tmp/sharedClip

ตอนนี้คุณพิมพ์หรือวางอะไรก็ได้ในเทอร์มินัลแรกและ (หลังจากกดปุ่ม return ) มันจะปรากฏขึ้นทันทีในเทอร์มินัลที่รับจากที่ซึ่งคุณสามารถคัดลอก / วางอีกครั้งทุกที่ที่คุณต้องการ

แน่นอนว่านี่ไม่เพียง แต่นำเนื้อหาจากคลิปบอร์ดของผู้ใช้ 1 มาใช้เพื่อให้พร้อมใช้งานในคลิปบอร์ดของ user2 แต่ต้องการการคลิกวางและคัดลอกเพิ่มเติม


ดูเหมือนจะไม่น่าแปลกใจเกินไป เซิร์ฟเวอร์ X ที่ต่างกันสองชุด = ชุดตัวเลือกที่แตกต่างกันสองชุด อย่างไรก็ตามคุณสามารถตั้งค่าสคริปต์ที่จะนำเข้า / xsel/xclipส่งออกผ่านทาง ตัวอย่างเช่นปลายด้านหนึ่งฟังเพื่อดูว่าการเลือกใด ๆ เปลี่ยนไปหรือไม่จากนั้นทำการไพพ์โดยอัตโนมัติ (ผ่านทางชื่อ FIFO) ไปยังสคริปต์อื่นซึ่งกำลังฟังไปป์อย่างน้อยหนึ่งอัน การคัดลอกข้อความจะทำให้ข้อความเดียวกันปรากฏโดยอัตโนมัติในการเลือกเซสชัน X อื่น ๆ $DISPLAYและไม่ลืมที่เกี่ยวกับ
Braden สุดยอด

0

ruby oneliner เป็นแรงบันดาลใจให้ฉันลองงูหลาม

สมมติว่าเราต้องการคำสั่งที่เยื้องสิ่งที่อยู่ในคลิปบอร์ดด้วยช่องว่าง 4 ช่อง เหมาะสำหรับการแชร์ตัวอย่างบน stackoverflow

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

นั่นไม่ใช่การพิมพ์ผิด Python ต้องการการขึ้นบรรทัดใหม่เพื่อทำลูป เราต้องการแก้ไขบรรทัดในหนึ่งรอบเพื่อหลีกเลี่ยงการสร้างอาร์เรย์พิเศษในหน่วยความจำ

หากคุณไม่สนใจที่จะสร้างอาร์เรย์พิเศษลอง:

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

แต่ awk สุจริตดีกว่าสำหรับงูหลาม ฉันกำหนดนามแฝงนี้ใน~/.bashrcไฟล์ของฉัน

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

ตอนนี้เมื่อฉันเรียกใช้indentสิ่งที่อยู่ในคลิปบอร์ดของฉันจะเยื้อง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.