ฉันจะย้ายไปรอบ ๆ bash commandline ได้อย่างมีประสิทธิภาพได้อย่างไร


19

ดังนั้นฉันใช้upในเชลล์ของฉัน (Bash บน OSX หรือ Ubuntu ส่วนใหญ่) แต่บางครั้งฉันรู้ว่าฉันต้องการสิ่งหลังจากเคอร์เซอร์ตำแหน่งปัจจุบัน มีวิธีใดบ้างที่จะให้บรรทัดที่ฉันทำเสร็จกับบรรทัดด้านบน? กดปุ่มupแล้วleftเป็นที่น่ารำคาญ

เทคนิคอื่น ๆ ก็เจ๋งเช่นกันยกเว้นtabตอนนี้เราทุกคนเกี่ยวกับ :)

นี่คือตัวอย่าง (ต่อ ~ คำขอของนักต้มตุ๋น):

ฉันพิมพ์mkdir /where/the/hell/is/that/thingแล้วฉันต้องการซีดีลงในไดเรกทอรีเดียวกัน แต่ตอนนี้ฉันรู้เกี่ยวกับ meta-b :)


1
ตัวอย่างที่ชัดเจนจะน่ากลัว
ต้มตุ๋น quixote

@ ~ ต้มตุ๋นทำตัวอย่างตอนนี้
Dan Rosenstark

1
นี่เป็นคำถามที่เกี่ยวข้อง (ซ้ำ) มีคำตอบที่ดีมาก: superuser.com/questions/124336//
cregox

คำตอบ:


11

ลองสิ่งนี้:

mkdir /where/the/hell/is/that/thing

จากนั้นกดalt+.

ขึ้นอยู่กับระบบปฏิบัติการและ terminal ของคุณคุณอาจต้องพิมพ์ escแล้ว.

คุณสามารถกด alt+ 1+ .เพื่อเลือกอาร์กิวเมนต์ก่อนหน้าเฉพาะ

มันดีกว่า !! หรือ! $ เพราะคุณสามารถเห็นสิ่งที่คุณกำลังจะวิ่งและใช้การกดแป้นน้อยลง

แก้ไข: พูดอย่างเคร่งครัดมันmetaไม่ได้altดังนั้นจึงอาจทำงานกับปุ่ม "windows" ขึ้นอยู่กับการตั้งค่าแป้นพิมพ์ของคุณ ..


! ที่น่าสนใจ ไม่รู้เกี่ยวกับอันนั้น
ต้มตุ๋น quixote

2
@ เพียงแค่นี้มันยอดเยี่ยม บน OSX meta คือการหลบหนี
Dan Rosenstark

@yar พร้อมกับ OS X Terminal ยังมีการตั้งค่ากำหนดภายใต้ 'การตั้งค่า' -> 'แป้นพิมพ์' เป็น 'ตัวเลือกการใช้งานเป็นคีย์เมตา'
ThomasW

ขอบคุณ @ThomasW ฉันต้องกลับไปที่สิ่งนี้ ฉันใช้บรรทัดคำสั่งทุกวัน แต่ใช้ลูกเล่นน้อยมาก
Dan Rosenstark

28

คุณควรอ่านman bashในระบบของคุณโดยเฉพาะในส่วนของReadlineเนื่องจากนี่เป็นกลไกอินพุตแบบโต้ตอบของ bash คู่มือเตะที่ gnu.orgมีส่วนดีในcommandline การแก้ไขที่จะช่วยเติมในบางส่วนของช่องว่าง

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

  • Ctrl+ aย้ายไปที่จุดเริ่มต้นของบรรทัด (หรือHomeขึ้นอยู่กับการตั้งค่าเทอร์มินัล)
  • Ctrl+ eย้ายไปที่ท้ายบรรทัด (หรือEnd... )
  • Meta+ fเลื่อนไปข้างหน้า "คำ"
  • Meta+ bเลื่อนไปข้างหลัง "คำ"

คุณสามารถใช้ข้อความเหล่านี้เพื่อ"ฆ่า" (aka "ตัด") ข้อความจากบรรทัด:

  • Ctrl+ kฆ่าข้อความ ("ตัด") จากตำแหน่งเคอร์เซอร์ปัจจุบันไปยังจุดสิ้นสุดของบรรทัด
  • Ctrl+ yyanks ("pastes") ข้อความล่าสุดที่ถูกฆ่ากลับเข้าไปในบัฟเฟอร์ที่เคอร์เซอร์

