พฤติกรรมประวัติทุบตีแปลก ๆ เมื่อใช้หลายเซสชัน


15

ประวัติบรรทัดคำสั่งจะเก็บไว้อย่างไรเมื่อฉันใช้ windows terminal หลาย ๆ ฉันรู้ว่ามันถูกเก็บไว้ใน.bash_historyแต่ฉันไม่เห็นตรรกะเกี่ยวกับประวัติที่ใช้ถ้าฉันเปิดหน้าต่างใหม่ มันเกือบจะรู้สึกไม่เป็นระเบียบในแง่ที่ฉันไม่เคยรู้เลยว่าจะสั่งอะไรฉันจะดูว่าฉันพยายามใช้ลูกศรขึ้นในหน้าต่างใหม่หรือไม่

มีคนอธิบายเรื่องนี้ได้ไหม

มีวิธีการควบคุมประวัติในลักษณะที่ฉันสามารถนำประวัติมาใช้ใหม่จากหน้าต่างใดหน้าหนึ่งได้หรือไม่

คำตอบ:


14

เพื่อให้เข้าใจถึงพฤติกรรมของประวัติทุบตีก่อนอื่นคุณต้องรู้สิ่งต่อไปนี้:

  1. มีประวัติในไฟล์ประวัติ
  2. มีประวัติในหน่วยความจำของกระบวนการทุบตี
  3. ประวัติในหน่วยความจำของกระบวนการทุบตีหนึ่งไม่ได้ซิงค์กับประวัติในหน่วยความจำของกระบวนการทุบตีอื่น ๆ
  4. ประวัติในหน่วยความจำของกระบวนการทุบตีจะไม่ได้รับการซิงค์กับประวัติในไฟล์เว้นแต่จะมีการถามอย่างชัดเจนถึงหรือในระหว่างเหตุการณ์บางอย่าง (ดูด้านล่าง)

เมื่อใช้การตั้งค่าเริ่มต้นวงจรชีวิตของเซสชัน bash ที่เกี่ยวข้องกับประวัติจะเป็นดังนี้:

  1. ในระหว่างการเริ่มต้นทุบตีจะอ่านไฟล์ประวัติ ขณะนี้เนื้อหาของไฟล์ประวัติอยู่ในหน่วยความจำของกระบวนการทุบตี
  2. ในระหว่างการใช้งานปกติมีการจัดการประวัติในหน่วยความจำเท่านั้น
  3. ระหว่างการปิดระบบประวัติในหน่วยความจำจะถูกเขียนไปยังไฟล์ประวัติเขียนทับเนื้อหาก่อนหน้าใด ๆ ของไฟล์ประวัติ

พฤติกรรม nondeterministic ที่คุณสังเกตเห็นส่วนใหญ่เป็นเพราะเนื้อหาของไฟล์ประวัติมักจะเป็นประวัติของเซสชั่นทุบตีปิดล่าสุดและทุบตีเท่านั้นอ่านไฟล์ประวัติในระหว่างการเริ่มต้น

อ่านคู่มือทุบตีสำหรับคำอธิบายโดยละเอียดเพิ่มเติมเกี่ยวกับกระบวนการเริ่มต้นและปิดระบบ

โปรดทราบว่าด้วยการตั้งค่าเริ่มต้นฉันหมายถึงการตั้งค่าเริ่มต้นจากการทุบตี การแจกจ่ายของคุณอาจมี.bashrc(หรือ/etc/bash.bashrc) ซึ่งเปลี่ยนแปลงพฤติกรรมนี้

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

โปรดทราบว่าการเปิดใช้งานhistappendจะไม่ลดพฤติกรรมที่ไม่ปรากฏขึ้นของผู้ดูแลระบบมากนัก นี่เป็นเพราะทุกเซสชันทุบตียังคงมีประวัติของตัวเองในหน่วยความจำ เป็นไปได้ที่จะมีประวัติทุบตีเป็นส่วนใหญ่ มีคู่มือวิธีการได้รับกระบวนการทุบตีทุกคนที่จะมีประวัติที่ซิงค์ส่วนใหญ่ในเป็นด้ายล้นสแต็ค

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

เพื่อความสมบูรณ์นี่คือรายการของตัวแปรภายในที่ปรับเปลี่ยนพฤติกรรมประวัติ:

  • HISTFILE: ไฟล์ที่จะอ่านและเขียนประวัติถึง
  • HISTFILESIZE: จำนวนบรรทัดสูงสุดสำหรับไฟล์ประวัติ
  • HISTSIZE: จำนวนบรรทัดสูงสุดสำหรับประวัติในหน่วยความจำ
  • HISTCONTROL, HISTIGNORE, HISTTIMEFORMAT: ไม่เกี่ยวข้องกับการสนทนานี้ อ่านคู่มือทุบตีเพื่อดูรายละเอียด

