เทอร์มินัล - คัดลอกจาก CLI โดยไม่ต้องใช้เมาส์


20

ในขณะที่ยิงคำสั่งใน CLI ฉันต้องการคัดลอกคำสั่งที่ฉันเพิ่งไล่ออกหรือสิ่งที่ฉันเขียนใน terminal และวางไว้ที่อื่นโดยไม่ต้องใช้เมาส์

เหมือนในภาพต่อไปนี้ฉันต้องการคัดลอกคำสั่ง update (ทั้งหมดหรือบางส่วน) โดยไม่ต้องใช้เมาส์และวางไว้ที่ใดที่หนึ่ง

คัดลอกจาก CLI โดยไม่ต้องใช้เมาส์


1
คุณใช้ gnome โดยไม่ใช้เม้าส์เหรอ?
ott--

คำตอบ:


11

คุณสามารถใช้screen(1) ภายในจำลอง terminal ที่คุณเลือก ( xterm, gnome-terminal, ... )

screenทำงานที่คุณต้องการในตัวใน คุณต้องทำความคุ้นเคยกับวิธีการทำงาน:

  • โดยค่าเริ่มต้นการผูกคำสั่ง "คำสั่ง" คือCtrl+ Aคุณเขียนคำสั่งโดยใช้คำสั่ง "คำสั่ง" บวกกับการกระทำที่เฉพาะเจาะจง
  • คำสั่ง "copy" คือ: AltGr+[
  • คำสั่ง "paste" คือAltGr+]

คุณสามารถ "คัดลอก" คำสั่งและ "วาง" ในเทอร์มินัลอื่น

screen สนุกและเมื่อคุณเริ่มใช้งานคุณจะสงสัยว่าเป็นไปได้อย่างไรที่คุณไม่ได้ใช้เลย


ไม่มีscreenคำสั่งดังนั้นฉันติดตั้งใน gnome-terminal และเริ่มscreenใน terminal แต่ไม่สามารถเริ่มต้นได้หลังจากนั้น นอกจากนี้ฉันไม่เข้าใจความหมายของหน้าจอในตัว
prayagupd

1
man screenอ่าน นอกจากนี้ผมเขียนในตัวในหน้าจอ 'หมายถึงการคัดลอก / วางฟังก์ชั่นที่มีอยู่ในการออกแบบscreen
dawud

คุณต้องใช้spaceปุ่มเพื่อเลือกพื้นที่ที่ต้องการ คุณต้องใช้Yเพื่อคัดลอกทั้งบรรทัดหรือพื้นที่ที่ต้องการ หน้าจอเป็นviมิตรกับการเคลื่อนไหว
FelikZ

AltGrกุญแจคืออะไร? ฉันมีAlt
alhelal

1
screenเครื่องมือที่ไม่ได้ฟังก์ชั่นได้อธิบายที่นี่ และดูเหมือนจะไม่ได้ให้คำตอบสำหรับคำถาม
Luís de Sousa

7

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

หากคุณพร้อมที่จะเปลี่ยนเทอร์มินัลเป็นrxvt-unicodeคุณสามารถใช้เครื่องมือเช่นurxvt-perls : ชุดของสคริปต์ที่จัดเตรียมฟังก์ชันการทำงานของแป้นพิมพ์ต่อไปนี้ในเทอร์มินัลอีมูเลเตอร์:

  • เลือกคัดลอกและวางข้อความ
  • ไปข้างหน้าและค้นหาแบบย้อนกลับ
  • เน้นและเปิด URL ในเบราว์เซอร์ที่คุณต้องการ

คุณเพียงแค่ติดตั้งแพคเกจแล้วเพิ่มสองสามบรรทัดของคุณ~/.Xresourcesและจากนั้นคุณสามารถถอดหนูออกได้ดี


4

คุณสามารถทำได้โดยใช้โปรแกรมเช่นxclip:

NAME
   xclip - command line interface to X selections (clip‐
   board)

เมื่อคุณติดตั้งแล้วคุณสามารถใช้มันเพื่อเชื่อมต่อกับคลิปบอร์ด X ของคุณ น่าเสียดายที่สิ่งนี้จะไม่ทำงานในmysqlสภาพแวดล้อมของคุณ(มันมีบัฟเฟอร์ของตัวเองสำหรับบรรทัดที่คัดลอก) แต่ถ้าคุณต้องการเรียกใช้คำสั่ง 'ปกติ' ตัวอย่างเช่น :

$ This is a long command line

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

$ echo -e "This is a long command line" |xclip 

