ทำไมการทดแทนประวัติทุบตียังเปิดใช้งานโดยค่าเริ่มต้น [ปิด]


17

ไม่มีใครรู้ว่าทำไมทุบตียังคงมีการเปิดใช้งานการทดแทนประวัติโดยค่าเริ่มต้น? ฉัน.bashrcรวมset +Hมาหลายปีแล้ว แต่คนอื่นบางคนยังคงถูกกัดโดยคุณลักษณะนี้

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

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

$ set +H # disable feature history substitution
$ echo "WTF???!?!!?"
WTF???!?!!?
$ set -H # enable feature history substitution
$ echo "WTF???!?!!?"
echo WTF???echo WTF???!?!!?
WTF???echo WTF???!?!!?

(เห็นได้ชัดว่าสถานที่มีปัญหาที่สำคัญถ้ามันถูกปิดใช้งานโดยค่าเริ่มต้นสำหรับการเขียนสคริปต์ทั้งหมดและมีคุณสมบัติที่มีอยู่เพื่อตรวจสอบผลลัพธ์ก่อนที่จะดำเนินการ: shopt -s histverify.)

ดูสิ่งนี้ด้วย:


16
คุณคิดว่าคนไม่ใช้การทดแทนประวัติ ฉันใช้มันทุกวัน ฉันคิดว่าจะเร็วจะปฏิบัติตามls -l foo/bar/baz/weeble.cppที่มีless !$มากกว่าการเรียกคืนคำสั่งและแก้ไขมัน
Martin Bonner สนับสนุน Monica

2
@MartinBonner ดังนั้นคุณสามารถเปิดใช้งานได้ คำถามเกี่ยวกับสาเหตุที่เปิดใช้งานโดยค่าเริ่มต้นไม่ใช่สาเหตุที่ยังมีอยู่
Barmar

5
@Barmar: แน่นอน แต่ประเด็นของฉันคือท้าทายข้อสันนิษฐานที่มีการบอกกล่าวล่วงหน้า
Martin Bonner สนับสนุน Monica

5
หากเราปฏิบัติตามเหตุผลของคุณสิ่งใดก็ตามที่ต้องมีการหลบหนีหรือการอ้างอิงควรถูกปิดใช้งานโดยค่าเริ่มต้น ทำไมฉันต้องหลบหนีหรืออ้าง URL ที่มี&? ทำไมฉันต้องหลบหนีหรืออ้างชื่อไฟล์ที่มี?? มี UIs สำหรับคนที่คิดว่านี่เป็นปัญหา
jcaron

3
ฉันใช้!$วันละหลายครั้งและ!!ค่อนข้างบ่อยเช่นกัน ฉันต้องยอมรับว่าฉันไม่ได้ใช้การทดแทนประวัติอื่น ๆ มากนัก แต่ฉันก็คงจะไม่มีความสุขถ้าพฤติกรรมเริ่มต้นของเชลล์ที่ฉันใช้มาเป็นเวลาหลายปีได้เปลี่ยนไปอย่างกะทันหัน
jcaron

คำตอบ:


32

หากคุณคุ้นเคยอยู่bashแล้วการจัดการกับรูปแบบการทดแทนประวัติไม่น่าจะกัดคุณได้มากกว่าการจัดการตัวละครอื่น ๆ ที่มีความพิเศษกับเชลล์นี้ อย่างไรก็ตามหากไม่มีใครคุ้นเคยกับเชลล์หรือไม่เคยใช้คุณสมบัติการทดแทนประวัติมันจะเห็นได้ชัดว่าเป็นเรื่องน่าประหลาดใจเมื่อดูเหมือนว่าสตริงที่ไม่มีเงื่อนไขหรือไม่มีเครื่องหมายอัญประกาศดูเหมือนจะไม่เป็นอันตราย

ในเชลล์เชิงโต้ตอบที่เปิดใช้งานการแทนที่ประวัติ!อักขระนั้นพิเศษในแบบเดียวกับ$ตัวละครที่มีความพิเศษเช่นที่ใดก็ได้ยกเว้นว่าจะหลบหนีด้วย\หรือในสตริงที่ยกมาเดี่ยว

