วิธีคัดลอกบรรทัดคำสั่งทั้งหมดไปยังคลิปบอร์ดของฉันโดยไม่ใช้เมาส์?


20

ลองนึกภาพว่าฉันมีบรรทัดนี้ในเทอร์มินัลของฉัน:

youtube-dl --get-thumbnail --extract-audio --audio-format mp3 https://www.youtube.com/watch?v=

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

คำตอบ:


22

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

เตรียม:

ก่อนอื่นให้ติดตั้งแพ็คเกจxselที่อนุญาตให้คุณเข้าถึง X คลิปบอร์ดจากเทอร์มินัล:

sudo apt-get install xsel

รูปแบบคำสั่ง 1 (สั้น):

หลังจากนั้นคุณสามารถพิมพ์บรรทัดต่อไปนี้เพื่อคัดลอกคำสั่งก่อนหน้าไปยังคลิปบอร์ด:

xsel -ib <<<!!:q

หากคุณต้องการคัดลอกคำสั่งล่าสุดลำดับที่สองให้แทนที่!!ด้วย!-2สำหรับการใช้งานครั้งที่สามครั้งล่าสุด!-3เป็นต้น

หากต้องการอธิบายสิ่งที่คุณกำลังใช้งานอยู่ให้แบ่งคำสั่งสั้น ๆ ดังนี้

  • xselเป็นเครื่องมือบรรทัดคำสั่งในการเข้าถึง X คลิปบอร์ด
    สำหรับข้อมูลเพิ่มเติมโปรดอ่านมัน manpage ออนไลน์ไอคอน Manpageman xselหรือโดยการทำงาน

    • -iพารามิเตอร์บอกxselไปอ่านจาก stdin (ปกติใส่แป้นพิมพ์นี้หมายถึง แต่เรากำลังจะเปลี่ยนเส้นทางบางสิ่งบางอย่างที่นี่)
    • -bระบุพารามิเตอร์ที่จะใช้คลิปบอร์ดแทนเอ็กซ์ "หลัก" หรือเลือก "รองที่"
  • <<<เป็นไวยากรณ์ Bash พิเศษที่เรียกว่า "Here String"
    มันขยายพื้น (ไม่ประเมิน!) อาร์กิวเมนต์ (เพียงหนึ่ง!) หลังจากนั้นและเปลี่ยนเส้นทางมันเป็นสตริงไปยัง stdin (อินพุตมาตรฐาน) ของคำสั่งก่อน / หลังที่มันยืน

  • !!:qเรียกว่า "คำสั่งปัง" สำหรับการขยายประวัติในทุบตี มันจะแทนที่ตัวเองด้วยบรรทัดคำสั่งที่พิมพ์ไว้ก่อนหน้านี้
    สำหรับข้อมูลเพิ่มเติมอ่านมันเป็น manpage ท้องถิ่นโดยการเรียกใช้man history(manpage ออนไลน์ไม่เป็นประโยชน์)

    • ย่อมาจากบรรทัดคำสั่งก่อนหน้านี้และเป็นคำพ้องสำหรับ!! เห็นได้ชัดว่าหมายถึงบรรทัดคำสั่งสุดท้ายที่สอง อย่าลืมเครื่องหมายลบมิฉะนั้นจะส่งคืนคำสั่ง 2nd (3rd / ... ) ที่คุณเคยพิมพ์!-1
      !-2-
    • การ:qแก้ไขคำสั่ง bang และบอกให้ bash ล้อมรอบการทดแทนในอัญประกาศเดี่ยว ( ') เพื่อป้องกันการขยายตัวเพิ่มเติมโดยเชลล์

รูปแบบคำสั่ง 2 (อีกต่อไปเล็กน้อย):

echo !!:q | xsel -ib
  • echo มีงานง่าย ๆ ในการพิมพ์อาร์กิวเมนต์ทั้งหมดไปยัง stdout ของเทอร์มินัล

  • !!:qเรียกว่า "คำสั่งปัง" สำหรับการขยายประวัติในทุบตี มันจะแทนที่ตัวเองด้วยบรรทัดคำสั่งที่พิมพ์ไว้ก่อนหน้านี้

    • ย่อมาจากบรรทัดคำสั่งก่อนหน้านี้และเป็นคำพ้องสำหรับ!! !-1เห็นได้ชัดว่า!-2หมายถึงบรรทัดคำสั่งสุดท้ายที่สอง อย่าลืมเครื่องหมายลบ-มิฉะนั้นจะส่งคืนคำสั่ง 2nd (3rd / ... ) ที่คุณเคยพิมพ์
    • การ:qแก้ไขคำสั่ง bang และบอกให้ bash ล้อมรอบการทดแทนในอัญประกาศเดี่ยว ( ') เพื่อป้องกันการขยายตัวเพิ่มเติมโดยเชลล์
  • |เป็นท่อ โดยจะเปลี่ยนทิศทางเอาต์พุตเทอร์มินัล ("stdout") ของคำสั่งก่อนหน้านี้ไปยังเทอร์มินัลอินพุต ("stdin") ของคำสั่งหลังจากนั้น

  • xselเป็นเครื่องมือบรรทัดคำสั่งในการเข้าถึง X คลิปบอร์ด
    สำหรับข้อมูลเพิ่มเติมโปรดอ่านมัน manpage ออนไลน์ไอคอน Manpageman xselหรือโดยการทำงาน

    • -iพารามิเตอร์บอกxselไปอ่านจาก stdin (ปกติใส่แป้นพิมพ์นี้หมายถึง แต่เรากำลังจะเปลี่ยนเส้นทางบางสิ่งบางอย่างที่นี่)
    • -bระบุพารามิเตอร์ที่จะใช้คลิปบอร์ดแทนเอ็กซ์ "หลัก" หรือเลือก "รองที่"

รูปแบบคำสั่ง 3 (นามแฝง):

นามแฝงทุบตีเป็นสิ่งที่ยอดเยี่ยมหากคุณไม่ต้องการที่จะจำคำสั่งยาวหรือซับซ้อนที่คุณมักใช้ คุณสามารถกำหนดคำสั่งนี้ให้กับชื่อนามแฝงง่ายๆซึ่งคุณสามารถเรียกใช้แทนคำสั่งแบบยาวเพื่อให้ได้ผลลัพธ์เดียวกัน

น่าเสียดายเนื่องจากคำสั่ง bang เป็นคุณลักษณะ Bash พิเศษและขยายก่อนที่นามแฝงจะได้รับการแก้ไขคุณไม่สามารถใช้นามแฝงของรูปแบบใดรูปแบบหนึ่งด้านบนได้เนื่องจาก!!ส่วนจะไม่ทำงาน มีวิธีแก้ปัญหาว่า

ในการตั้งค่านามแฝงให้รันบรรทัดต่อไปนี้ในเทอร์มินัลของคุณ โปรดทราบว่าคุณสามารถเลือกชื่อตัวแปร Bash ที่ถูกต้องแทนcopylastcommand:

alias copylastcommand='history -p \!\! | xsel -ib'

อย่างไรก็ตามนี่จะคงอยู่สำหรับเซสชัน Bash ปัจจุบันของคุณเท่านั้นซึ่งหมายความว่านามแฝงจะหายไปหลังจากคุณปิดหน้าต่างเทอร์มินัล คุณสามารถทำให้มันคงอยู่ในทุกช่วงเวลาของ Bash ของคุณโดยเพิ่มบรรทัดนี้ด้านบนไปยังจุดสิ้นสุดของ~/.bashrcไฟล์ของคุณหรือ~/.bash_aliasesไฟล์ของคุณถ้าคุณมี

อีกครั้งการย่อบรรทัด

  • alias name='command'เป็นไวยากรณ์ในการตั้งค่านามแฝงใน Bash commandจะถูกเรียกใช้เมื่อใดก็ตามที่คุณดำเนินการnameต่อจากนี้ไป

  • history -p \!\!เอาต์พุตบรรทัดคำสั่งที่เรียกใช้งานก่อนหน้านี้เป็น stdout (เอาต์พุตมาตรฐาน) หากไม่มี-pสวิตช์มันจะไม่เพียงพิมพ์ แต่ยังเรียกใช้คำสั่งอีกครั้ง
    โปรดทราบว่าเราต้องหลีกเลี่ยงการ!ใช้เครื่องหมาย( ) ด้วยเครื่องหมายแบ็กสแลช ( \) เพราะมิฉะนั้นทุบตีจะขยายออกเมื่อเราพยายามตั้งชื่อแทนซึ่งไม่สมเหตุสมผลเท่าที่ควร
    อีกครั้งคุณยังสามารถระบุ [N] คำสั่งล่าสุด -th โดยการเปลี่ยนปังสองด้วยเช่น-n\!-2

  • |เป็นท่อ มันเปลี่ยนเส้นทางออกมาตรฐาน ("stdout") ของคำสั่งก่อนที่มันจะมาตรฐานขั้ว ("stdin") ของคำสั่งหลังจากนั้น

  • xselเป็นเครื่องมือบรรทัดคำสั่งในการเข้าถึง X คลิปบอร์ด
    สำหรับข้อมูลเพิ่มเติมโปรดอ่านมัน manpage ออนไลน์ไอคอน Manpageman xselหรือโดยการทำงาน

    • -iพารามิเตอร์บอกxselไปอ่านจาก stdin (ปกติใส่แป้นพิมพ์นี้หมายถึง แต่เรากำลังจะเปลี่ยนเส้นทางบางสิ่งบางอย่างที่นี่)
    • -bระบุพารามิเตอร์ที่จะใช้คลิปบอร์ดแทนเอ็กซ์ "หลัก" หรือเลือก "รองที่"

1
คำตอบที่ดี แต่คุณสามารถหลีกเลี่ยงท่อได้หรือไม่ ได้โปรด <<<"!!" xsel -ib
kos

@ kos ใช่ขอบคุณ ทำให้ง่ายขึ้นเล็กน้อย คุณช่วยฉันในการจำ<<<โครงสร้างที่เรียกว่าอีกครั้งได้อย่างไร และฉันคิดว่า<<<!!:q xsel -ibจะดีกว่า (ให้คำสั่งประวัติศาสตร์ปังทำข้อความ) หรือคุณไม่เห็นด้วย?
ผู้บัญชาการไบต์

แต่!!:qใช้เครื่องหมายอัญประกาศเดี่ยว ( ') ...
ผู้บัญชาการ Byte

<<<"!!" xsel -ibคุณสิทธิการขยายตัวจะได้รับการดำเนินการโดยใช้ ใช่<<<!!:q xsel -ibดีกว่าไปเลย
kos

นีซxselมีไวยากรณ์ที่น่าสนใจ
Sergiy Kolodyazhnyy

5

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

some_command | xclip -selection c

ดังนั้นในกรณีที่คุณ:

youtube-dl .... | xclip -selection c

c ย่อมาจากคลิปบอร์ด

คุณอาจต้องติดตั้งxclipก่อน:

sudo apt-get install xclip

แก้ไข:

หากคุณต้องการให้คำสั่งที่คุณพิมพ์ (ไม่ใช่เอาต์พุต) ถูกคัดลอกไปยังคลิปบอร์ดคุณสามารถใช้สตริงที่นี่:

 xclip -selection c <<<"$(echo foobar)"

หรือท่อ:

echo foobar | xclip -selection c

1
ฉันยังคงได้รับผลลัพธ์คำสั่ง แต่ฉันต้องการแค่บรรทัดเอง
Valter Silva

echo "command" | xclip -selection clipboard... หรือทำให้มันเป็นสคริปต์ภายใต้~/.binecho "$@" | xclip -selection clipboard : สมมติว่าคุณบันทึกเป็น "cpy" จากนั้นคุณสามารถทำได้cpy youtube-dl stuffและจะถูกคัดลอกไปยังคลิปบอร์ดโดยไม่ต้องดำเนินการ
อเล็กซ์

และถ้าคุณต้องการที่จะถูกประหารชีวิต ... echo "$@" | xclip -selection c && $@หรืออะไรที่ฉลาดกว่านี้กับ eval ...
อเล็กซ์

@ValterHenrique โปรดตรวจสอบการแก้ไขของฉัน ..
heemayl

3

ฉันเพิ่งทำสคริปต์เล็กน้อยสำหรับzshที่ใช้xclipในการทำสิ่งนี้:

#!/bin/zsh
export HISTFILE=~/.zsh_history
fc -R
fc -l | tail -n 2 | sed -n '1p' | sed 's/[0-9]*  //' | xclip -selection c

สคริปต์นี้คัดลอกคำสั่งสุดท้ายที่ป้อนในเชลล์ / เทอร์มินัลไปยังคลิปบอร์ดของระบบ มันจะไม่ทำงานบนเซิร์ฟเวอร์ระยะไกลทั่วไป

ฉันคิดว่ามันใช้เวลาเพียงไม่กี่นาทีในการเขียนสคริปต์นี้ แต่ใช้เวลานานกว่าจะทำให้มันทำงานได้อย่างน่าประหลาดใจขณะที่ฉันสะดุดกับวิธีzshจัดการกับประวัติศาสตร์

สิ่งtail -n 2แรกและsedสิ่งนี้เกี่ยวข้องกับความจริงที่ว่าคำสั่งสำหรับสคริปต์นี้กำลังถูกบันทึกในประวัติดังนั้นมันจึงได้รับประวัติสองบรรทัดและลบบรรทัดสุดท้าย

สคริปต์นี้ทำงานและมันก็เรียงลำดับของปริศนาที่สนุก zshแต่ฉันอยากรู้จริงๆถ้ามีวิธีที่เรียบง่ายสง่างามมากขึ้นหรือการทำเช่นนี้ด้วย


คุณอาจทำให้คำสั่งtailและsedคำสั่งนั้นเป็นคำสั่งหนึ่งหรือสองคำสั่งได้ง่ายขึ้น คำสั่งเหล่านั้นใช้!!ซึ่งมีคำอธิบายไว้ที่นี่ - ควรมีให้ใน ZSH ....
วิลฟ์

โอ้!!ดูเหมือนว่ามันจะเป็นประโยชน์ที่นี่ขอบคุณ!
อเล็กซ์

0

ฉันใช้เป็นผู้จัดการคลิปบอร์ดดังนั้น

alias pbpaste='xclip -i -selection clipboard -o'
alias pbcopy='xclip -selection clipboard'
vimscratch='vim -c 'setlocal buftype=nofile bufhidden=wipe nobuflisted noswapfile' 

คำสั่งสุดท้ายไปที่คลิปบอร์ด

alias last2cb='fc -ln -1 | pbcopy'

คลิปบอร์ดที่จะเป็นรอยขีดข่วนเป็นกลุ่ม

alias vcb='pbpaste | vimscratch -'

เฉพาะ ZSH

# Copy the most recent command to the clipboard
function _pbcopy_last_command(){
    fc -ln -1 | pbcopy
}
zle -N pbcopy-last-command _pbcopy_last_command
bindkey '^x^y' pbcopy-last-command
# Ctrl-x Ctrl-y  to copy last command to the clipboard


# Edit content of clipboard on vim (scratch buffer)
function _edit_clipboard(){
    pbpaste | vim -c 'setlocal buftype=nofile bufhidden=wipe nobuflisted noswapfile' -
}
zle -N edit-clipboard _edit_clipboard
bindkey '^x^v' edit-clipboard
# Ctrl-x Ctrl-v to edit clipboard on vim


# define function that retrieves and runs last command
function run-again {
    # get previous history item
    zle up-history
    # confirm command
    zle accept-line
}
# define run-again widget from function of the same name
zle -N run-again
bindkey '\er' run-again
# alt-r to run last command again

ฉันคิดว่าความคิดเหล่านี้สามารถช่วยคุณสร้างทางออกของคุณเอง

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