ตอนนี้คุณมี "นี่คือบรรทัดคำสั่งยาว" ในคลิปบอร์ดคลิกกลางของคุณ

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

$ xclip -o

คุณสามารถวางเข้ากับขั้วเดียวกันโดยเพียงแค่การฆ่า (ตัด) คำสั่งด้วยแล้ววางกับCtrlKCtrlY

คุณยังสามารถบันทึกคำสั่งข้ามเทอร์มินัลโดยใช้ประวัติของทุบตี เพิ่มบรรทัดนี้ใน~/.bashrc:

PROMPT_COMMAND='history -a; history -r'

PROMPT_COMMANDเป็นตัวแปรทุบตีพิเศษ หากตั้งค่าไว้จะดำเนินการตามคำสั่งก่อนที่จะออกพรอมต์ใหม่ history -aจะเขียนประวัติของเซสชันปัจจุบันไปยังไฟล์ประวัติและhistory -rจะโหลดไฟล์นั้นใหม่ ซึ่งหมายความว่าทุกคำสั่งที่คุณเรียกใช้จะถูกเขียนลงในไฟล์ประวัติทันที

ตอนนี้เมื่อคุณเรียกใช้บรรทัดคำสั่งยาวคุณสามารถสลับไปยังเทอร์มินัลอื่นและกดย้อนกลับ (เพื่อเรียกใช้$PROMT_COMMANDหรือเปิดหน้าต่างเทอร์มินัลใหม่) และจะสามารถเข้าถึงประวัติของเทอร์มินัลนี้ได้ หากคุณกดUpคุณสามารถเรียกใช้บนสถานีใหม่


ไม่เป็นไร แต่ฉันยังต้องใช้เมาส์?
prayagupd

@PrayagUpd อ่าใช่ว่าจะคัดลอกไปยังบัฟเฟอร์คลิกกลาง ดูคำตอบที่อัปเดตสำหรับวิธีอื่น
terdon

ฉันคิดว่า$ xclip -oไม่ใช่สิ่งที่ฉันต้องการเพราะมันพิมพ์สิ่งที่ฉันxclipeต้องการ แต่ +1 สำหรับการCtrl+Aตามด้วยCtrl+KและCtrl+Yสำหรับการตัดและการวางอย่างน้อยในเทอร์มินัลเดียวกัน
prayagupd

@PrayagUpd สิ่งที่มีบัฟเฟอร์คลิปบอร์ดต่างๆที่เล่นและการแก้ปัญหาจะขึ้นอยู่กับสิ่งที่คุณต้องการจะทำ คุณสามารถอัปเดตคำถามของคุณด้วยตัวอย่างเฉพาะของสิ่งที่คุณต้องการได้หรือไม่ ฉันหมายถึงการคัดลอกจากที่ (mysql จะยุ่งยาก) และไปยังที่
terdon

1
@PrayagUpd ดูคำตอบที่ปรับปรุงแล้วสำหรับเคล็ดลับอื่น
terdon

1

@evilsoup ได้แนะนำวิธีแก้ปัญหาที่ดี แต่ก็มักจะหยุดพัก

ทางออกด่วน

นี่คือวิธีการแก้ปัญหาที่ไม่เคยหยุดพัก

history | tail -2 | head -1 | xclip -selection clipboard

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

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

ฟังก์ชั่นที่กำหนดเอง

การพัฒนาวิธีแก้ปัญหาอย่างรวดเร็วนี่คือฟังก์ชั่นเล็ก ๆ ที่ฉันเขียนซึ่งค่อนข้างฉลาดและจะคัดลอกคำสั่งที่ใช้ล่าสุด คุณยังสามารถระบุอาร์กิวเมนต์ตัวเลขเพื่อคัดลอกคำสั่ง last-nth เช่นสำหรับการคัดลอกคำสั่งสุดท้ายที่สองให้2เป็นอาร์กิวเมนต์

myclipcopy () {

  if [ -z $1 ]
    then  # if no argument was provided then just copy the last used command
    history | tail -2 | head -1 | sed -re 's/[[:space:]]+[[:digit:]]+[[:space:]]+//g' | xclip -selection clipboard
    echo 'Anyways, the following command has been copied:'
    history | tail -2 | head -1| sed -re 's/[[:space:]]+[[:digit:]]+[[:space:]]+//g'

  else
    myindex=$(( $1+1 ))
    history | tail -$myindex | head -1 | sed -re 's/[[:space:]]+[[:digit:]]+[[:space:]]+//g' | xclip -selection clipboard
    echo "The following command has been copied:"
    history | tail -$myindex | head -1 | sed -re 's/[[:space:]]+[[:digit:]]+[[:space:]]+//g'
  fi

  #Delete this command itself from the history
  myhisnum=$(history | tail -1 | grep -oP '\s\d+\s' | grep -oP '\d+'); history -d $myhisnum
}

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