ตรงกันข้ามกับที่$ผ่านมาการทดแทนประวัติไม่ได้ขยายในเอกสารที่นี่และเนื่องจากเป็นการเน้นบรรทัดพวกเขาจะ เกิดขึ้นเพิ่มเติมในบรรทัดที่การแทนที่อยู่ภายในบริบทที่ไม่มีเครื่องหมายอัญประกาศหรือบริบทที่ยกมาเป็นสองเท่า . ดูรายงานข้อผิดพลาดนี้สำหรับข้อมูลเพิ่มเติม

การทดแทนประวัติถูกปิดใช้งานในเชลล์ที่ไม่มีการโต้ตอบ (สคริปต์) เนื่องจากไม่จำเป็นต้องใช้ความสามารถด้านประวัติคำสั่งของเชลล์ที่นั่นไม่ใช่เพราะคุณสมบัติมี "ปัญหาที่สำคัญ" ในสคริปต์การบันทึกทุกคำสั่ง$HISTFILEไม่สมเหตุสมผลและการทดแทนประวัติก็ไม่ใช่สิ่งที่คุณต้องการใช้ในสคริปต์

ควรเปิดใช้งานโดยค่าเริ่มต้นหรือไม่ในเชลล์อินเทอร์แอคทีฟที่สามารถถกเถียงกันได้ (แม้ว่าฉันจะไม่เชื่ออย่างเต็มที่ว่าการอภิปรายที่นี่จะมีความสำคัญต่อbashนักพัฒนามาก) ดูเหมือนว่าคุณจะคิดว่าbashผู้ใช้ส่วนใหญ่กำลังมีปัญหาเกี่ยวกับการขยายประวัติ แต่ก็ไม่มีใครในพวกคุณและฉันที่รู้ว่ามันใช้งานบ่อยแค่ไหน

Unix shells อนุญาตให้หนึ่งปรับเปลี่ยนพฤติกรรมของเชลล์เพื่อให้เหมาะกับความต้องการและรสนิยมส่วนตัว หากคุณต้องการปิดการแทนที่ประวัติสำหรับเชลล์เชิงโต้ตอบทั้งหมดของคุณให้ทำสิ่งที่คุณทำกับการใช้งานset +Hใน~/.bashrcไฟล์ของคุณต่อไปหรือล็อบบี้bashนักพัฒนาเพื่อเปลี่ยนค่าเริ่มต้น (ซึ่งฉันเชื่อว่าจะทำให้คนสับสนและสับสนมากกว่าที่จะช่วย )


2
@MikkoRantalainen คุณคิดว่าการทดแทนประวัติไม่ใช่สิ่งที่bashผู้ใช้ส่วนใหญ่ใช้ ฉันไม่คิดว่าพวกเราคนใดคนหนึ่งรู้ว่ามันเป็นเรื่องธรรมดา ฉันขอแนะนำว่าถ้าคุณรู้สึกอย่างยิ่งเกี่ยวกับเรื่องนี้คุณส่งคำขอคุณสมบัติ / ข้อผิดพลาดไปยังbashรายชื่อผู้รับจดหมาย ดูsavannah.gnu.org/mail/?group=bash
Kusalananda

8
ขวา. ปัญหาไม่ได้เกี่ยวกับการทดแทนประวัติเลย แต่เกี่ยวกับความจริงที่ว่า“ เครื่องหมายอัญประกาศ” สองเท่าใน Bash ไม่ได้เป็นการอ้างอิงในแง่ที่ภาษาอื่นใช้คำนี้ แต่จะทำงานเหมือนกับวงเล็บชนิดพิเศษ @MikkoRantalainen ทำให้เป็นนิสัยที่จะนำสิ่งที่คุณไม่ต้องการให้ Bash ตีความด้วยวิธีพิเศษในราคาเดียว !
leftaroundabout

