Các tính năng điều khiển nhanh chóng của Bash khá tĩnh. Nếu bạn muốn kiểm soát nhiều hơn, bạn có thể bao gồm các biến trong lời nhắc của mình; đảm bảo bạn chưa tắt promptvars
tùy chọn .
PS1='${PWD#"${PWD%/*/*}/"} \$ '
Lưu ý các dấu ngoặc đơn: việc mở rộng biến phải xảy ra tại thời điểm dấu nhắc được hiển thị, không phải tại thời điểm PS1
biến được xác định.
Nếu bạn muốn kiểm soát nhiều hơn những gì được hiển thị, bạn có thể sử dụng thay thế lệnh. Ví dụ: đoạn trích ở trên mất ~
chữ viết tắt cho thư mục chính.
PS1='$(case $PWD in
$HOME) HPWD="~";;
$HOME/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
$HOME/*) HPWD="~/${PWD##*/}";;
/*/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
*) HPWD="$PWD";;
esac; printf %s "$HPWD") \$ '
Mã này khá cồng kềnh, vì vậy thay vì dán nó vào PS1
biến, bạn có thể sử dụng PROMPT_COMMAND
biến để chạy mã để đặt HPWD
và sau đó sử dụng mã đó trong lời nhắc của bạn.
PROMPT_COMMAND='case $PWD in
$HOME) HPWD="~";;
$HOME/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
$HOME/*) HPWD="~/${PWD##*/}";;
/*/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
*) HPWD="$PWD";;
esac'
PS1='$HPWD \$'
Vì lời nhắc rút ngắn chỉ thay đổi khi thay đổi thư mục, bạn không cần tính toán lại mỗi khi lời nhắc được hiển thị. Bash không cung cấp một hook chạy trên một thay đổi thư mục hiện tại, nhưng bạn có thể mô phỏng nó bằng cách ghi đè cd
và anh em họ của nó.
cd () { builtin cd "$@" && chpwd; }
pushd () { builtin pushd "$@" && chpwd; }
popd () { builtin popd "$@" && chpwd; }
chpwd () {
case $PWD in
$HOME) HPWD="~";;
$HOME/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
$HOME/*) HPWD="~/${PWD##*/}";;
/*/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
*) HPWD="$PWD";;
esac
}
PS1='$HPWD \$'
Lưu ý rằng bạn không cần và không nên xuất PS1
vì đây là cài đặt shell chứ không phải biến môi trường. Một PS1
thiết lập bash sẽ không được hiểu bởi các shell khác.
PS Nếu bạn muốn có trải nghiệm vỏ tương tác đẹp, hãy chuyển sang zsh , trong đó tất cả những điều này ( %
mở rộng nhanh chóng bao gồm phần lớn tcsh chpwd
, v.v.) là các tính năng gốc.
PS1='%2~ %# '
PS1='\w \$'; PROMPT_DIRTRIM=2
sẽ cung cấp cho bạn bash tương đương, nhưng điều đó không hoạt động đúng trên hệ thống của tôi.