ในที่สุดเรียกใช้เป็น:

myclipcopy 3
# This copies the third-last command

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


นี้ไม่ได้เป็นที่แข็งแกร่ง
mikeserv

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

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

@mikeserv: ขอบคุณสำหรับความคิดเห็น หวังว่านี่จะช่วยให้ฉันได้คำตอบที่ดีขึ้น ฉันจะยอมรับว่า regex และ pipelines ของฉันน่าเกลียด แต่พวกเขาได้รับการทดสอบอย่างดีและฉันได้ใช้มัน screenและเป็นสมมติฐานที่คุณไม่ได้สังเกตเห็นว่าคำตอบของการจัดอันดับสูงสุดได้รับการสันนิษฐานว่าผู้ใช้กำลังใช้ คำตอบที่สองอันดับสูงสุดสันนิษฐานว่ายังและbash linuxนอกจากนี้สมมติว่าbashไม่ใช่เรื่องใหญ่เพราะสคริปต์จะยังคงหาได้ใน zsh หรือเชลล์อื่น ๆ ส่วนใหญ่
shivams

ฉันไม่ได้บอกว่ามันน่าเกลียด - ฉันบอกว่ามันซับซ้อนเกินไป และไม่มันจะไม่ปรับการทำงานในเปลือกหอยอื่น ๆ ส่วนใหญ่ และยิ่งไปกว่านั้นCLI ที่จริงแล้วภาพในคำถามคือ MySQL จุดดีเกี่ยวกับคำตอบอื่น ๆ แม้ว่า
mikeserv

0

คำสั่งนี้ใช้การขยายประวัติของ bash (ดังนั้น!!ขยายเป็นบรรทัดสุดท้ายที่คุณพิมพ์ลงในเทอร์มินัล) คุณอาจจะต้องติดตั้งอย่างใดอย่างหนึ่งหรือxclipxsel

echo "!!" | xclip -selection clipboard

echo "!!" | xsel -i --clipboard

สิ่งนี้จะทำให้คำสั่งสุดท้ายของคุณในคลิปบอร์ดCtrl+ vดังนั้นคุณจะสามารถวางลงในโปรแกรม GUI ใด ๆ (หรือมีCtrl+ Shift+ vในเทอร์มินัลอีมูเลเตอร์ส่วนใหญ่หรือด้วย"+pเสียงเรียกเข้า)

สิ่งนี้จะแตกสำหรับบางบรรทัดที่มีเครื่องหมายคำพูดคู่ตัวอย่างเช่น:

$ echo "foo;bar"
foo;bar
$ echo "!!"
echo "echo "foo;bar""
echo foo
The program 'bar' is currently not installed. You can install it by typing:
sudo apt-get install bar

มันจะทำงานสำหรับคำสั่งที่คุณให้เป็นตัวอย่างแม้ว่า; คุณควรมีปัญหาหากเครื่องหมายคำพูดสองครั้งกำลังหลบหนีไป; & && | ||เรื่อย ๆ


ขอบคุณสำหรับคำตอบนี้เป็นคำตอบที่เป็นประโยชน์ที่สุดที่ฉันสามารถนำไปใช้ได้ทันที และผมเชื่อว่าปัญหาที่มี "สามารถหลีกเลี่ยงได้ง่ายๆโดยไม่อ้าง !! ที่ทุกคนเพียงแค่ทำecho !!และมันจะทำงานไม่มีที่ติ (ยกเว้นในกรณีที่ไม่น่าจะเป็นคำสั่งก่อนหน้านี้เริ่มด้วย-nหรือ-eหรือตัวเลือกอื่น ๆ ไม่กี่คนที่echoตัวเองใช้เวลา)
sundar - Reinstate Monica

0

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

  1. คุณต้องสร้างไฟล์ชั่วคราวที่ไดเรกทอรีที่สะดวก

  2. ถ่ายโอนทิศทางหรือข้อความที่ต้องการไปยังไฟล์นั้น สำหรับการถ่ายโอนทิศทางคุณสามารถใช้

    echo $(pwd) 1> tempo
    
  3. เพื่อให้ได้ทิศทางจากคำสั่ง file use

    cd $(tail -n 1 tempo)
    

สำหรับการคัดลอกและวางคำสั่งระบบนี้จะทำงานได้ทั้งสองอย่างแน่นอน หวังว่าจะเป็นประโยชน์


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