คำแนะนำส่วนใหญ่เกี่ยวกับทางลัดประวัติทุบตีจะแสดงรายการทุกรายการที่มีอยู่อย่างละเอียดถี่ถ้วน ปัญหาคือฉันจะใช้ช็อตคัทหนึ่งครั้ง แล้วลองเคลือบดูเมื่อพยายามทำทุกวิถีทางที่เป็นไปได้ จากนั้นฉันก็ย้ายไปทำงานของฉันและลืมพวกเขาไปโดยสิ้นเชิง เหลือไว้เฉพาะคนที่รู้จัก !! เคล็ดลับที่ฉันได้เรียนรู้เมื่อเริ่มใช้ Bash ครั้งแรก
ส่วนใหญ่ไม่เคยยึดติดกับความทรงจำ
บทความนี้สรุปทางลัดที่ฉันใช้จริง ทุกวัน. มันขึ้นอยู่กับเนื้อหาบางส่วนในหนังสือของฉัน เรียนรู้ทุบตีอย่างหนัก; (คุณสามารถอ่านตัวอย่างเพื่อเรียนรู้เพิ่มเติม)
เมื่อมีคนเห็นฉันใช้ทางลัดเหล่านี้ พวกเขามักจะถามฉันว่า "คุณไปทำอะไรที่นั่น!" ต้องใช้ความพยายามหรือสติปัญญาเพียงเล็กน้อย แต่เพื่อเรียนรู้สิ่งเหล่านี้จริงๆ ฉันขอแนะนำให้ใช้อย่างใดอย่างหนึ่งในแต่ละวันเป็นเวลาหนึ่งสัปดาห์ จากนั้นจึงค่อยเปลี่ยนไปใช้อันถัดไป คุณควรสละเวลาเพื่อให้มันอยู่ในมือของคุณ เพราะเวลาที่คุณบันทึกได้จะมีความสำคัญในระยะยาว
1. อาร์กิวเมนต์สุดท้าย: !$
หากคุณใช้ทางลัดเดียวจากบทความนี้ ให้สร้างเป็นทางลัดนี้ แทนที่อาร์กิวเมนต์สุดท้ายของคำสั่งสุดท้ายในบรรทัดของคุณ
พิจารณาสถานการณ์นี้:
$ mv /path/to/wrongfile /some/other/place
mv: cannot stat '/path/to/wrongfile': No such file or directory
อ๊ะ ฉันใส่ ไฟล์ผิด ชื่อไฟล์ในคำสั่งของฉัน ฉันควรจะใส่ rightfile แทน
คุณอาจตัดสินใจพิมพ์คำสั่งสุดท้ายอีกครั้งและแทนที่ไฟล์ผิดด้วยไฟล์ที่ถูกต้องทั้งหมด แต่คุณสามารถพิมพ์:
$ mv /path/to/rightfile !$
mv /path/to/rightfile /some/other/place
และคำสั่งก็จะใช้งานได้
มีวิธีอื่นในการบรรลุสิ่งเดียวกันใน Bash ด้วยทางลัด แต่เคล็ดลับในการใช้อาร์กิวเมนต์สุดท้ายของคำสั่งสุดท้ายนี้ซ้ำเป็นวิธีที่ฉันใช้บ่อยที่สุด
2. "n อาร์กิวเมนต์" หนึ่ง: !:2
เคยทำอะไรแบบนี้ไหม
$ tar -cvf afolder afolder.tar
tar: failed to open
เช่นเดียวกับคนอื่น ๆ ฉันได้รับข้อโต้แย้งถึง tar (และ ln ) ผิดบ่อยเกินกว่าจะยอมรับ
เมื่อคุณผสมอาร์กิวเมนต์เช่นนั้น คุณสามารถเรียกใช้:
$ !:0 !:1 !:3 !:2
tar -cvf afolder.tar afolder
และชื่อเสียงของคุณจะถูกบันทึกไว้
รายการคำสั่งสุดท้ายมีดัชนีเป็นศูนย์และสามารถแทนที่ด้วยตัวเลขหลัง !: .
แน่นอน คุณสามารถใช้สิ่งนี้เพื่อนำอาร์กิวเมนต์เฉพาะจากคำสั่งสุดท้ายมาใช้ซ้ำ แทนที่จะใช้อาร์กิวเมนต์ทั้งหมด
3. "อาร์กิวเมนต์ทั้งหมด" อันหนึ่ง: !:1-$
ลองนึกภาพฉันเรียกใช้คำสั่งเช่น:
$ grep '(ping|pong)' afile
อาร์กิวเมนต์ถูกต้อง อย่างไรก็ตาม ฉันต้องการจับคู่ ping หรือ ปิงปอง ในไฟล์ แต่ฉันใช้ grep มากกว่า egrep .
ฉันเริ่มพิมพ์ egrep แต่ฉันไม่ต้องการพิมพ์ข้อโต้แย้งอื่นๆ ซ้ำ ดังนั้นฉันจึงสามารถใช้ !:1$ ช็อตคัทเพื่อขออาร์กิวเมนต์ทั้งหมดของคำสั่งก่อนหน้าจากคำสั่งที่สอง (จำไว้ว่าไม่มีการจัดทำดัชนี) ไปยังคำสั่งสุดท้าย (แสดงโดย $ ลงชื่อ)
$ egrep !:1-$
egrep '(ping|pong)' afile
ping
คุณไม่จำเป็นต้องเลือก 1-$; คุณสามารถเลือกชุดย่อยเช่น 1-2 หรือ 3-9 (หากคุณมีข้อโต้แย้งมากมายในคำสั่งก่อนหน้า)
4. "สุดท้ายแต่ n " หนึ่ง: !-2:$
ทางลัดด้านบนนั้นยอดเยี่ยมเมื่อฉันรู้วิธีแก้ไขคำสั่งสุดท้ายของฉันทันที แต่บ่อยครั้งที่ฉันเรียกใช้คำสั่ง หลัง คำสั่งเดิม ซึ่งหมายความว่าคำสั่งสุดท้ายไม่ใช่คำสั่งที่ฉันต้องการอ้างอิงอีกต่อไป
ตัวอย่างเช่น การใช้ mv ตัวอย่างก่อนหน้านี้ หากฉันติดตามข้อผิดพลาดด้วย ls ตรวจสอบเนื้อหาของโฟลเดอร์:
$ mv /path/to/wrongfile /some/other/place
mv: cannot stat '/path/to/wrongfile': No such file or directory
$ ls /path/to/
rightfile
ฉันไม่สามารถใช้ !$ . ได้อีกต่อไป ทางลัด
ในกรณีเหล่านี้ ฉันสามารถแทรก -n : (โดยที่ n คือจำนวนคำสั่งที่จะย้อนกลับไปในประวัติ) หลัง ! เพื่อดึงอาร์กิวเมนต์สุดท้ายจากคำสั่งที่เก่ากว่า:
$ mv /path/to/rightfile !-2:$
mv /path/to/rightfile /some/other/place
อีกครั้ง เมื่อคุณเรียนรู้แล้ว คุณอาจจะแปลกใจว่าคุณต้องการมันบ่อยแค่ไหน
5. ไฟล์ "get me the folder": !$:h
ตัวนี้ดูไม่ค่อยสดใสเท่าไหร่ แต่ใช้วันละหลายสิบครั้ง
ลองนึกภาพฉันรันคำสั่งแบบนี้:
$ tar -cvf system.tar /etc/system
tar: /etc/system: Cannot stat: No such file or directory
tar: Error exit delayed from previous errors.
สิ่งแรกที่ฉันอาจต้องการทำคือไปที่ /etc เพื่อดูว่ามีอะไรอยู่ในนั้นและหาว่าผมทำอะไรผิด
ฉันสามารถทำได้ทันทีด้วย:
$ cd !$:h
cd /etc
อันนี้บอกว่า:"รับอาร์กิวเมนต์สุดท้ายของคำสั่งสุดท้าย (/etc/system ) และถอดองค์ประกอบชื่อไฟล์สุดท้ายออก เหลือเพียง /etc ."
6. "บรรทัดปัจจุบัน" หนึ่ง: !#:1
หลายปีที่ผ่านมา ฉันสงสัยว่าฉันสามารถอ้างอิงข้อโต้แย้งในบรรทัดปัจจุบันได้หรือไม่ ก่อนที่จะค้นหาและเรียนรู้มันในที่สุด ฉันหวังว่าฉันจะทำอย่างนั้นมานานแล้ว ฉันมักจะใช้มันเพื่อสร้างไฟล์สำรอง:
$ cp /path/to/some/file !#:1.bak
cp /path/to/some/file /path/to/some/file.bak
แต่เมื่ออยู่ใต้นิ้วมือ อาจเป็นทางเลือกที่รวดเร็วมากสำหรับ …
7. "ค้นหาและแทนที่" หนึ่ง: !!:gs
สิ่งนี้ค้นหาในคำสั่งที่อ้างอิงและแทนที่สิ่งที่อยู่ในสอง / . แรก กับสิ่งที่อยู่ใน 2 ตัวที่สอง
บอกว่าฉันอยากบอกโลกว่า ของฉัน คีย์ไม่ทำงานและส่งออก f แทน:
$ echo my f key doef not work
my f key doef not work
จากนั้นฉันก็รู้ว่าฉันเพิ่งกด f ที่สำคัญโดยบังเอิญ เพื่อแทนที่ f . ทั้งหมด กับ s ฉันสามารถพิมพ์:
$ !!:gs/f /s /
echo my s key does not work
my s key does not work
มันใช้ไม่ได้กับอักขระเดียวเท่านั้น ฉันสามารถแทนที่คำหรือประโยคได้เช่นกัน:
$ !!:gs/does/did/
echo my s key did not work
my s key did not work
ทดสอบเลย
เพียงเพื่อแสดงให้คุณเห็นว่าสามารถใช้ทางลัดเหล่านี้ร่วมกันได้อย่างไร คุณลองคิดดูว่าคลิปตัดเล็บเท้าเหล่านี้จะออกมาเป็นอย่างไร
$ ping !#:0:gs/i/o
$ vi /tmp/!:0.txt
$ ls !$:h
$ cd !-2:h
$ touch !$!-3:$ !! !$.txt
$ cat !:1-$
สรุป
Bash สามารถเป็นแหล่งทางลัดที่สวยงามสำหรับผู้ใช้บรรทัดคำสั่งแบบวันต่อวัน แม้ว่าจะมีเคล็ดลับและคำแนะนำมากมายให้เรียนรู้ แต่สิ่งเหล่านี้เป็นรายการโปรดที่ฉันนำไปใช้บ่อย
หากคุณต้องการดำดิ่งลงไปในทุกสิ่งที่ Bash สามารถสอนคุณได้ หยิบหนังสือของฉันขึ้นมา เรียนรู้ Bash อย่างยากลำบาก หรือดูหลักสูตรออนไลน์ของฉัน Master the Bash shell
บทความนี้ถูกโพสต์ครั้งแรกบนบล็อกของ Ian ที่ Zwischenzugs.com และนำกลับมาใช้ใหม่โดยได้รับอนุญาต