5
@leftaroundabout ขึ้นอยู่กับความหมายของคุณโดยการตีความ ภาษาส่วนใหญ่ตีความอักขระควบคุมในสตริงสำหรับเอาท์พุท (แต่ได้รับไม่ใช่ในลักษณะเดียวกับในเชลล์เมื่อเพิ่งสับสตริงรอบ ๆ ) กฎการอ้างอิงของ Perl นั้นทำงานคล้ายกับเชลล์ (การแก้ไขตัวแปร) เช่นเดียวกับภาษาการเขียนโปรแกรมใด ๆ มันจะช่วยได้หากเราสามารถจดจำภาษาที่ใช้อยู่ในปัจจุบันได้
Kusalananda

5
" ประเด็นของฉันคือ! เป็นตัวละครพิเศษที่ไม่ค่อยได้ใช้ " ฉันบอกว่ามันเป็นอีกทางหนึ่ง ... !มันไม่ค่อยถูกใช้เป็นตัวละครปกติที่สะท้อน WTFs ข้าง ๆ - จำนวนคนที่ถูกจับได้ไกลเกินกว่าที่ควรจะเป็น โดยจำนวนคนที่ยังคงใช้มันเพื่อทดแทนประวัติศาสตร์
TripeHound

3
-1 สำหรับการเบี่ยงเบนความผิดไปสู่การอ้างอิงที่ไม่เหมาะสม ตั้งแต่!เป็นไม่ได้พิเศษเพื่อที่สุดบอร์นเหมือนเปลือกหอยหรือในbashสคริปต์มีหลายเส้นทางโดยที่คนที่มีเหตุผลสามารถเรียนรู้ที่"$my_var some text!!"จะขยายแต่ไม่$my_var !!ฉันคุ้นเคยกับเชลล์ที่มีลักษณะคล้ายบอร์นบนbusybox ashและการเผชิญหน้าครั้งแรกของฉันกับการbashทดแทนประวัติศาสตร์คือฉันถูกมันกัดเมื่อฉันพยายามที่จะทำซับซับแบบรวดเร็วในเปลือกโต้ตอบ bashคนที่มีความเชี่ยวชาญในการใช้งานแบบพกพาและการเขียนสคริปต์ของบอร์นเหมือนเปลือกหอยมักจะกัดโดยอย่างน้อยหนึ่งครั้งเมื่อใช้
mtraceur

9

การทดแทนประวัติมีประโยชน์ ยกตัวอย่าง

% make-me-a-sandwich
make-me-a-sandwich: Permission denied
% sudo !!
Ok.

2
ดังนั้น? .bashrcหากคุณพบว่ามันมีประโยชน์ที่คุณสามารถเปิดใช้งานได้ในของคุณ
Barmar


3
@Barmar และหากคุณพบว่ามันไม่มีประโยชน์คุณสามารถปิดการใช้งานได้ ตลกวิธีสมมาตรทำงาน
ฮอบส์

3
@hobbs หากคุณไม่ทราบว่ามีอยู่คุณจะรู้ได้อย่างไรว่าจะปิดการใช้งาน
Barmar

2
คำตอบนี้ใช้อธิบายเหตุผลได้ดีว่าทำไมคุณสมบัตินี้จึงมีประโยชน์ ฉันคิดว่า OP ต้องการเข้าใจว่าทำไมการใช้ประโยชน์นี้จึงเพียงพอที่จะพิสูจน์พฤติกรรมนี้แม้ว่า OP (และคนอื่น ๆ เช่นคนที่ถามคำถามที่เกี่ยวข้องในการแลกเปลี่ยนแลกเปลี่ยนนี้) พบว่าพฤติกรรมนี้น่าประหลาดใจ / ไม่คาดคิด
mtraceur

4

แรงเฉื่อยทางสังคม / วัฒนธรรม

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

