Tonin đã chỉ ra một lỗi trong lời nhắc mặc định của tôi . Ví dụ tối thiểu:
Đặt PS1:
PS1='$(exit_code=$?; [[ $exit_code -eq 0 ]] || printf %s $(tput setaf 1) $exit_code $(tput sgr0) " ")$ '
Tại thời điểm này, lời nhắc trông như thế này:
$
Bây giờ kích hoạt đầu ra mã thoát bằng cách chạy:
false
Bây giờ lời nhắc chứa mã thoát màu đỏ ở đầu dòng:
1 $
- Nhấn Ctrl- r.
Nhập "sai". Bây giờ lời nhắc chỉ chứa tìm kiếm:
(reverse-i-search)`false': false
- Nhấn Enter.
Lịch sử thiết bị đầu cuối kết quả hiện có chứa như sau:
1 $ch)`false': false
Sản lượng dự kiến:
1 $ false
Đó là, có vẻ như đầu ra tìm kiếm lịch sử được trộn lẫn với dấu nhắc và ẩn lệnh thực tế đã được chạy.
Tôi đã thử làm việc xung quanh điều này bằng cách sử dụngPROMPT_COMMAND
:
set_exit_code() {
exit_code=$?
[[ $exit_code -eq 0 ]] || printf %s $(tput setaf 1) $exit_code $(tput sgr0) " "
}
set_bash_prompt() {
PS1='$(set_exit_code)$ ' # Double quotes give the same result
}
PROMPT_COMMAND=set_bash_prompt
Điều này dường như không hoạt động - dòng trông giống hệt như trước khi tìm kiếm và chạy.
Làm thế nào tôi có thể sửa lỗi này?