Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม Bash

เชี่ยวชาญ Bash History: คำสั่งขั้นสูง การเรียกคืนเร็ว และเคล็ดลับการแก้ไข

บทนำ

Bash มี history อุดมสมบูรณ์ นั่นคือ มันเป็น shell เก่าที่มีบรรพบุรุษเก่ากว่า (Bourne shell) แต่มันยังมีคำสั่ง history ที่ยอดเยี่ยมซึ่งเกินกว่า history interfaces ของ shell อื่นๆ ทุกตัวจากจำนวนฟีเจอร์ Bash version ของ history อนุญาตให้ reverse searches, quick recall, rewriting history, และมากกว่านั้น

คำสั่ง history ไม่เหมือนคำสั่งอื่นๆ มาก คุณอาจคุ้นเคยกับคำสั่งที่เป็น executable files วางในตำแหน่งระดับระบบทั่วไปอย่าง /usr/bin, /usr/local/bin, หรือ ~/bin Built-in history command ไม่อยู่ใน PATH ของคุณ และไม่มีที่ตั้งทางกายภาพ:

$ which history

which: no history in [PATH]

แทนที่จะเป็นนั้น history เป็น built-in function ของ shell เอง:

$ type history
history is a shell builtin
$ help history
history: history [-c] [-d offset] [n] or
history -anrw [filename] or
history -ps arg [arg...]

Display or manipulate the history list.
[...]

ด้วยเหตุผลนี้ history function ในแต่ละ shell จึง unique ดังนั้นสิ่งที่คุณใช้ใน Bash อาจไม่ทำงานใน Tcsh หรือ Fish หรือ Dash และสิ่งที่คุณใช้ใน那些 อาจไม่ทำงานใน Bash ในบางกรณี การรู้ว่ Bash ทำอะไรได้ อาจแจ้งเตือนผู้ใช้ shell อื่นๆ ให้สร้าง hacks ที่น่าสนใจเพื่อ clone พฤติกรรม Bash และอาจปลดล็อกฟีเจอร์ของ Bash ที่คุณไม่เคยรู้ว่ามีอยู่

ดู Bash history ของคุณ

การใช้งานพื้นฐานและบ่อยที่สุดของคำสั่ง history คือการดูประวัติ shell session ของคุณ:

$ echo "hello"
hello
$ echo "world"
world
$ history
1 echo "hello"
2 echo "world"
3 history

Event designators (ตัวระบุเหตุการณ์)

Event designators ค้นหาผ่าน history ของคุณโดย event Event ในบริบทนี้คือคำสั่งที่บันทึกใน history แยกด้วย newline character กล่าวคือ หนึ่งบรรทัด ที่มีหมายเลข index สำหรับอ้างอิง

Event designators เริ่มต้นส่วนใหญ่ด้วย exclamation point บางครั้งเรียกว่า bang (!)

เพื่อรันคำสั่งจาก history อีกครั้ง ใช้ exclamation point ตามทันที (ไม่มี space) ด้วยหมายเลข index ของคำสั่งที่ต้องการ ตัวอย่าง สมมติบรรทัด 1 มีคำสั่ง echo "hello" และคุณต้องการรันอีกครั้ง:

$ !1
echo "hello"
hello

คุณสามารถใช้ relative positioning โดยให้ตัวเลขลบของบรรทัดย้อนกลับจากตำแหน่งปัจจุบันใน history ตัวอย่าง เพื่อย้อนกลับ 3 รายการใน history:

$ echo "foo"
foo
$ echo "bar"
bar
$ echo "baz"
baz
$ !-3
echo "foo"
foo

หากคุณเพิ่งย้อนกลับแค่หนึ่งบรรทัด คุณสามารถใช้ shorthand !! แทน !-1 นั่นคือการประหยัด keystroke หนึ่งตัวเต็ม!

$ echo "foo"
$ !!
echo "foo"
foo

คุณยังสามารถค้นหาสตริงเฉพาะผ่านรายการ แบบย้อนกลับ สำหรับคำสั่งที่จะรันได้ เพื่อค้นหาคำสั่งที่ ขึ้นต้น ด้วยสตริงเฉพาะ ใช้ exclamation point ตามทันที (ไม่มี space) ด้วยสตริงที่ต้องการค้นหา:

$ echo "foo"
$ true
$ false
$ !echo
echo "foo"
foo

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

$ echo "foo"
$ true
$ false
$ !?foo?
echo "foo"
foo

การแทนที่สตริง (String substitution)

คล้ายกับการค้นหาสตริงที่ต้นบรรทัด คุณสามารถค้นหาสตริงและแทนที่ด้วยสตริงใหม่ เปลี่ยนคำสั่ง:

$ echo "hello"
hello
$ echo "world"
world
$ ^hello^foo
echo "foo"
foo

ทำให้ History มีประโยชน์

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