Hành vi lịch sử bash lạ khi chạy nhiều phiên


15

Lịch sử dòng lệnh được lưu trữ như thế nào khi tôi sử dụng nhiều cửa sổ đầu cuối? Tôi biết nó được lưu trữ trong .bash_historynhưng tôi không thể thấy logic về lịch sử được sử dụng nếu tôi mở cửa sổ mới. Nó gần như cảm thấy không đặc biệt theo một nghĩa mà tôi không bao giờ biết tôi sẽ thấy lệnh nào nếu tôi cố gắng sử dụng mũi tên lên trong cửa sổ mới.

Ai đó có thể giải thích điều này?

Có cách nào để kiểm soát lịch sử theo cách mà tôi có thể sử dụng lại lịch sử từ cửa sổ cụ thể không?

Câu trả lời:


14

Để hiểu hành vi của lịch sử bash trước tiên bạn phải biết những điều sau:

  1. Có lịch sử trong tập tin lịch sử.
  2. Có lịch sử trong bộ nhớ của một quá trình bash.
  3. Lịch sử trong bộ nhớ của một quá trình bash không được đồng bộ hóa với lịch sử trong bộ nhớ của bất kỳ quy trình bash nào khác.
  4. Lịch sử trong bộ nhớ của quá trình bash không được đồng bộ hóa với lịch sử trong tệp, trừ khi được yêu cầu rõ ràng hoặc trong một số sự kiện cụ thể (xem bên dưới).

Sử dụng các cài đặt mặc định, vòng đời của phiên bash liên quan đến lịch sử như sau:

  1. Trong quá trình khởi động bash sẽ đọc tệp lịch sử. Nội dung của tệp lịch sử hiện nằm trong bộ nhớ của quá trình bash.
  2. Trong quá trình sử dụng bình thường, chỉ có lịch sử trong bộ nhớ bị thao túng.
  3. Trong khi tắt máy, lịch sử trong bộ nhớ được ghi vào tệp lịch sử, ghi đè bất kỳ nội dung nào trước đó của tệp lịch sử.

Hành vi dường như không xác định mà bạn đã quan sát chủ yếu là do nội dung của tệp lịch sử luôn là lịch sử của phiên bash đóng cuối cùng và bash chỉ đọc tệp lịch sử trong khi khởi động.

Đọc hướng dẫn bash để được giải thích chi tiết hơn về quá trình khởi động và tắt máy.

Lưu ý rằng với cài đặt mặc định, tôi có nghĩa là cài đặt mặc định từ bash. Phân phối của bạn có thể đã cung cấp .bashrc(hoặc /etc/bash.bashrc) thay đổi hành vi này.

Bằng cách kích hoạt tùy chọn shell, histappendbạn có thể yêu cầu bash nối thêm thay vì ghi đè tệp lịch sử. Bạn có thể kích hoạt histappendbằng cách sử dụng lệnh shopt -s histappend. Để tùy chọn này luôn được bật, bạn phải đặt lệnh trong .bashrc(hoặc tệp khởi tạo khác). Đọc thêm về shoptlệnh trong hướng dẫn bash

Lưu ý rằng việc kích hoạt histappendsẽ không làm giảm nhiều hành vi dường như không xác định. Điều này là do mỗi phiên bash vẫn có lịch sử riêng trong bộ nhớ. Có thể có một lịch sử bash chủ yếu được đồng bộ hóa. Có một hướng dẫn làm thế nào để có được mọi quy trình bash để có một lịch sử được đồng bộ hóa chủ yếu trong một luồng trên tràn ngăn xếp .

bằng cách sử dụng lệnh dựng sẵn, historybạn có thể nói rõ ràng bash để đọc lịch sử từ tệp này sang bộ nhớ hoặc ghi từ bộ nhớ vào tệp. Ví dụ: history -rsẽ đọc nội dung của tệp và nối nó vào lịch sử trong bộ nhớ. history -wsẽ ghi lịch sử hiện tại từ bộ nhớ vào tập tin, ghi đè nội dung trước đó. Đây là cơ bản những gì xảy ra trong khi tắt máy. Đọc thêm về historylệnh trong hướng dẫn bash