เพื่อให้คุณสามารถรวมสิ่งเหล่านี้เพื่อเลือกกลุ่มคำสั่งที่คุณต้องการทำซ้ำฆ่ามันแล้ววางลงที่ส่วนท้ายของคำสั่งถัดไป


ตอนนี้จะทำให้ความสนุกมากยิ่งขึ้นขอพิจารณาทุบตีของการขยายตัวประวัติศาสตร์ นี่คือที่!!ที่คำตอบ Studer กล่าวถึง การขยายตัวของประวัติศาสตร์แบ่งลงไปdesignators เหตุการณ์ , designators คำและการปรับเปลี่ยน

นักออกแบบกิจกรรมมีลักษณะเช่นนี้ (ดูลิงค์สำหรับรายการทั้งหมด):

  • ! - เริ่มการทดแทนประวัติ
  • !n- คำสั่งn-thในรายการประวัติของ bash สำหรับจำนวนเต็มn (ใช้ได้สำหรับเนกาทีฟด้วย)
  • !!- คำสั่งนำหน้า เทียบเท่ากับ!-1
  • !string- คำสั่งล่าสุดที่เริ่มต้นด้วยสตริง

นักออกแบบWordเลือกบางส่วนจากเหตุการณ์ ใช้:เพื่อแยกเหตุการณ์ออกจากตัวกำหนดคำ คำจะมีหมายเลขตั้งแต่ 0 เริ่มต้นที่จุดเริ่มต้นของบรรทัดและแทรกลงในบรรทัดปัจจุบันคั่นด้วยช่องว่างเดียว

  • $- กำหนดอาร์กิวเมนต์สุดท้าย (เช่นอาร์กิวเมนต์!!:$สุดท้ายของคำสั่งสุดท้ายสามารถย่อให้สั้นลงได้!$)
  • n- กำหนดคำที่n (เช่น!str:2arg ที่ 2 ของคำสั่งล่าสุดที่เริ่มต้นด้วยstr ; !!:0คือคำสั่งของคำสั่งสุดท้าย)

ดังนั้นในการติดตามตัวอย่างของคุณหากคำสั่งสุดท้ายของคุณmkdir /some/really/long/pathเพียงแค่เรียกใช้!!จะเรียกใช้คำสั่งนั้นอีกครั้ง แต่คุณต้องการcdเข้าสู่เส้นทางนั้นแทน:

$ cd !$

ตอนนี้สมมติว่าคุณทำคำสั่งอื่น ๆ แล้วต้องการอ้างถึงเส้นทางนั้นอีกครั้ง หากนั่นคือคำสั่งmkdirสุดท้ายที่คุณรันคุณสามารถใช้สิ่งนี้เพื่อทำซ้ำเส้นทางนั้น:

$ tar czf ~/foo.tgz !mkdir:$

คุณสามารถผูกคำสั่งเหล่านี้ (และคำสั่ง Readline อื่น ๆ ) กับชุดค่าผสมที่คุณต้องการได้ ดูหัวข้อ 8.4 ของคำสั่งBindable Readline Commands: gnu.org/software/bash/manual/ …และส่วน 8.3, ไฟล์ Readline Init: gnu.org/software/bash/manual/bashref.html#Readline-Init-File
quack quixote

ขอบคุณที่ช่วยจริงๆ แม้ว่า "การอ่านคู่มือ" เป็นสิ่งที่คาดหวัง แต่การกล่าวถึงการเคลื่อนย้ายพื้นฐานรอบ ๆ การผูกก็ช่วยได้ แม้เพียงแค่รู้ ctrl-a อาจเป็นการประหยัดที่แท้จริง
Dan Rosenstark

@quack, ไม่มีปัญหา, ฉันได้ทำการแก้ไขในภายหลัง, ในความเป็นจริง :)
Dan Rosenstark

1
ยังทราบbind -pหรือbind -Pจะพิมพ์ปุ่มลัดปัจจุบันของคุณ; นั่นคือการอ้างอิงขั้นสูงสุดสำหรับสิ่งที่ทุบตีของคุณใช้
ต้มตุ๋น quixote

