Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม BASH

7 ทางลัดประวัติทุบตีที่คุณจะใช้จริง ๆ

คำแนะนำส่วนใหญ่เกี่ยวกับทางลัดประวัติทุบตีจะแสดงรายการทุกรายการที่มีอยู่อย่างละเอียดถี่ถ้วน ปัญหาคือฉันจะใช้ช็อตคัทหนึ่งครั้ง แล้วลองเคลือบดูเมื่อพยายามทำทุกวิถีทางที่เป็นไปได้ จากนั้นฉันก็ย้ายไปทำงานของฉันและลืมพวกเขาไปโดยสิ้นเชิง เหลือไว้เฉพาะคนที่รู้จัก !! เคล็ดลับที่ฉันได้เรียนรู้เมื่อเริ่มใช้ 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 ) ผิดบ่อยเกินกว่าจะยอมรับ

7 ทางลัดประวัติทุบตีที่คุณจะใช้จริง ๆ

เมื่อคุณผสมอาร์กิวเมนต์เช่นนั้น คุณสามารถเรียกใช้:

$ !: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 และนำกลับมาใช้ใหม่โดยได้รับอนุญาต