คำอธิบายที่ดี คุณพูดถึงการปิดเครื่อง แต่สิ่งที่เกี่ยวกับการฆ่า terminal terminal? เซสชั่นสามารถฆ่าได้ผ่านออกจากระบบหรือผ่าน UI หรือผ่านวิธีการอื่น ๆ เช่นการเชื่อมต่อเครือข่ายลดลง หากไฟล์ประวัติทั้งหมดถูกแทนที่และคุณมีหลายเซสชันคุณกำลังบอกว่าประวัติจากไฟล์ที่ปิดล่าสุดจะถูกใช้ในไฟล์ประวัติหรือไม่ ซึ่งสามารถอธิบายพฤติกรรมที่ไม่แน่นอนได้
Alex Gitelman

จุดรอบอายุ (3) ไม่ถูกต้อง ดูเหมือนว่าเฉพาะเซสชัน bash แรกเท่านั้นที่จะเขียนลงในไฟล์ประวัติ ทดสอบ: เปิด 2 เซสชันตามลำดับ -, b ทำ 'echo hello' ในb . จากนั้นออกในb . จากนั้นเปิดเซสชันใหม่c . เซสชั่นนี้จะไม่มีเสียงสะท้อนในประวัติศาสตร์
user606723

@AlexGitelman: หากกระบวนการทุบตีถูกฆ่าก็จะไม่มีโอกาสเขียนทับไฟล์ประวัติ และใช่ประวัติจากเซสชันที่ปิดล่าสุดคือรายการที่จะอยู่ในไฟล์ประวัติ
lesmana

@ user606723: จุด 3 ถูกต้อง อ่านคู่มือทุบตี ทดลองอีกครั้งโดยใช้.bashrcไฟล์ขั้นต่ำ /etc/bash.bashrcทราบว่าการกระจายของคุณอาจจะมีการเปลี่ยนแปลงการตั้งค่าบางอย่างใน histappendตรวจสอบเฉพาะสำหรับตัวเลือกเปลือก
lesmana

2

http://www.gnu.org/software/bash/manual/bashref.html#Using-History-Interactively

คุณอาจสามารถจัดการวิธีเขียนไฟล์ประวัติกับหนึ่งในเทอร์มินัลเช่นเรียกใช้งาน "history -a" หรือ "history -w" ในเทอร์มินัลที่คุณต้องการบันทึกประวัติจากนั้น "history -r" ใน อาคารอื่น ๆ ขึ้นอยู่กับสิ่งที่คุณต้องการจะทำ


0

AFAIK คำสั่ง bash จะถูกบันทึกหลังจากเซสชัน SSH ถูกยกเลิก ดังนั้นคำสั่งจะไม่ถูกบันทึกเมื่อเซสชันหยุดทำงานผิดปกติ (เช่นเนื่องจากเครือข่ายล้มเหลว) ฉันกำลังพูดถึงที่นี่เกี่ยวกับการประชุม SSH เครื่องปลายทางอาจใช้วิธีการที่คล้ายกัน

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


นี่ไม่ใช่พฤติกรรมที่ฉันเคยเจอ ฉันสามารถยืนยันสิ่งนี้ได้โดยทำการทดสอบอย่างรวดเร็วโดยที่ฉันเปิดเซสชัน ssh ทำคำสั่งและออกอย่างสง่างาม ในกรณีนี้ฉันมีเซสชั่น ssh อื่นที่ใช้งานก่อนหน้านี้ ในเซสชันทุบตีที่มีอยู่แล้วนี้ฉันจะตรวจสอบ. bash_history และไม่พบสิ่งใดที่บันทึกไว้ ฉันคิดว่าเป็นไปได้ว่าเซสชัน bash แรกที่ทำงานอยู่นั้นเป็นรายการเดียวที่จบลงด้วยการบันทึกเป็น. bash_history
user606723

การยกเลิกเซสชันของคุณจะไม่ส่งผลกระทบต่อเซสชันที่กำลังทำงานอยู่ แต่จะมีผลกับเซสชันใหม่!
เลด

จะทำอย่างไรถ้าไม่ใช่ SSH แต่เป็นหน้าต่างเทอร์มินัล Gnome ที่ฉันปิดผ่าน UI
Alex Gitelman

มันจะต้องมีการตรวจสอบ ขณะนี้ฉันไม่สามารถเข้าถึงสถานี Gnome ได้!
เลด

@ Khaled ทดสอบแล้วไม่มีผลต่อเซสชันใหม่ (ฉันตรวจสอบ. bash_history ก่อนหน้านี้ต่อไปซึ่งเป็นที่ที่ bash ได้รับประวัติคำสั่งสำหรับเซสชันใหม่ฉันรู้ว่ามันจะไม่ทำงาน แต่ฉัน humour'ed คุณต่อไป)
user606723
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.