Tại sao lời nhắc bash của tôi không cập nhật?


83

Tôi mới sử dụng git và tôi đang cố gắng thêm nhánh git hiện tại vào lời nhắc đã có của mình, được định nghĩa như sau:

RESET="\[\017\]"
NORMAL="\[\033[0m\]"
RED="\[\033[31;1m\]"
YELLOW="\[\033[33;1m\]"
WHITE="\[\033[37;1m\]"
SMILEY="${WHITE}:)${NORMAL}"
FROWNY="${RED}:(${NORMAL}"
SELECT="if [ \$? = 0 ]; then echo \"${SMILEY}\"; else echo \"${FROWNY}\"; fi"

export PS1="${RESET}${YELLOW}\u@\h${NORMAL} \`${SELECT}\` ${YELLOW}\w $(__git_ps1) >${NORMAL} "

Tôi đã thử nó (bằng cách tìm nguồn cung cấp .bashrclại tệp của tôi ) và nó có vẻ hoạt động, nhưng sau đó tôi chuyển sang nhánh khác và nó không cập nhật. Làm cách nào để đảm bảo rằng $(__git_ps1)tệp không được lưu trong bộ nhớ cache?


14
Tôi thích ý tưởng của việc có :):(trong cửa sổ tùy thuộc vào việc các lệnh cuối cùng thất bại :) bạn
Đánh dấu Longair

@Mark Longair: Tôi tìm thấy nó ở đây: serverfault.com/questions/4889/… BTW, tại sao bạn lại xóa giải pháp của mình, nó cũng hoạt động!
greg0ire

đó là phút sau hơn hai người kia, và ít gọn gàng hơn @ geekosaur ấy nào
Đánh dấu Longair

1
Cảm ơn bạn rất nhiều vì đã đặt câu hỏi chính xác này (và tất nhiên, geekosaur cho câu trả lời của anh ấy)! Tôi đã loanh quanh trong HOURS để cố gắng tìm ra lý do tại sao lời nhắc của tôi chỉ cập nhật dòng trạng thái git khi tôi tìm nguồn gốc tệp .bashrc của mình.
coredumperror

Câu trả lời:


132

Bạn cần một dấu gạch chéo ngược trên $để nó không được mở rộng ngay lập tức. (So ​​sánh với `...`, là một cách viết khác $(...).)

export PS1="${RESET}${YELLOW}\u@\h${NORMAL} \`${SELECT}\` ${YELLOW}\w \$(__git_ps1) >${NORMAL} "

Tôi đồng ý với @MikeSep về việc sử dụng các dấu ngoặc kép, nhưng thực sự tối ưu hơn một chút nếu để các màu và những thứ đó được thay thế ngay lập tức. Không cần thiết, chỉ tốt hơn một chút. Điều đó nói rằng, sẽ dễ hiểu hơn những gì đang xảy ra nếu bạn sử dụng các dấu ngoặc kép.


2
Ngoài ra, nếu bạn đã từng làm việc trực tiếp trong những thứ khác ngoài chương trình đầu cuối (bộ đệm lệnh Emacs / Vim screen, v.v.), bạn có thể muốn xem xét sử dụng tputthay vì thoát màu mã cứng.
geekosaur

1
Tôi nghĩ rằng cần phải thay thế các biến màu trong trường hợp này - ít nhất, tôi chỉ nhận được mã thoát với gợi ý của @ MikeSep, trong khi biến của bạn hoạt động tốt. (+1)
Mark Longair

@Mark: Thật thú vị; những ${SELECT}ai chứng minh rằng đánh giá đệ quy đang được thực hiện. Có lẽ nó chỉ dành cho các lệnh? Tôi thường sử dụng một chức năng PS1 thay vì nó dễ dàng hơn để tìm ra những gì đang xảy ra.
geekosaur

Cảm ơn bạn @geekosaur
smonff

3
người đàn ông, bạn là một vị cứu tinh cuộc sống. Tuy nhiên, tôi có một câu hỏi: Tôi có một MBP và một iMac. Cùng .bash_profile, cùng một phiên bản bash (được cài đặt qua homebrew). trên MBP nếu tôi không thêm \ vào trước $(__git_ps1), nó sẽ không được đánh giá. Nếu tôi làm điều tương tự trên iMac, nó sẽ được đánh giá ngay cả khi không có \. Bất kỳ ý tưởng làm thế nào điều này có thể xảy ra?
molli

24

PS1Chuỗi của bạn có thể được đánh giá trước khi được lưu, nhưng bạn thực sự muốn __git_ps1lệnh chạy mỗi khi bạn nhận được dấu nhắc lệnh. Tôi khuyên bạn nên sử dụng dấu ngoặc kép thay vì dấu ngoặc kép cho export PS1='${RESET}...'dòng của bạn .


có thể hoạt động, nhưng tôi đang gặp sự cố khi chuyển đổi tất cả hệ thống thành các dấu nháy đơn, vì vậy tôi sẽ sử dụng giải pháp của geekosaur. Nhưng bạn cũng nhận được sự ủng hộ của tôi.
greg0ire

À, vâng. Của anh ấy thì tốt hơn - Tôi đã bỏ lỡ các vars địa phương cho màu sắc. Cảm ơn vì đã bình chọn. :)
Mike Seplowitz
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.