bash lưu lịch sử mà không thoát


16

trong thiết bị đầu cuối bash linux linux. Có cách nào để lưu lịch sử bash mà không cần viết thoát? Tôi đã đặt cấu hình thành "HISTCONTROL = erasingups"

mà theo tôi làm việc tốt hơn bỏ qua.

Dù sao đi nữa, vì một số lý do, nó sẽ không lưu một vài lệnh cuối cùng trong thiết bị đầu cuối bash trừ khi tôi gõ "exit". Tôi đã từng chỉ nhấp vào chữ thập trên cửa sổ terminal, vì vậy tôi luôn cảm thấy khó chịu vì các lệnh cuối cùng không được lưu khi tôi đăng nhập lại.

nhắc nhở: http : //www.thegeek ware.com/2008/08/15-examples-to-master-linux-command-line-history/#more-130


khi truy cập từ xa vào terminal từ putty, có tùy chọn chọn đóng cửa sổ khi thoát: luôn luôn. mà lưu lịch sử cho tôi.
ColacX

Câu trả lời:


34

Lịch sử Bash

Bất kỳ lệnh mới nào đã được ban hành trong thiết bị đầu cuối hoạt động có thể được thêm vào .bash_historytệp bằng lệnh sau:

history -a

Khái niệm khó hiểu duy nhất là mỗi thiết bị đầu cuối có danh sách lịch sử bash riêng (được tải từ .bash_historytệp khi bạn mở thiết bị đầu cuối)

Nếu bạn muốn kéo bất kỳ lịch sử mới nào được ghi bởi các thiết bị đầu cuối khác trong suốt vòng đời của thiết bị hoạt động này, bạn có thể nối các nội dung của .bash_history tệp vào danh sách lịch sử bash đang hoạt động

history -c;history -r

Điều này sẽ xóa danh sách lịch sử hiện tại để chúng tôi không nhận được danh sách lặp lại và nối thêm tệp lịch sử vào danh sách (hiện trống).

Giải pháp

Bạn có thể sử dụng biến bash PROMPT_COMMANDđể ra lệnh với mỗi dấu nhắc mới (mỗi lần bạn nhấn enter trong terminal)

export PROMPT_COMMAND='history -a'

Điều này sẽ ghi lại từng lệnh vào tệp lịch sử khi nó được ban hành.

Kết quả

Bây giờ bất kỳ thiết bị đầu cuối mới nào bạn mở sẽ có lịch sử của các thiết bị đầu cuối khác mà không cần phải đến exitcác thiết bị đầu cuối khác. Đây là quy trình làm việc ưa thích của tôi.

Chính xác hơn

Giả sử (vì một số lý do) bạn có hai thiết bị đầu cuối đang sử dụng đồng thời và bạn muốn lịch sử phản ánh giữa cả hai cho mỗi lệnh mới.

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

Hạn chế chính ở đây là bạn có thể cần nhấn enter để chạy lại PROMPT_COMMAND để có được lịch sử mới nhất từ ​​thiết bị đầu cuối đối diện.

Bạn có thể thấy tại sao tùy chọn chính xác hơn này có thể là quá mức cần thiết, nhưng nó hoạt động cho trường hợp sử dụng đó.


điều này thật tuyệt vời cho quy trình làm việc phù hợp ....
matt


1

một cách để tiết kiệm tất cả lịch sử bash của bạn vào một tập tin riêng biệt , nhưng nếu bạn đang cố gắng sử dụng cơ chế lịch sử và vì một lý do nó không được tiết kiệm tất cả lịch sử của mình, đó là một vấn đề khác nhau.

Để lưu tất cả lịch sử của bạn vào một tệp riêng biệt, luôn luôn, bất kể điều gì xảy ra với thiết bị đầu cuối

Một kịch bản được cung cấp ở đây thực hiện các mẹo.

# 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"

Để nói lệnh lịch sử "Lưu ngay!" khi nhấp vào X trên cửa sổ thiết bị đầu cuối ảo

Đầu tiên, những gì bạn phải hiểu là, trình giả lập thiết bị đầu cuối ảo của bạn sử dụng cơ chế nào để giết bashquá trình khi nó thoát? - Điều này sẽ phụ thuộc vào trình giả lập thiết bị đầu cuối chính xác mà bạn đang sử dụng.

Có một vài lựa chọn và tất cả chúng đều liên quan đến tín hiệu UNIX .

  • SIGTERM, SIGINT, SIGQUIT: Hành vi mặc định khi Bash nhận được một trong những tín hiệu này trong chế độ tương tác là bỏ qua nó, vì vậy có lẽ không phải vậy.

  • SIGHUP: Tín hiệu này thường khiến Bash chấm dứt một cách duyên dáng và dọn dẹp, nhưng tôi không chắc việc "dọn dẹp" đó có liên quan đến việc lưu tệp lịch sử hay không. Có lẽ là không.

  • SIGKILL, SIGSTOP: Bash là một quá trình không gian người dùng để bỏ qua các tín hiệu này. Hạt nhân có thể buộc giết hoặc dừng quá trình bất cứ lúc nào bằng cách sử dụng các tín hiệu này. Nếu trình giả lập VT của bạn đang gửi một trong số này, chúng tôi không thể bẫy nó và làm điều gì đó trước khi thoát, vì vậy bạn không gặp may.

Một vài tài liệu tham khảo: Câu hỏi ServerFault 337123

Câu hỏi Unix 6332

Sử dụng Lịch sử Tương tác trong hướng dẫn GNU Bash

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.