Tại sao Mac Terminal nhớ hai lệnh liên tiếp khi chúng giống nhau?


10

Tôi đã bắt đầu sử dụng Mac gần đây và trước khi tôi sử dụng Ubuntu.

Giả sử tôi chạy từng lệnh một trên thiết bị đầu cuối của mình:

python3 main.py
python3 main2.py
python3 main2.py
python3 main2.py
python3 main2.py
python3 main2.py
python3 main2.py

Bây giờ giả sử tôi muốn chạy python main.pylại, vì vậy tôi sẽ nhấp vào phím lên. Tôi sẽ chỉ cần bấm phím lên hai lần trên Ubuntu nhưng 7 lần trên Mac.

Nếu hai lệnh liên tiếp giống nhau, thì terminal chỉ nên nhớ một lệnh thay vì nhớ hai lệnh khác nhau.

Làm thế nào tôi có thể làm điều này xảy ra trên macOS?


6
Chỉ cần mô phạm, nó không thực sự là thiết bị đầu cuối mac đang làm điều này. Đó là bash, vỏ của bạn chạy trong thiết bị đầu cuối. Có nhiều shell và nó có thể và phổ biến để thay thế shell mặc định bằng một cái gì đó khác zshvà thậm chí xa hơn để tùy chỉnh zsh với các tập lệnh khác nhau.
gman

Câu trả lời:


13

Bạn cần thêm biến môi trường HISTCONTROL vào .bash_profile. Trong dòng của bạn .bash_profilethêm dòng sau:

export HISTCONTROL=ignoreboth:erasedups

Đóng và khởi động lại phiên bash của bạn và các bản sao sẽ biến mất. Ngoài ra, bạn chỉ có thể thực hiện cùng một dòng và nó sẽ có hiệu lực cho phiên đó (sử dụng nó để kiểm tra).


Từ trang hướng dẫn chobash (trong Terminal):

HISTCONTROL
Một danh sách các giá trị được phân tách bằng dấu hai chấm kiểm soát cách các lệnh được lưu trong danh sách lịch sử. Nếu danh sách các giá trị bao gồm ignorespace , dòng bắt đầu bằng một nhân vật không gian sẽ không được lưu trong danh sách lịch sử. Giá trị bỏ qua khiến các dòng khớp với mục lịch sử trước đó không được lưu. Một giá trị của ignoreboth là viết tắt cho ignorespaceignoredups . Giá trị bị xóa khiến tất cả các dòng trước khớp với dòng hiện tại bị xóa khỏi danh sách lịch sử trước khi dòng đó được lưu. Bất kỳ giá trị không có trong danh sách trên được bỏ qua. Nếu HISTCONTROLkhông được đặt hoặc không bao gồm giá trị hợp lệ, tất cả các dòng được đọc bởi trình phân tích cú pháp shell được lưu trong danh sách lịch sử, tuân theo giá trị của HISTIGNORE . Các dòng thứ hai và tiếp theo của lệnh ghép nhiều dòng không được kiểm tra và được thêm vào lịch sử bất kể giá trị của HISTCONTROL .


4

Lý do tại sao điều này xảy ra?

MacOS và Ubuntu được cấu hình khác nhau ngoài hộp để xử lý các bản sao trong lịch sử lệnh của bash. Các cấu hình này được lưu trữ trong một số cái gọi là " tệp chấm ". Chúng có dạng ~ / .bash * cũng như hệ thống rộng / etc / profile. Tất cả các tệp này có thể được tùy chỉnh theo ý thích của bạn và phân biệt giữa các vỏ tương tác, vỏ đăng nhập, vỏ từ xa, vv Các tệp này được đọc theo thứ tự cụ thể và phục vụ các chức năng cụ thể.

Làm thế nào để có được hành vi tương tự trên macOS?

Nếu bạn chỉ muốn cái này, một tùy chỉnh duy nhất là "bỏ qua các bản sao chính xác của dòng lệnh", bạn có thể đi với một cái gì đó giống như câu trả lời của Allan, tức là thêm một dòng duy nhất vào ví dụ tệp bash_profile của bạn. Không có "cách thích hợp" nhưng vô số lựa chọn.

Trong trường hợp đây không phải là tùy chỉnh duy nhất cho bash của bạn thì đây thể không phải là lựa chọn tốt nhất:

Một vài lưu ý khác:

  • Bất cứ điều gì nên có sẵn cho các ứng dụng đồ họa HOẶC để sh (hoặc bash được gọi là sh) PHẢI nằm trong ~ / .profile
  • ~ / .bashrc không được xuất bất cứ thứ gì
  • Bất cứ thứ gì chỉ có sẵn để đăng nhập shell nên vào ~ / .profile
  • Đảm bảo rằng ~ / .bash_login không tồn tại.

Điều đó có nghĩa, khi mọi thứ trở nên phức tạp hơn nó là ý tưởng tốt để lây lan ra các tùy biến thành nhiều file, mỗi người trong số họ chuyên và trật tự cao trong nội dung của họ:

Tất cả exportscó thể nằm trong tập tin riêng của họ để giám sát đơn giản hóa.

Tạo một tệp được đọc bằng bash ở thư mục gốc của thư mục người dùng của bạn, ví dụ như được gọi .exportscó chứa:

# Omit duplicates and commands that begin with a space from history.
export HISTCONTROL='ignoreboth'; 

Điều này cần phải được "có nguồn gốc" để tập tin được đọc bằng bash khi khởi động tương tác:

Tìm nguồn cung cấp tệp
Nếu bạn có nhiều cấu hình shell, bạn có thể muốn tách chúng thành nhiều tệp con và sử dụng nguồn dựng sẵn để tải chúng từ .bashrc: bằng cách thêm source ~/.exportsvào nó.

Ngoài ra, để đảm bảo các tệp thực sự tồn tại trước khi tải

if [ -f ~/.exports ]; then
. ~/.exports
fi

Lệnh . ~/.exportssẽ nguồn ~/.exportstrong bối cảnh của shell hiện đang chạy.

Điều này đặc biệt hữu ích để thêm bí danh, tệp riêng biệt giúp tải lại chúng dễ dàng hơn khi bạn thực hiện thay đổi.


2
Làm thế nào để .exportscó được đọc (nguồn gốc)?
fd0

1
@ fd0, Chính nó, nó không có nguồn gốc trong macOS. Câu trả lời của Allan là một cách thích hợp để đạt được điều này.
dùng3439894

Nếu giá trị của HISTCONTROLđược thiết lập trong .bashrc~/.bashrccó nguồn gốc ở ~/.bash_profilethì không có nhu cầu để exportcác HISTCONTROLbiến. Cả shell đăng nhập tương tác và shell tương tác sẽ có bộ biến.
fd0

@ fd0 Chính xác: nếu . . Điểm cuối cùng của bạn có phải là một gợi ý để thêm hoặc có nghĩa là một sự điều chỉnh khi bạn có thể coi phương pháp trên là 'sai' không? Bây giờ, tôi đọc bình luận của bạn như giữa tôi và Allan về mức độ phức tạp được giải quyết?
LаngLаngС

1

Để đơn phương ghi lại mọi lệnh mới là khó khăn. Đầu tiên bạn cần thêm ~/.profilehoặc tương tự:

HISTCONTROL=erasedups
PROMPT_COMMAND='history -w'

Sau đó, bạn cần thêm vào ~/.bash_logout:

history -a
history -w
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.