Tại sao chức năng của tôi không được đánh giá lại trong PS1?


15

Tôi đang cố gắng để một phần lời nhắc của tôi được thiết lập linh hoạt bởi một chức năng, vì vậy trong tôi .bashrccó:

asdf ()
{
    echo -n $(pwd)
}
PS1="\u@\h:\w $(asdf)\$ "

Mở một cái vỏ cho tôi những gì tôi mong đợi lúc đầu:

$ bash
darthbith@server:~/test /home/darthbith/test$

Tuy nhiên, khi tôi thay đổi thư mục, phần được xác định bởi hàm sẽ không thay đổi:

darthbith@server:~/test /home/darthbith/test$ cd ~/test2
darthbith@server:~/test2 /home/darthbith/test$

Mục tiêu thực tế của tôi là sử dụng git-prompt.shtập lệnh để hiển thị nhánh của kho git của tôi khi tôi ở trong một màu sắc đẹp và mọi thứ, nhưng vấn đề là nó không bao giờ cập nhật tên chi nhánh khi tôi thay đổi kho lưu trữ. Ví dụ tầm thường ở trên là sự sao chép đơn giản nhất mà tôi có thể đưa ra cho câu hỏi của mình.

Các .bashrcdòng mà tôi phải tích hợp tập lệnh git-prompt:

source ~/.git-prompt.sh
PS1="\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]$(__git_ps1)\$ "

Bên cạnh đó, nếu bạn muốn một lời nhắc git, tôi sẽ giới thiệu github.com/magicmonty/bash-git-prompt/blob/master/README.md
mgor

Câu trả lời:


22

Theo lời nhắc của Bash Cách làm :

[21:58:33][giles@nikola:~]$ PS1="[\$(date +%H%M)][\u@\h:\w]\$ "
[2159][giles@nikola:~]$ ls
bin   mail
[2200][giles@nikola:~]$

Điều quan trọng cần lưu ý là dấu gạch chéo ngược trước dấu đô la của lệnh thay thế. Không có nó, lệnh bên ngoài được thực thi chính xác một lần: khi chuỗi PS1 được đọc vào môi trường.


Cảm ơn bạn! Bây giờ nếu tôi chỉ có thể làm cho nó in màu thay vì các chuỗi thoát được trả về từ chức năng ...
darthbith

6

Khi bạn sử dụng $(..)trong dấu ngoặc kép, shell đã đánh giá thay thế lệnh trước khi gán cho PS1. Do đó, PS1chỉ chứa đầu ra, không phải là lệnh thay thế chính nó. Thay vào đó, hãy sử dụng dấu ngoặc đơn hoặc thoát khỏi dấu $, để chuỗi được truyền theo nguyên trạng PS1, và sau đó được đánh giá khi lời nhắc được đặt:

$ PS1='$(pwd) $ '
/tmp $ cd /var
/var $ echo "$PS1"
$(pwd) $ 

Đối chiếu:

/var $ PS1="$(pwd) $ "
/var $ echo "$PS1"
a /var $  a
/var $ 
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.