Lịch sử Bash không được bảo tồn giữa các phiên thiết bị đầu cuối trên máy Mac


33

Lịch sử bash của tôi đã ngừng hoạt động một cách bí ẩn, và tôi không biết làm thế nào để sửa nó. Đây là .bashrc của tôi trông như thế nào:

HISTSIZE=500
HISTFILESIZE=500
HISTFILE=$HOME/.bash_history

Tuy nhiên, khi tôi chạy echo $HISTFILEnó in ra /Users/myusername/.bash_sessions/EE8689E5-7DAD-4018-817E-0AF1DE36082A.historynew.

Tôi là chủ sở hữu của tệp .bash_history, vì vậy tôi không chắc chắn về cách tôi sẽ khắc phục vấn đề này.

Cảm ơn!


Xin chào Nelson, chào mừng bạn đến với Siêu người dùng. Kiểm tra nhanh - có phải những chỗ đó được bạn chèn vào không?
bertieb

vâng, họ sẽ loại bỏ chúng và báo cáo lại.

@bertieb, tôi đã xóa các khoảng trắng và bây giờ $ HISTFILESIZE đúng là echo'd. Tuy nhiên, lịch sử vẫn chưa được lưu và $ HISTFILE in ra tệp lịch sử tạm thời kỳ lạ đó (mà tôi giả sử lưu trữ lịch sử cho phiên đó).

Bạn đang cố gắng thay đổi $HISTFILE, không quan tâm? Tôi không có .bashrcOSX và echo $HISTFILEbáo cáo địa điểm mà tôi mong đợi - việc bình luận các dòng trong câu hỏi có ảnh hưởng gì không?
bertieb

1
Luôn trích dẫn mở rộng biến tên đường dẫn : HISTFILE="$HOME/.bash_history”. Nếu không có dấu ngoặc kép, phiên bản của bạn sẽ không hợp lệ nếu đường dẫn đến thư mục chính của bạn chứa khoảng trắng (hoặc có thể là các ký tự đặc biệt khác).
Chris Trang

Câu trả lời:


26

Terminal gán cho mỗi phiên thiết bị đầu cuối một mã định danh duy nhất và truyền thông qua biến môi trường TERM_SESSION_ID để các chương trình đang chạy trong thiết bị đầu cuối có thể lưu / khôi phục trạng thái dành riêng cho ứng dụng khi thoát và khởi động lại Terminal khi bật Resume.

Một thư mục mới (~ / .bash_simes /) được sử dụng để lưu trữ các tệp HISTFILE và .session duy nhất cho các phiên.

Trong quá trình khởi động shell, tệp phiên được thực thi. Các tập tin cũ được định kỳ xóa.

Hành vi mặc định sắp xếp để lưu và khôi phục lịch sử lệnh bash một cách độc lập cho mỗi phiên cuối được khôi phục. Nó cũng hợp nhất các lệnh vào lịch sử toàn cầu cho các phiên mới.

Bạn có thể vô hiệu hóa hành vi này và chia sẻ một lịch sử bằng cách cài đặt

export SHELL_SESSION_HISTORY=0

Nếu HISTTIMEFORMAT được xác định, lịch sử mỗi phiên bị tắt theo mặc định (đọc thêm trong / private / etc / bashrc_Apple_Terminal)

Cơ chế lưu / khôi phục bị vô hiệu hóa nếu tồn tại tệp sau:

~/.bash_sessions_disable

Apple đã thay đổi một số hành vi kể từ khi phát hành El Capitan, vì vậy tốt hơn là nên đọc thêm về điều này tại đây less /private/etc/bashrc_Apple_Terminal


3
Nhưng đừng chỉ bắt đầu bằng cách vô hiệu hóa cơ chế lưu / khôi phục. Nếu bạn gặp vấn đề với lịch sử lệnh shell, hãy thử giải quyết vấn đề đó. Các ~/.bash_sessions_disabletập tin có nghĩa là một phương sách cuối cùng trong trường hợp có một vấn đề không thể được giải quyết cụ thể. Nó vô hiệu hóa nhiều hơn lịch sử lệnh mỗi phiên và bạn chỉ có thể vô hiệu hóa lịch sử lệnh mỗi phiên. Xem các ý kiến /etc/bashrc_Apple_Terminalđể biết chi tiết.
Chris Trang

1
@ChrisPage Thật ra Apple đã thay đổi một số đoạn script. Cập nhật câu trả lời, cảm ơn.
diimdeep

@diimdeep Tôi sẽ nối dòng này ở đâu? export SHELL_SESSION_HISTORY=0
zerohedge

@zerohedge .bashrc.bash_profile unix.stackexchange.com/a/310150/15362
diimdeep

@diimdeep Cảm ơn bạn. Điều này dường như đang làm việc ngay bây giờ. Nó có bất kỳ phân nhánh?
zerohedge

6

