Dựa trên thông tin tôi tìm thấy ở đây, tôi có thể khám phá một giải pháp đơn giản hơn để căn phải trong khi điều chỉnh nội dung có độ dài thay đổi ở bên phải hoặc bên trái, bao gồm hỗ trợ cho màu sắc. Đã thêm vào đây để thuận tiện cho bạn ...
Lưu ý về màu sắc: sử dụng \033
lối thoát có lợi cho các lựa chọn thay thế, không có \[\]
nhóm, chứng tỏ khả năng tương thích nhất và do đó được khuyến nghị.
Mẹo nhỏ là viết phía bên tay phải trước, sau đó sử dụng quay trở lại ( \r
) để trở về đầu dòng và tiếp tục ghi đè lên nội dung phía bên trái trên đó, như sau:
prompt() {
PS1=$(printf "%*s\r%s\n\$ " "$(tput cols)" 'right' 'left')
}
PROMPT_COMMAND=prompt
Tôi đang sử dụng tput cols
trên Mac OS X để lấy chiều rộng của thiết bị đầu cuối / bàn điều khiển terminfo
vì $COLUMNS
var của tôi không được nhập vào env
nhưng bạn có thể thay thế *
giá trị "" có thể thay thế %*s
bằng cách cung cấp " ${COLUMNS}
" hoặc bất kỳ giá trị nào khác bạn muốn, thay vào đó.
Ví dụ tiếp theo sử dụng $RANDOM
để tạo nội dung có độ dài khác nhau bao gồm màu sắc và hiển thị cách bạn có thể trích xuất các hàm để cấu trúc lại việc triển khai thành các hàm có thể sử dụng lại.
function prompt_right() {
echo -e "\033[0;36m$(echo ${RANDOM})\033[0m"
}
function prompt_left() {
echo -e "\033[0;35m${RANDOM}\033[0m"
}
function prompt() {
compensate=11
PS1=$(printf "%*s\r%s\n\$ " "$(($(tput cols)+${compensate}))" "$(prompt_right)" "$(prompt_left)")
}
PROMPT_COMMAND=prompt
Vì printf
giả sử độ dài của chuỗi là # ký tự mà chúng ta cần để bù cho số lượng ký tự được yêu cầu để hiển thị màu sắc, bạn sẽ thấy nó luôn luôn ở cuối màn hình vì các ký tự ANSI không được in mà không được bù. Các ký tự được yêu cầu cho màu vẫn không đổi và bạn sẽ thấy rằng printf cũng tính đến sự thay đổi về độ dài, như được trả về $RANDOM
chẳng hạn ', giúp giữ cho sự liên kết đúng của chúng ta trong chiến thuật.
Đây không phải là trường hợp với trình tự nhắc thoát bash đặc biệt (ví dụ. \u
, \w
, \h
, \t
) Tuy nhiên, vì chúng sẽ chỉ ghi lại một chiều dài của 2 vì bash sẽ chỉ dịch chúng khi nhắc được hiển thị, sau printf đã trả lại chuỗi. Điều này không ảnh hưởng đến phía bên tay trái nhưng tốt nhất là tránh chúng ở bên phải.
Không có hậu quả nếu nội dung được tạo sẽ vẫn ở độ dài không đổi. Giống như với \t
tùy chọn thời gian sẽ luôn hiển thị cùng số lượng ký tự (8) trong 24 lần. Chúng ta chỉ cần tính đến mức bù cần thiết để phù hợp với sự khác biệt giữa 2 ký tự được tính mà kết quả là 8 ký tự khi được in, trong những trường hợp này.
Hãy nhớ rằng bạn có thể cần phải thoát ba lần thoát \\\
một số chuỗi thoát mà nếu không thì có ý nghĩa với chuỗi. Như với ví dụ sau, thoát thư mục làm việc hiện tại \w
không có ý nghĩa gì khác vì vậy nó hoạt động như mong đợi nhưng thời gian \t
, có nghĩa là một ký tự tab, không hoạt động như mong đợi mà không thoát ba lần đầu tiên.
function prompt_right() {
echo -e "\033[0;36m\\\t\033[0m"
}
function prompt_left() {
echo -e "\033[0;35m\w\033[0m"
}
function prompt() {
compensate=5
PS1=$(printf "%*s\r%s\n\$ " "$(($(tput cols)+${compensate}))" "$(prompt_right)" "$(prompt_left)")
}
PROMPT_COMMAND=prompt
Xin chào!