ในการเริ่มต้นเพื่อให้แน่ใจว่าคุณเข้าใจด้านอื่น ๆ ให้พิจารณาว่าความรำคาญที่คุณรู้สึกเกี่ยวกับการออกจากทางของคุณเพื่อปิดคุณลักษณะคือความรำคาญที่พวกเขาจะรู้สึกถ้าพวกเขาต้องออกไปเปิด คุณสมบัติ

รวมข้างต้นกับความจริงที่ว่าbashผู้ใช้มากพอที่จะใช้คุณสมบัติคำแนะนำในการลบหรือปิดโดยค่าเริ่มต้นจะได้พบกับการต่อต้านจากคนที่คุ้นเคยกับมันอยู่แล้วโดยค่าเริ่มต้น

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

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

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

TL; DR: ผู้ใช้ส่วนใหญ่อาจไม่สนใจอย่างยิ่งว่าค่าเริ่มต้นคืออะไรผู้ใช้บางคนชอบคุณลักษณะนี้และมีข้อได้เปรียบอย่างมากจากการใช้วิธีดังกล่าวและมีคนไม่มากพอที่จะสนับสนุนคุณลักษณะนี้ เอาชนะมัน


2
ไม่มันไม่เพียง แต่มาจากเปลือกหอยอื่น ๆ ผมรู้จักคุณลักษณะนี้สำหรับปีbashและยังคงได้รับการกัดด้วยความประหลาดใจเช่นเดียวอ้างไม่เคยทำงานใน!เพราะเสียbashการดำเนินงาน
Philippos

@Philippos มันช่างน่ากลัว (ก็ไม่น่ากลัวจริงๆ ... แต่มีคุณสมบัติเชิงลบที่น่าวิตกบางอย่าง) ขอบคุณที่ชี้นำสิ่งนี้ ฉันจะพยายามทบทวนคำตอบนี้ในภายหลังเพื่อให้ประเด็นของคุณเป็นคำตอบเมื่อฉันคิดถึงวิธีที่ดีในการรวมเข้าด้วยกัน
mtraceur

2

ทำไมการทดแทนประวัติทุบตียังเปิดใช้งานโดยค่าเริ่มต้น

เพราะหลายคนใช้มันและคนที่ใช้ bash shell แบบอินเทอร์แอคทีฟน่าจะรู้กฎเพื่อหลีกเลี่ยงปัญหาและโดยทั่วไปจะพบว่ามันช่วยได้มากกว่าความเจ็บปวด

.bashrc ของฉันได้รวมชุด + H เป็นเวลาหลายปี แต่คนอื่น ๆ ยังคงถูกกัดโดยคุณลักษณะนี้

ดังนั้นจึงเป็นคุณสมบัติที่คุณไม่ได้ใช้นั่นไม่ได้หมายความว่าผู้ใช้ส่วนใหญ่ไม่ได้ใช้งาน คุณสามารถยื่นคำร้องเพื่อเปลี่ยนค่าเริ่มต้น แต่คุณต้องดูที่ A) ส่วนของคนที่ใส่ใจและ B) อัตราส่วนของคนที่ชอบในแบบของคุณ คนที่แคร์และไม่ชอบมันอาจปิดการใช้งานไปแล้ว การเปลี่ยนจะช่วยได้เมื่อพวกเขาได้รับบัญชีบนคอมพิวเตอร์เครื่องใหม่ ผู้ที่สนใจและทำเช่นนั้นจะต้องอัปเดตการตั้งค่าในคอมพิวเตอร์ทุกเครื่องที่พวกเขาใช้และทุกบัญชีที่พวกเขาได้รับในอนาคต

เนื่องจากทุกคนใช้เทอร์มินัลพร้อมคุณสมบัติการคัดลอกวาง

ตัวเลือก clunkier ในความคิดของฉัน ...

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

ใช่ผู้คนเห็นว่ามีประโยชน์ การใช้รีโมทคอนโทรลช่วยให้คุณสามารถลุกขึ้นและเปลี่ยนช่องได้อย่างไร

