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'