ในขณะที่ยิงคำสั่งใน CLI ฉันต้องการคัดลอกคำสั่งที่ฉันเพิ่งไล่ออกหรือสิ่งที่ฉันเขียนใน terminal และวางไว้ที่อื่นโดยไม่ต้องใช้เมาส์
เหมือนในภาพต่อไปนี้ฉันต้องการคัดลอกคำสั่ง update (ทั้งหมดหรือบางส่วน) โดยไม่ต้องใช้เมาส์และวางไว้ที่ใดที่หนึ่ง
ในขณะที่ยิงคำสั่งใน CLI ฉันต้องการคัดลอกคำสั่งที่ฉันเพิ่งไล่ออกหรือสิ่งที่ฉันเขียนใน terminal และวางไว้ที่อื่นโดยไม่ต้องใช้เมาส์
เหมือนในภาพต่อไปนี้ฉันต้องการคัดลอกคำสั่ง update (ทั้งหมดหรือบางส่วน) โดยไม่ต้องใช้เมาส์และวางไว้ที่ใดที่หนึ่ง
คำตอบ:
คุณสามารถใช้screen(1)
ภายในจำลอง terminal ที่คุณเลือก ( xterm
, gnome-terminal
, ... )
screen
ทำงานที่คุณต้องการในตัวใน คุณต้องทำความคุ้นเคยกับวิธีการทำงาน:
คุณสามารถ "คัดลอก" คำสั่งและ "วาง" ในเทอร์มินัลอื่น
screen
สนุกและเมื่อคุณเริ่มใช้งานคุณจะสงสัยว่าเป็นไปได้อย่างไรที่คุณไม่ได้ใช้เลย
screen
คำสั่งดังนั้นฉันติดตั้งใน gnome-terminal และเริ่มscreen
ใน terminal แต่ไม่สามารถเริ่มต้นได้หลังจากนั้น นอกจากนี้ฉันไม่เข้าใจความหมายของหน้าจอในตัว
man screen
อ่าน นอกจากนี้ผมเขียนในตัวในหน้าจอ 'หมายถึงการคัดลอก / วางฟังก์ชั่นที่มีอยู่ในการออกแบบscreen
space
ปุ่มเพื่อเลือกพื้นที่ที่ต้องการ คุณต้องใช้Y
เพื่อคัดลอกทั้งบรรทัดหรือพื้นที่ที่ต้องการ หน้าจอเป็นvi
มิตรกับการเคลื่อนไหว
AltGr
กุญแจคืออะไร? ฉันมีAlt
screen
เครื่องมือที่ไม่ได้ฟังก์ชั่นได้อธิบายที่นี่ และดูเหมือนจะไม่ได้ให้คำตอบสำหรับคำถาม
นอกเหนือจากคำตอบที่ให้ไปแล้วคุณสามารถลองย้ายไปที่เทอร์มินัลอีมูเลเตอร์ที่มีความยืดหยุ่นมากกว่า
หากคุณพร้อมที่จะเปลี่ยนเทอร์มินัลเป็นrxvt-unicodeคุณสามารถใช้เครื่องมือเช่นurxvt-perls : ชุดของสคริปต์ที่จัดเตรียมฟังก์ชันการทำงานของแป้นพิมพ์ต่อไปนี้ในเทอร์มินัลอีมูเลเตอร์:
คุณเพียงแค่ติดตั้งแพคเกจแล้วเพิ่มสองสามบรรทัดของคุณ~/.Xresources
และจากนั้นคุณสามารถถอดหนูออกได้ดี
คุณสามารถทำได้โดยใช้โปรแกรมเช่น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คุณสามารถเรียกใช้บนสถานีใหม่
$ xclip -o
ไม่ใช่สิ่งที่ฉันต้องการเพราะมันพิมพ์สิ่งที่ฉันxclipe
ต้องการ แต่ +1 สำหรับการCtrl+A
ตามด้วยCtrl+K
และCtrl+Y
สำหรับการตัดและการวางอย่างน้อยในเทอร์มินัลเดียวกัน
@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
ยิ่งไปกว่านั้นคุณสมบัติที่ยอดเยี่ยมอย่างหนึ่งที่เพิ่มเข้าไปในฟังก์ชั่นนี้ก็คือมันจะลบตัวเองออกจากประวัติหลังจากที่มันถูกเรียกใช้ สิ่งนี้มีประโยชน์เพราะดัชนี "ย้อนกลับ" ของคำสั่งจะไม่เปลี่ยนแปลง
screen
และเป็นสมมติฐานที่คุณไม่ได้สังเกตเห็นว่าคำตอบของการจัดอันดับสูงสุดได้รับการสันนิษฐานว่าผู้ใช้กำลังใช้ คำตอบที่สองอันดับสูงสุดสันนิษฐานว่ายังและbash
linux
นอกจากนี้สมมติว่าbash
ไม่ใช่เรื่องใหญ่เพราะสคริปต์จะยังคงหาได้ใน zsh หรือเชลล์อื่น ๆ ส่วนใหญ่
คำสั่งนี้ใช้การขยายประวัติของ bash (ดังนั้น!!
ขยายเป็นบรรทัดสุดท้ายที่คุณพิมพ์ลงในเทอร์มินัล) คุณอาจจะต้องติดตั้งอย่างใดอย่างหนึ่งหรือxclip
xsel
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
ตัวเองใช้เวลา)
อาจไม่ใช่วิธีที่สะดวกที่สุด แต่ฉันใช้และดังนั้นจะมีประโยชน์สำหรับผู้อื่นมากกว่านั้นไม่จำเป็นต้องมีการติดตั้งซอฟต์แวร์เพิ่มเติม
คุณต้องสร้างไฟล์ชั่วคราวที่ไดเรกทอรีที่สะดวก
ถ่ายโอนทิศทางหรือข้อความที่ต้องการไปยังไฟล์นั้น สำหรับการถ่ายโอนทิศทางคุณสามารถใช้
echo $(pwd) 1> tempo
เพื่อให้ได้ทิศทางจากคำสั่ง file use
cd $(tail -n 1 tempo)
สำหรับการคัดลอกและวางคำสั่งระบบนี้จะทำงานได้ทั้งสองอย่างแน่นอน หวังว่าจะเป็นประโยชน์