1
ฉันคิดว่าคำตอบนี้ได้รับการเติบโต: สิ่งที่เกี่ยวกับการขยายประวัติศาสตร์เป็นสิ่งที่ดี
Dan Rosenstark

6

หากคุณเป็นผู้ใช้ vi ที่คุณสามารถใส่เปลือกลง vi set -o viโหมดโดยการพิมพ์

Esc + kจากนั้นคุณสามารถทำทุกชนิดของสิ่งที่มีประสิทธิภาพในบรรทัดคำสั่งหลังจากการพิมพ์

อย่างใดอย่างหนึ่งที่ผมใช้มากที่สุดคือEsc+Kแล้ว/ข้อความใด ๆ ที่พิมพ์หลังจากที่เฉือนจะถูกใช้ในการค้นหาผ่านทางประวัติศาสตร์บรรทัดคำสั่งของคุณ

เช่นEsc + k /smbclient จะให้คำสั่ง smbclient สุดท้ายที่คุณพิมพ์ คุณสามารถเลื่อนดูการค้นหาทั้งหมดโดยใช้ปุ่ม vi มาตรฐาน ( jและkขึ้นและลง แต่ฉันคิดว่าลูกศรขึ้นและลงจะทำงานเช่นกัน)

ความช่วยเหลือเพิ่มเติมที่นี่ยังมีสิ่งทุบตี inbuilt ที่ลิงค์นั้นซึ่งอาจเป็นสิ่งที่คุณกำลังมองหา

ไชโย


ในขณะที่โหมด vi ไม่มีประโยชน์สำหรับฉันเนื่องจากฉันยังไม่ได้ก้าวไปถึง vi หมึก l นั้นยอดเยี่ยม ขอบคุณสำหรับสิ่งนั้น!
Dan Rosenstark

1
สิ่งที่เทียบเท่าโดยไม่มีโหมด vi คือ ctrl-r พิมพ์แล้วเป็นส่วนหนึ่งของคำสั่งก่อนหน้า มันจะแสดงการเกิดขึ้นครั้งสุดท้ายของสิ่งที่พิมพ์ กด ctrl-r อีกครั้งเพื่อไปที่หน้าถัดไป มีประโยชน์มาก
Nerdfest

3

คุณสามารถใช้!!ซึ่งแสดงถึงคำสั่งสุดท้าย:

การทดสอบ%
% echo !!
> ทดสอบ

น่าสนใจ ไม่แน่ใจว่าฉันต้องการจัดการสตริงนั้นโดยใช้ ... อะไร
Dan Rosenstark

นี่เป็นส่วนหนึ่งของสิ่งอำนวยความสะดวกประวัติของ bash: gnu.org/software/bash/manual/ ......โดยเฉพาะการขยายประวัติ: gnu.org/software/bash/manual/bashref.html#History-Interaction ... note !!เป็นคำพ้องความหมาย สำหรับ!-1: gnu.org/software/bash/manual/bashref.html#Event-Designators
quack quixote

2
สิ่งนี้มีประโยชน์จริง ๆ เมื่อคุณลืมใช้ sudo: ie sudo !! - $ more / etc / sudoers / etc / sudoers: การอนุญาตปฏิเสธ $ sudo !! sudo more / etc / sudoers [sudo] รหัสผ่านสำหรับ .. : # / etc / sudoers ... ... ...
user9632

@wookiebreath ขอบคุณสำหรับสิ่งนี้ฉันจะโหวตคำตอบนี้ได้แล้ว
Dan Rosenstark

0

ในตัวอย่างที่คุณให้ใช้! $ เพื่อเป็นตัวแทนของพารามิเตอร์สุดท้ายของคำสั่งก่อนหน้า:

mkdir / บางอย่าง / someelse

cd! $

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


0

ฉันเพิ่งพบว่าการโกง readline นี้มีประโยชน์มาก หลายสิ่งที่ฉันไม่รู้ ฉันเคยใช้!$ตลอดเวลาจนกระทั่งฉันพบกับAlt+ .ซึ่งตอนนี้ฉันใช้ตลอดเวลา :)

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