fc
เป็นคำสั่งในตัวในเชลล์ bash ทำเพื่อแก้ไขและเรียกใช้คำสั่งของประวัติอีกครั้ง
มีอยู่ใน CygWin ด้วยและทำงานบนดิสทริบิวชัน Linux ทั้งหมดที่ฉันทดสอบ:
fc -s '\'='/' -1
คำอธิบายบางอย่าง
บางคำเพิ่มเติมเกี่ยวกับสาเหตุที่คุณได้รับ "การแทนที่ล้มเหลว"
มันดูเหมือนว่าสำหรับs
ปรับปรุงไม่ได้ (ยัง) ดำเนินการเปลี่ยนตัวของตัวอักษรทับขวาที่\
ที่เป็นหนึ่งหลบหนี เพื่อให้แน่ใจว่าเราควรเห็นรหัสตัวอย่างของการขยายประวัติ bash รุ่น gnu (แต่มีคำสั่งด้านบนเพื่อรับสิ่งที่คุณพยายามทำ ... ดังนั้นฉันจึงขี้เกียจ .... )
หมายเหตุบางส่วน:
เรานำไปสู่การคิดว่ามันจะทำงานได้ดีกับ RegEx แต่ละครั้งsed
แต่ก็ไม่รับประกัน แบ็กสแลชเป็นตัวหนีของการขยายตัวและปัญหาอยู่ที่นี่ ยิ่งไปกว่านั้นพฤติกรรมของการขยายตัวนั้นเกี่ยวข้องกับshopt
ตัวเลือกต่างๆดังนั้นเราควรเริ่มเห็นเป็นกรณี ๆ ไป ...
เมื่อคุณวางสตริงcd C:\Foo\Bar
ในเปลือก bash ของคุณมันจะถูกขยายและมันจะปรากฏขึ้นสำหรับล่ามเป็นcd C:FooBar
; ในรูปแบบนี้มันจะถูกเก็บไว้ใน$_
ตัวแปรภายในด้วย
หากคุณวางแทนcd "C:\Foo\Bar"
หรือcd 'C:\Foo\Bar'
ในตัวแปรคุณควรจะหา$_
เนื่องจากการขยายตัวของประวัติศาสตร์จะดำเนินการทันทีหลังจากที่สายสมบูรณ์จะอ่านก่อนที่จะแบ่งเปลือกมันเป็นคำพูดที่คุณอาจจะอยากจะเริ่มต้นที่จะใช้กับบางbashismมากหรือน้อยธรรมดาเช่นมีรากศัพท์มาจาก (อาจจะเพิ่มหรือ, วจีวิภาคและอื่น ๆ ... ) C:\Foo\Bar
:p
:q
""
!!:0 ${_//\\/\/}
นี่เป็นช่วงเวลาที่ต้องจำไว้ว่ามันไม่ปลอดภัยที่จะเริ่มเล่นกับเส้นทางและชื่อไฟล์โดยเฉพาะอย่างยิ่งถ้าพวกเขามาจากคลิปบอร์ดของ windows (อ่านโดยทั่วไปในหน้าทำไมไม่แยกวิเคราะห์ls
?มันเกี่ยวข้องกับความเป็นไปได้ที่จะใช้แท็บ ช่องว่างและการขึ้นบรรทัดใหม่เป็นอักขระที่ถูกต้องสำหรับชื่อไฟล์และรายการไดเรกทอรี ... )
ยิ่งกว่านั้นเมื่อคุณวางข้อความที่จับด้วยเมาส์คุณอาจวางพื้นที่นำหน้าด้วย สิ่งนี้อาจหลีกเลี่ยงว่าคำสั่งของคุณจะเสร็จสิ้นในประวัติศาสตร์ (ขึ้นอยู่กับตัวเลือกของเชลล์ ... ) ถ้าอย่างนั้นการติดตามของคุณ!!
จะเป็นคำสั่งที่ไม่ได้ควบคุม ... (ดูตัวอย่างในคำตอบอื่น )นี่เป็นความเสี่ยงที่จับต้องไม่ได้
ข้อสรุป
การขยายประวัติแนะนำคำจากรายการประวัติลงในอินพุตสตรีมทำให้ง่ายต่อการทำซ้ำคำสั่งแทรกอาร์กิวเมนต์ไปยังคำสั่งก่อนหน้าในบรรทัดอินพุตปัจจุบันหรือแก้ไขข้อผิดพลาดในคำสั่งก่อนหน้าอย่างรวดเร็ว
ถ้าไม่ใช่เรื่องง่ายฉันเริ่มคิดว่าเรากำลังทำอะไรผิดพลาด ;-)
อาการคลื่นไส้: เป็นการทดลองเล็กน้อย
ฉันเปิดใช้งานhistverify
ในเชลล์แล้ว ...
shopt -s histverify
echo C:\Foo\Bar
!!:s|C|D| {1,2}A
จากนั้นฉันกดEnterและตรวจสอบการขยายตัวที่ฉันพบ
echo D:\Foo\Bar {1,2}A
จากนั้นฉันกดEnterอีกครั้งและมันก็ก้อง
D:FooBar 1A 2A
นี่ดูเหมือนว่าจะบ่งบอกว่าสิ่งที่substitution failed
สร้างขึ้นในการขยายประวัติประมวลผลก่อนการขยาย Brace ก่อนอื่นเลยและดูเหมือนว่าจะยืนยันว่าโมดิs
ฟายเออร์ประวัตินั้นยังไม่ได้ประมวลผลการแทนที่\
ตัวละครในฐานะ regex จริง ..
cd 'C:\foo\bar'