ทุบตีบันทึกประวัติโดยไม่ต้องออก


16

ใน linux ubuntu terminal bash มีวิธีการบันทึกประวัติทุบตีโดยไม่ต้องเขียนออก? ฉันได้ตั้งค่ากำหนดเป็น "HISTCONTROL = erasedups"

ซึ่งในความคิดของฉันทำงานได้ดีกว่าการเพิกเฉย

อย่างไรก็ตามด้วยเหตุผลบางอย่างมันจะไม่บันทึกคำสั่งสองสามคำสั่งสุดท้ายในเทอร์มินัล bash ยกเว้นว่าฉันพิมพ์ใน "exit" ฉันคุ้นเคยกับการคลิกกากบาทบนหน้าต่างเทอร์มินัลดังนั้นฉันรำคาญเสมอว่าคำสั่งสุดท้ายไม่ได้รับการบันทึกเมื่อฉัน relogin

เตือนความจำ: http://www.thegeekstuff.com/2008/08/15-examples-to-master-linux-command-line-history/#more-130


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

คำตอบ:


35

ประวัติทุบตี

คำสั่งใหม่ใด ๆ ที่ใช้ในเทอร์มินัลที่ใช้งานอยู่สามารถผนวกเข้ากับ.bash_historyไฟล์ด้วยคำสั่งต่อไปนี้:

history -a

แนวคิดที่ยุ่งยากเพียงอย่างเดียวในการทำความเข้าใจคือแต่ละเทอร์มินัลมีรายการประวัติทุบตีของตัวเอง(โหลดจาก.bash_historyไฟล์เมื่อคุณเปิดเทอร์มินัล)

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

history -c;history -r

การทำเช่นนี้จะล้างรายการประวัติปัจจุบันดังนั้นเราจึงไม่ได้รับรายการซ้ำและผนวกไฟล์ประวัติเข้ากับรายการ (ว่างเปล่าตอนนี้)

วิธีการแก้

คุณสามารถใช้ตัวแปร bash PROMPT_COMMANDเพื่อออกคำสั่งด้วยพรอมต์ใหม่แต่ละครั้ง (ทุกครั้งที่คุณกด Enter ในเทอร์มินัล)

export PROMPT_COMMAND='history -a'

การทำเช่นนี้จะบันทึกแต่ละคำสั่งไปยังไฟล์ประวัติตามที่ออก

ผลลัพธ์

ตอนนี้เทอร์มินัลใหม่ที่คุณเปิดจะมีประวัติของเทอร์มินัลอื่นโดยไม่ต้องไปexitที่เทอร์มินัลอื่น นี่คือขั้นตอนการทำงานที่ฉันต้องการ

แม่นยำยิ่งขึ้น

สมมติว่า (ด้วยเหตุผลบางอย่าง) คุณมีสองเทอร์มินัลที่คุณใช้พร้อมกันและคุณต้องการให้ประวัติสะท้อนระหว่างทั้งสองสำหรับแต่ละคำสั่งใหม่

export PROMPT_COMMAND='history -a;history -c;history -r'

ข้อเสียเปรียบหลักที่นี่คือคุณอาจต้องกด Enter เพื่อเรียกใช้ PROMPT_COMMAND อีกครั้งเพื่อรับประวัติล่าสุดจากเทอร์มินัลฝั่งตรงข้าม

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


นี่มันยอดเยี่ยมมากสำหรับเวิร์กโฟลว์ที่เหมาะสม ....
แมตต์

2

ในการบันทึกประวัติทุบตีไปยังไฟล์:

history -w ~/history.txt
vim ~/history.txt

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

คัดลอกคำตอบจากhttp://tech.karbassi.com/2007/01/14/view-and-change-bash-history/


1

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

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

สคริปต์ที่ให้ไว้ที่นี่จะใช้กลอุบาย

# don't put duplicate lines in the history. See bash(1) for more options
# ... and ignore same sucessive entries.
export HISTCONTROL=ignoreboth

# set the time format for the history file.
export HISTTIMEFORMAT="%Y.%m.%d %H:%M:%S "

# If this is an xterm set the title to user@host:dir
case "$TERM" in
  xterm*|rxvt*)
  # Show the currently running command in the terminal title:
  # http://www.davidpashley.com/articles/xterm-titles-with-bash.html
  show_command_in_title_bar()
  {
    case "$BASH_COMMAND" in
      *\033]0*)
      # The command is trying to set the title bar as well;
      # this is most likely the execution of $PROMPT_COMMAND.
      # In any case nested escapes confuse the terminal, so don't
      # output them.
      ;;
      *)
      if test ! "$BASH_COMMAND" = "log_bash_eternal_history"
      then
        echo -ne "\033]0;$(history 1 | sed 's/^ *[0-9]* *//') :: ${PWD} :: ${USER}@${HOSTNAME}\007"
      fi
      ;;
    esac
  }
  trap show_command_in_title_bar DEBUG
  ;;
  *)
  ;;
esac

log_bash_eternal_history()
{
  local rc=$?
  [[ $(history 1) =~ ^\ *[0-9]+\ +([^\ ]+\ [^\ ]+)\ +(.*)$ ]]
  local date_part="${BASH_REMATCH[1]}"
  local command_part="${BASH_REMATCH[2]}"
  if [ "$command_part" != "$ETERNAL_HISTORY_LAST" -a "$command_part" != "ls" -a "$command_part" != "ll" ]
  then
    echo $date_part $HOSTNAME $rc "$command_part" >> ~/.bash_eternal_history
    export ETERNAL_HISTORY_LAST="$command_part"
  fi
}

PROMPT_COMMAND="log_bash_eternal_history"

เพื่อบอกคำสั่งประวัติ "บันทึกตอนนี้!" เมื่อคลิก X บนหน้าต่างเทอร์มินัลเสมือน

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

มีไม่กี่ตัวเลือกนี้และทั้งหมดของพวกเขาเกี่ยวข้องกับสัญญาณยูนิกซ์

  • SIGTERM, SIGINT, SIGQUIT: พฤติกรรมเริ่มต้นเมื่อ Bash ได้รับหนึ่งในสัญญาณเหล่านี้ในโหมดการโต้ตอบคือการละเว้นมันดังนั้นจึงอาจไม่เป็นเช่นนั้น

  • SIGHUP: สัญญาณนี้โดยปกติจะทำให้ Bash ยุติลงอย่างสง่างามและทำการล้างข้อมูล แต่ฉันไม่แน่ใจว่า "การล้างข้อมูล" นั้นเกี่ยวข้องกับการบันทึกไฟล์ประวัติหรือไม่ มันอาจจะไม่

  • SIGKILL, SIGSTOP: เป็นไปไม่ได้ที่ Bash จะเป็นกระบวนการผู้ใช้งานที่จะไม่สนใจสัญญาณเหล่านี้ เคอร์เนลสามารถบังคับให้ฆ่าหรือหยุดกระบวนการได้ตลอดเวลาโดยใช้สัญญาณเหล่านี้ หาก VT อีมูเลเตอร์ของคุณกำลังส่งหนึ่งในนั้นเราไม่สามารถดักจับมันและทำอะไรบางอย่างก่อนออกเพื่อให้คุณโชคดี

การอ้างอิงบางอย่าง: คำถาม ServerFault 337123

คำถาม Unix 6332

การใช้ประวัติโต้ตอบในคู่มือทุบตี GNU

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