(เห็นได้ชัดว่าสถานที่มีปัญหาที่สำคัญถ้ามันถูกปิดการใช้งานโดยค่าเริ่มต้นสำหรับการเขียนสคริปต์ทั้งหมดและคุณสมบัติที่มีอยู่ในการตรวจสอบผลลัพธ์ก่อนที่จะดำเนินการ: shopt -s histverify.)

ประวัติไม่สมเหตุสมผลในสคริปต์จริงๆ แต่ที่สำคัญกว่านั้นอาจทำให้เกิดปัญหาด้านความปลอดภัย ในกรณีของคุณคุณสามารถหลีกเลี่ยงปัญหาโดยใช้เครื่องหมายคำพูดเดี่ยว ฉันจำไม่ได้ว่าสิ่งนี้ทำให้เกิดปัญหากับฉันดังนั้นฉันไม่รู้ว่าคุณจะพูดได้อย่างไรว่ามันมี 'ประเด็นสำคัญ' สิ่งนี้ทำให้เกิดปัญหาจริงกับคุณหรือคุณรำคาญที่ต้องตั้งค่าเริ่มต้นของคุณบนคอมพิวเตอร์เครื่องใหม่หรือไม่?

ฉันไม่เห็นว่ามันแตกต่างจากการหลบหนีหรือใช้คำพูดเดียวในเรื่องนี้ถ้าคุณต้องการรับเงินจริง ๆ :

$ echo "Give me $50 or the cat gets it"
Give me $0 or the cat gets it

2
ดูคำถามที่เกี่ยวข้อง (คอลัมน์ขวา); คำถามส่วนใหญ่จะกระทบคุณลักษณะนี้โดยบังเอิญและคิดว่าเชลล์นั้นใช้งานไม่ได้ ฉันเองได้เรียนรู้เกี่ยวกับคุณลักษณะนี้มานานแล้วเนื่องจากความจริงที่ว่าฉันใช้ลำดับอักขระโดยไม่ตั้งใจซึ่งทำให้ได้ผลลัพธ์ผิด ผมจะได้รับการบันทึกโดยshopt -s histverifyแต่ที่ไม่ได้อยู่บนโดยค่าเริ่มต้น นอกจากนี้การหาสาเหตุด้วยตัวเองนั้นค่อนข้างยากเพราะข้อความแสดงข้อผิดพลาดเป็นความลับ ("ไม่พบเหตุการณ์") และลำดับอักขระที่เรียกใช้ยากสำหรับ google
Mikko Rantalainen

1
ผู้คนจะถูกกัดอย่างแท้จริงด้วยคุณสมบัตินี้เพราะคุณสมบัติของเชลล์ "สากล" เช่น$การอยู่ภายในพิเศษ"..."เป็นหนึ่งในสิ่งแรกที่ผู้คนเรียนรู้เกี่ยวกับเชลล์ในขณะที่ความจริงที่!พิเศษคือภายใน"..."(แต่ในโหมดโต้ตอบเท่านั้น) ไม่ค่อยเป็นที่รู้จักทั่วไป ไม่ได้รับการสอนอย่างทันที / เด่นชัดและมีความbashเฉพาะเจาะจง นอกจากนี้เชลล์ที่เหมือนบอร์นส่วนใหญ่จะมีความสมมาตรระหว่าง text-in-a-script และ text-on-the-the-interactive-shell ดังนั้นโดยทั่วไปคุณสามารถ copaste จากที่หนึ่งไปยังอีกที่หนึ่งและทำให้มันทำงานเหมือนกัน - และคุณลักษณะนี้สร้างขึ้น หนึ่งในข้อยกเว้นเท่านั้น
mtraceur

1
ผมไม่เห็นว่ามันมีความแตกต่างใด ๆ กว่าที่มีการหลบหนีหรือใช้ราคาเดียว True สำหรับzshเมื่อเดียวอ้าง!เสมอทำงาน แต่ไม่ได้สำหรับbashที่ดำเนินการผลิตผลที่ไม่คาดคิด คุณพูดว่าเราควรรู้กฎแล้วคุณรู้ไหมว่ากฎที่เชื่อมโยงนั้น
Philippos
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.