__git_ps1 (chi nhánh hiện tại) trong dấu nhắc bash luôn bị lỗi thời


8

Của tôi PS1trong ~/.bash_profile:

export PS1="\\n\[\033[38;5;246m\]\u@\[\033[38;5;245m\]\h\[\033[38;5;15m\] \[\033[38;5;28m\]\w\[\033[38;5;15m\]\[\033[38;5;2m\]`__git_ps1`\[\033[38;5;15m\] \[\033[38;5;90m\]\t\[\033[38;5;15m\] \[\033[38;5;232m\]\[\033[38;5;15m\] \n\[\033[38;5;0m\]\\$ "

(xin lỗi, tôi không có bất kỳ bí danh nào cho mã màu của mình, tôi đã tạo lời nhắc này bằng trình chỉnh sửa trực tuyến)

Đó là một chút lộn xộn nhưng tạo ra một dấu nhắc rất hay: nhập mô tả hình ảnh ở đây

Nhưng nhánh hiện tại hiển thị luôn sai nếu tôi chuyển đổi

sai chi nhánh

Tôi không chắc tại sao điều này sẽ xảy ra. Nếu tôi tự chạy lệnh, tôi nhận được giá trị chính xác.

$ echo `__git_ps1`
(dev)

Nếu tôi nguồn .bash_profile, giá trị mới sẽ xuất hiện (nhưng sẽ sai khi tôi chuyển đổi lần sau). Tôi có làm điều gì sai?


Sử dụng các trích dẫn đơn xung quanh bài tập (hoặc chỉ __git_ps1phần để bạn không cần sửa lỗi thoát tất cả thông qua lời nhắc) để nó không được gọi / đánh giá ngay lập tức và không được mở rộng cho trình bao để gọi vào thời gian hiển thị nhanh chóng.
Etan Reisner

Câu trả lời:


8
export PS1="…`__git_ps1`…"

Với `__git_ps1`dấu ngoặc kép bên trong, lệnh này chạy lệnh __git_ps1và gán đầu ra của nó (và văn bản xung quanh khác) cho biến PS1. Do đó, dấu nhắc của bạn đang hiển thị nhánh được xác định khi bạn .bash_profileđược thực thi.

Bạn cần chạy __git_ps1mỗi lần bash hiển thị lời nhắc. (Trên thực tế bạn không cần phải chạy lại cho đến khi thông tin git thay đổi, nhưng điều đó rất khó phát hiện.) Có hai cách để làm điều đó.

  • Bao gồm các văn bản chữ `__git_ps1`trong PS1biến. Đảm bảo rằng bash được cấu hình để thực hiện mở rộng shell trên chuỗi dấu nhắc, với promptvarstùy chọn được bật; đó là trường hợp theo mặc định nhưng nó có thể được tắt với shopt -u promptvars.

    PS1='\n\[…\]$(__git_ps1)\[…\]\$ '
  • Cập nhật nội dung nhanh chóng bằng lệnh chạy từ PROMPT_COMMANDbiến.

    update_PS1 () {
      PS1="\\n\\[…\\]$(__git_ps1)\[…\]\\$ "
    }
    shopt -u promptvars
    PROMPT_COMMAND=update_PS1

Nhân tiện, lời nhắc là một cấu hình shell, không phải là cài đặt chung, vì vậy bạn nên đặt nó trong ~/.bashrc, không phải trong~/.bash_profile .


1
Lựa chọn đầu tiên làm việc như một lá bùa, cảm ơn!
Bố già

5

Nó chỉ là một vấn đề đơn giản của trích dẫn. Thay đổi `__git_ps1`thành \$(__git_ps1), hoặc, nếu bạn phải sử dụng backticks : \`__git_ps1\`.

Để thuyết phục bản thân, chỉ cần thay đổi PS1 của bạn thành (mở phiên bản shell mới nếu bạn muốn quay lại sạch thiết lập trước đó):

$ PS1="$(date) >"
Thu Nov 26 20:02:34 EST 2015 >_

Vấn đề duy nhất là nó sẽ không cập nhật (đợi vài giây để nhấn enter).

Nhưng điều này sẽ:

$ PS1="\$(date) >"
Thu Nov 26 20:06:20 EST 2015
Thu Nov 26 20:06:25 EST 2015

Đó là tất cả. viết exit. (cập nhật lời nhắc của bạn) Quay trở lại làm việc.


1

http://mediadoneright.com/content/ultimate-git-ps1-bash-prompt

Thông báo ở phía dưới họ không đặt:

xuất PS1 = "\ n ...` __git_ps1 ...

Các thiết lập cho phần công việc bệnh hoạn này:

export PS1=$IBlack$Time12h$Color_Off'$(git branch &>/dev/null;\

if [ $? -eq 0 ]; then \
  echo "$(echo `git status` | grep "nothing to commit" > /dev/null 2>&1; \
  if [ "$?" -eq "0" ]; then \
    # @4 - Clean repository - nothing to commit
    echo "'$Green'"$(__git_ps1 " (%s)"); \
  else \
    # @5 - Changes to working tree
    echo "'$IRed'"$(__git_ps1 " {%s}"); \
  fi) '$BYellow$PathShort$Color_Off'\$ "; \
else \
  # @2 - Prompt when not in GIT repo
  echo " '$Yellow$PathShort$Color_Off'\$ "; \
fi)'

Các bit có liên quan là "$ (__ git_ps1" (% s) "hoặc" $ (__ git_ps1 "{% s}"


Các bit có liên quan trong đó thực sự là dấu ngoặc đơn.
Etan Reisner

Và thực sự nhiều điều về đoạn trích đó là ngang bằng tốt nhất.
Etan Reisner
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.