Tôi nhận thấy một cái gì đó tương tự sau khi nâng cấp El Capitan. Chỉ cần thêm tệp .bash_sessions_disabletệp trong thư mục chính của bạn sẽ vô hiệu hóa các phiên bash mới và .bash_historysử dụng lại.

Chủ đề Reddit này có thêm thông tin và liên kết hơn nữa.


Nhưng đừng chỉ bắt đầu bằng cách vô hiệu hóa cơ chế lưu / khôi phục. Nếu bạn gặp vấn đề với lịch sử lệnh shell, hãy thử giải quyết vấn đề đó. Các ~/.bash_sessions_disabletập tin có nghĩa là một phương sách cuối cùng trong trường hợp có một vấn đề không thể được giải quyết cụ thể. Nó vô hiệu hóa nhiều hơn lịch sử lệnh mỗi phiên và bạn chỉ có thể vô hiệu hóa lịch sử lệnh mỗi phiên. Xem các ý kiến /etc/bashrc_Apple_Terminalđể biết chi tiết.
Chris Trang

Cảm ơn Chris - những gì nó vô hiệu hóa lịch sử của tôi đã hoạt động như mong đợi (giống như phiên bản osx trước đó và giống như linux) trong vài tháng qua. Không biết tại sao họ thay đổi nó?
rab

@rabs Tôi khuyên bạn nên thêm SHELL_SESSION_HISTORY=0ở đầu ~/.bash_profile.
Teejay

5

Bạn có thể giải quyết vấn đề RVM bằng cách cập nhật lên phiên bản RVM mới nhất hoặc thực hiện điều này:

  echo 'shell_session_update' > $HOME/.bash_logout

Xem https://github.com/rvm/rvm/issues35340 để biết thêm thông tin.


1
Sửa chữa tốt, mà không phải sửa đổi rvm.
mlo55

1
Có phải chúng ta đang nói về Ruby enVironment Manager (RVM) rvm.io ?? Khi nào và tại sao điều đó nên tham gia?
MarkHu

3

Câu trả lời này từ chuỗi Reddit đã cứu tôi:

Có lẽ RVM ngăn lối ra "hook" để bash_simes chạy. Nếu bạn nhận xét dòng sau trong .bash_profile của bạn, nó sẽ hoạt động.

[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"

Điều này thực sự đã giúp!
Karsten

1

Nếu đó là máy Mac, tôi cho rằng vỏ đăng nhập mặc định là bashvà nó chạy .profilethay vì .bashrc. Vì vậy, bạn đã chỉnh sửa các tập tin sai.


Tôi đã chỉnh sửa .profile để nó giống với .bashrc của tôi và lịch sử vẫn chưa xuất hiện.

@NelsonLiu Điều gì xảy ra khi bạn lặp lại $HISTFILEở các phần khác nhau của profile? Có lẽ bạn nguồn kịch bản khác thay đổi biến? Tôi đã kiểm tra cả hai TerminaliTerm, bash 34 cả hai đều có mặc định của họ $HOME/.bash_history.
theoden

Làm thế nào tôi có thể lặp lại $ HISTFILE trong các phần khác nhau của hồ sơ?

@NelsonLiu, không rõ ràng sao? Mục tiêu của bạn là theo dõi khi nào $HISTFILEthay đổi. Vì vậy, chỉ cần làm cho hai echo $HISTFILEbao quanh mã của bạn. Những gì bạn phải làm là tìm đoạn mã $HISTFILEthay đổi bằng cách di chuyển cả hai echo $HISTFILEdòng gần hơn và gần nhau hơn cho đến khi một cái gì đó lộ ra. Đó là tất cả.
theoden 8/8/2015

1
Vì vậy, tôi đã làm như bạn đã hướng dẫn và thực hiện .bash_profile giống như hồ sơ. Tôi quyết định echo $HISTFILEtrên mỗi dòng, chỉ để xem nếu có bất kỳ sự khác biệt. Tuy nhiên, nó chỉ đơn thuần là in /Users/username/.bash_historyvô số lần. Sau đó tôi chạy echo $HISTFILEtrong vỏ, và nó xuất ra /Users/nelsonliu/.bash_sessions/CD275A29-1DF1-4ED8-B8CE-F706B11B812F.historynew.

0

Tôi đã nhìn thấy vấn đề này trên High Sierra. Bằng cách nào đó, .bash_history của riêng tôi đã được sở hữu bởi root và thậm chí không có quyền đọc cho người dùng khác (khi nội dung của thư mục chính được xem với ls -al)

Không có bất kỳ hậu quả nào trong tệp .bash_history này, vì vậy tôi đã thực hiện một sudo rm .bash_history theo sau là một cú chạm .bash_history để tạo một cái mới.

Bây giờ tất cả có vẻ tốt


Đối với tôi, đó không phải là quyền của tập tin, đó là tôi đã không xác định bất kỳ biến kiểm soát HIST nào. Rõ ràng một hoặc nhiều trong số họ phải được xác định. Tôi đã thêm nó vào ~/.bash_profiletập tin của mình :export HISTTIMEFORMAT='%F %T '
MarkHu
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.