ไฟล์ประวัติสามารถรวมเป็นหนึ่งเดียวในทุบตี?


35

ฉันใช้หลายscreenครั้งบนเดสก์ท็อปและเซิร์ฟเวอร์ Linux เป็นประจำ

ปัญหานี้คือเมื่อฉันgrepผ่านประวัติศาสตร์คำสั่งของฉันฉันพบว่าฉันออกคำสั่งในเซสชั่นที่แตกต่างกันและจะต้องแยกออกและแนบอีกครั้งเพื่อรับรายการประวัติที่

เป็นไปได้หรือไม่ที่จะ 'บังคับ' ประวัติศาสตร์ที่อัปเดตต่าง ๆ จากหลายเซสชันไปยังประวัติศาสตร์ส่วนกลาง?


ฉันพบปัญหาที่คล้ายกันซึ่งฉันไม่สามารถดูประวัติระหว่างเซสชันเทอร์มินัล ปรากฎไฟล์ ~ / .bash_history ของฉันเป็นของ root และไม่สามารถเขียนได้ การเปลี่ยนเจ้าของ / กลุ่มให้กับผู้ใช้ของฉันแก้ไขปัญหา: sudo chown <user>: <group> ~ / .bash_history
mateo

ที่คล้ายกัน: stackoverflow.com/questions/103944/…
lesmana

คำตอบ:


41

มีสองสิ่งที่คุณต้องทำ:

  1. ใส่คำสั่งในของคุณshopt -s histappend .bashrcนี่จะผนวกเข้ากับไฟล์ประวัติแทนการเขียนทับมัน
  2. นอกจากนี้ในของคุณ.bashrcแทรกPROMPT_COMMAND="$PROMPT_COMMAND;history -a; history -n"และไฟล์ประวัติจะถูกเขียนใหม่และอ่านอีกครั้งในแต่ละครั้งทุบตีแสดงพรอมต์

แก้ไข: ขอบคุณ e-t172 สำหรับhistory -nเคล็ดลับ


6
ขอบคุณสำหรับสิ่งนี้. ฉันปรับปรุงมันต่อไปโดยใช้ PROMPT_COMMAND = "$ PROMPT_COMMAND; history -a; history -n" ด้วยวิธีนี้คำสั่งที่ออกในเซสชันอื่นจะปรากฏขึ้นทันทีในประวัติของเซสชันปัจจุบัน (คุณต้องกด Enter ก่อนเพื่ออัปเดตประวัติ)
Etienne Dechamps

8
ฉันไม่ได้PROMPT_COMMANDกำหนดไว้ก่อนหน้านี้ดังนั้นฉันจึงต้องใช้PROMPT_COMMAND="history -a; history -n"เพื่อหลีกเลี่ยงข้อผิดพลาด
วิลเลียมแจ็คสัน

1
โปรดดูคำตอบsuperuser.com/a/734410/250287สำหรับคำสั่งประวัติ -a, -c และ -r ที่ถูกต้อง
mtd

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

10

โปรดอย่าใช้history -a; history -nมันใช้ไม่ได้ตามที่คุณคาดหวังและจะทำให้คุณมีคำสั่งที่ซ้ำซ้อนและไม่ตรงกับคำสั่งในประวัติของคุณ วิธีแก้ปัญหาที่ใช้งานได้ตามปกติคือ:

# unified bash history
shopt -s histappend
PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND$'\n'}history -a; history -c; history -r"

การใช้บรรทัดใหม่แทนเซมิโคลอนเป็นวิธีสั้น ๆ ในการจัดการกับปัญหาเซมิโคลอนที่หายไป / ซ้ำกับ PROMPT_COMMAND


ประวัติศาสตร์ -a, -c แล้ว -r ถูกต้อง ... นี้ควรจะเป็นคำตอบที่ได้รับการยอมรับ
MTD

1
exportไม่จำเป็น เนื่องจากตัวเลือกเชลล์แบบโต้ตอบควรตั้งค่า~/.bashrcซึ่งเรียกจากทุกเชลล์ย่อยดังนั้นจึงไม่จำเป็นต้องสืบทอด
dolmen

มีเหตุผลที่ดีที่จะไม่ใช้PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"แทนหรือไม่
หก

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

-1

PROMPT_COMMAND ไม่ได้ถูกกำหนดโดยค่าเริ่มต้นในบาง distros ตัวอย่างเช่นมันถูกกำหนดใน Arch แต่ไม่ใช่ใน Debian

ฉันมี bashrc ใน Dropbox ของฉันที่ฉันใช้ในขณะที่ distro กระโดดและมันรวมถึง:

PROMPT_COMMAND="$( [ '$PROMPT_COMMAND' ] && echo $PROMPT_COMMAND; )history -a; history -n"

ทางออกอันยิ่งใหญ่สำหรับปัญหาการเขียนโปรแกรมเชลล์ขั้นพื้นฐาน ทางที่ถูกต้อง:PROMPT_COMMAND="$PROMPT_COMMAND; history -a; history -n"
dolmen

ดีกว่า:PROMPT_COMMAND="$PROMPT_COMMAND"$'\n''history -a; history -n'
dolmen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.