Để hoàn thiện ở đây là danh sách các biến nội bộ sửa đổi hành vi lịch sử:

  • HISTFILE: tập tin để đọc và ghi lịch sử vào.
  • HISTFILESIZE: số dòng tối đa cho tệp lịch sử.
  • HISTSIZE: số dòng tối đa cho lịch sử trong bộ nhớ.
  • HISTCONTROL, HISTIGNORE, HISTTIMEFORMAT: Không có liên quan để thảo luận này. Đọc hướng dẫn sử dụng bash để biết chi tiết.

Lời giải thích hay. Bạn đã đề cập đến việc tắt máy, nhưng còn việc giết phiên cuối thì sao? Phiên có thể bị hủy qua đăng xuất hoặc qua UI hoặc thông qua một số phương tiện khác như mất kết nối mạng. Nếu toàn bộ tệp lịch sử được thay thế và bạn có nhiều phiên, bạn có nói rằng lịch sử từ lần đóng cuối cùng sẽ được sử dụng trong tệp lịch sử không? Điều đó có thể giải thích hành vi không xác định.
Alex Gitelman

điểm vòng đời (3) không đúng. Có vẻ như chỉ có phiên bash đầu tiên sẽ ghi vào tệp lịch sử. Kiểm tra: Mở 2 phiên theo thứ tự- a, b. Làm 'echo hello' trong b . Sau đó thoát trong b . Sau đó mở một phiên mới c . Phiên này sẽ không có tiếng vang xin chào trong lịch sử của nó.
dùng606723

@AlexGitelman: nếu một quá trình bash bị giết thì nó sẽ không có cơ hội ghi đè lên tệp lịch sử. và vâng, lịch sử từ phiên đóng cửa cuối cùng là lịch sử sẽ có trong tệp lịch sử.
lesmana

@ user606723: điểm 3 là chính xác. đọc hướng dẫn bash. thử nghiệm lại bằng cách sử dụng một .bashrctệp tối thiểu . lưu ý rằng phân phối của bạn có thể đã thay đổi một số cài đặt trong /etc/bash.bashrc. kiểm tra cụ thể cho các tùy chọn vỏ histappend.
lesmana


0

AFAIK, các lệnh bash được lưu sau khi phiên SSH kết thúc. Vì vậy, các lệnh không được lưu khi phiên kết thúc bất thường (ví dụ: do lỗi mạng). Tôi đang nói ở đây về các phiên SSH. Các thiết bị đầu cuối địa phương có thể sử dụng phương pháp tương tự.

Khi mở nhiều phiên cùng một lúc, các lệnh được gõ trên một phiên không được nhìn thấy trên phiên khác trong khi cả hai đều hoạt động. Tuy nhiên, bạn sẽ thấy các lệnh này khi bạn kết thúc phiên mở lại.


Đây không phải là hành vi tôi đã trải qua. Tôi có thể xác nhận điều này bằng cách thực hiện một bài kiểm tra nhanh trong đó tôi mở một phiên ssh, thực hiện một lệnh và thực hiện một lối thoát duyên dáng. Trong trường hợp này, tôi đã có một phiên ssh hoạt động trước đó. Trong phiên bash có sẵn này, tôi kiểm tra .bash_history và không tìm thấy gì được ghi lại. Tôi thấy có khả năng phiên bash đầu tiên đang chạy là phiên duy nhất kết thúc ghi vào .bash_history.
dùng606723

Việc chấm dứt phiên của bạn sẽ không ảnh hưởng đến các phiên hiện đang chạy, nhưng nó sẽ ảnh hưởng đến các phiên mới!
Khaled

Điều gì xảy ra nếu đó không phải là SSH mà là cửa sổ đầu cuối Gnome mà tôi đóng thông qua UI?
Alex Gitelman

Nó cần phải được xác minh. Hiện tại, tôi không có quyền truy cập vào thiết bị đầu cuối Gnome!
Khaled

@Khaled, Đã kiểm tra nó, không ảnh hưởng đến các phiên mới. (Tôi đã kiểm tra .bash_history trước anyways, đó là nơi bash được lịch sử lệnh cho các phiên mới, tôi rất biết nó wouldn; t làm việc, nhưng tôi humour'ed bạn anyway.)
user606723
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.