thiết lập bash PS1


9

Tôi đang cố gắng để cấu hình PS1 như sau.

Màu xanh lá cây = "\ [\ e [32; 1m \]"
Đỏ = "\ e [0; 31m"
Màu tím = "\ e [0; 35m"
STARTCOLOR = "\ [\ e [40m \]"
ENDCOLOR = "\ [\ e [0m \]"
xuất PS1 = "$ STARTCOLOR $ Xanh \ u @ $ Tím \ h $ Đỏ \ w $ Xanh> $ ENDCOLOR"

Và tôi có một số câu hỏi.

  • Sự khác biệt giữa "[\ e [32; 1m]" và \ e [32; 1m "là gì?
  • Sau khi chạy lệnh 'xuất PS1', nó hoạt động tốt, nhưng khi tôi đưa đầu vào khoảng 20 ký tự, các ký tự sẽ bị ghi đè khi tôi đính kèm. Có chuyện gì với cái này vậy?
  • Ý nghĩa của STARTCOLOR (\ e [40m) / ENDCOLOR (\ e [0m) là gì?

http://a.imageshack.us/img8/606/resultqm.jpg

THÊM

Sau một số thử nghiệm, tôi đã nhận được sự thay đổi sau đây có thể giải quyết vấn đề. Nghĩa là, định dạng "\ e" phải được thay thế bằng định dạng "\ [\ e".

Đỏ = "\\ e [1; 31m" - không hoạt động
Đỏ = "\ [\ e [1; 31m \]" - đang hoạt động

Câu trả lời:


12

Tôi có chức năng trợ giúp để đặt lời nhắc và vì tôi không muốn mất nhiều thời gian hơn cho việc tìm kiếm các tham chiếu mã thoát, tôi đã mã hóa tất cả các giá trị màu văn bản vào nó.

function set_prompt ( )
{
    # Prompt setup
    # ##################

    # Black            \e[0;30m
    # Blue             \e[0;34m
    # Green            \e[0;32m
    # Cyan             \e[0;36m
    # Red              \e[0;31m
    # Purple           \e[0;35m
    # Brown            \e[0;33m
    # Gray             \e[0;37m
    # Dark Gray        \e[1;30m
    # Light Blue       \e[1;34m
    # Light Green      \e[1;32m
    # Light Cyan       \e[1;36m
    # Light Red        \e[1;31m
    # Light Purple     \e[1;35m
    # Yellow           \e[1;33m
    # White            \e[1;37m

    local COLOR_DEFAULT='\[\e[0m\]'
    local COLOR_BLACK='\[\e[0;30m\]'
    local COLOR_BLUE='\[\e[0;34m\]'
    local COLOR_GREEN='\[\e[0;32m\]'
    local COLOR_CYAN='\[\e[0;36m\]'
    local COLOR_RED='\[\e[0;31m\]'
    local COLOR_PURPLE='\[\e[0;35m\]'
    local COLOR_BROWN='\[\e[0;33m\]'
    local COLOR_GRAY='\[\e[0;37m\]'
    local COLOR_DARK_GRAY='\[\e[1;30m\]'
    local COLOR_L_BLUE='\[\e[1;34m\]'
    local COLOR_L_GREEN='\[\e[1;32m\]'
    local COLOR_L_CYAN='\[\e[1;36m\]'
    local COLOR_L_RED='\[\e[1;31m\]'
    local COLOR_L_PURPLE='\[\e[1;35m\]'
    local COLOR_YELLOW='\[\e[1;33m\]'
    local COLOR_WHITE='\[\e[1;37m\]'

    local PS1_SET_TITLE='\[\e]0;\w\a\]'

    local PS1_SET_TIME="${COLOR_DEFAULT}\t"
    local PS1_SET_RET_CODE="${COLOR_L_RED}(\$?)"
    local PS1_SET_USER="${COLOR_L_GREEN}\u@\h"
    local PS1_SET_PWD="${COLOR_YELLOW}\w"

    local PS1_LN_1="${PS1_SET_TITLE}\n"
    local PS1_LN_2="${PS1_SET_TIME} ${PS1_SET_RET_CODE} "
    local PS1_LN_2="${PS1_LN_2}${PS1_SET_USER} ${PS1_SET_PWD} ${COLOR_DEFAULT}\n"

    echo "${PS1_LN_1}${PS1_LN_2}"
}

Sau đó bạn có thể làm:

PS1=$( set_prompt )

# Use '#' for root shell
export PS1=${PS1}'$ '

unset -f set_prompt

Đây là liên kết giải thích mã thiết bị đầu cuối VT100: http://www.termsys.demon.co.uk/vtansi.htm

\[- bắt đầu chuỗi ký tự không in
\]- chuỗi kết thúc ký tự không in

  • Sự khác biệt giữa "[\ e [32; 1m]" và \ e [32; 1m "là gì?

Không giống nhau, và nó sẽ là \[\e[32;1m\]'. Without[] `nó sẽ cố in chuỗi trong bảng điều khiển.

  • Ý nghĩa của STARTCOLOR (\ e [40m) / ENDCOLOR (\ e [0m) là gì?

STARTCOLOR, có nghĩa là đặt nền thành màu đen, ENDCOLOR có nghĩa là đặt lại tất cả các thuộc tính văn bản, nghĩa là 'cho tôi màu bảng điều khiển mặc định'


+1 Rất đẹp !!! Đừng
bận

@Ubersoldat. Không có gì.
Alexander Pogrebnyak

1
Sử dụng \$để tự động chuyển đổi giữa chỉ thị root và không root.
Tạm dừng cho đến khi có thông báo mới.

9

Từ hướng dẫn bash:

\[    bắt đầu một chuỗi các ký tự không in, có thể được sử dụng để nhúng một chuỗi điều khiển đầu cuối vào dấu nhắc
\]    kết thúc một chuỗi các ký tự không in

\[\]không được chuyển đến thiết bị đầu cuối. Họ nói với bash rằng các ký tự giữa chúng sẽ không được in. Không có chúng, bash không thể biết rằng chuỗi theo ký tự thoát (e, g. [32;1m) Không chiếm bất kỳ khoảng trống nào trên màn hình, điều này giải thích tại sao nó không tính toán chính xác độ dài của dấu nhắc khi bạn bỏ chúng.

Lưu ý rằng bạn đã không nhất quán trong câu hỏi của bạn (hoặc có lẽ đó chỉ là một lỗi với Markdown); bạn cần phải có một chuỗi dấu gạch chéo ngược theo nghĩa đen $PS1, không chỉ là một dấu ngoặc (sẽ được hiển thị theo nghĩa đen).

Trình tự thoát bắt đầu \ebằng trình giả lập thiết bị đầu cuối. Chúng được ghi lại trong tài liệu trình tự điều khiển Xterm (ctlseqs) (các trình giả lập đầu cuối khác có xu hướng tương thích chủ yếu). Ví dụ, \e[32;1mchuyển sang tiền cảnh đậm và xanh; \e[40mchuyển màu nền sang màu đen; \e[0mKhôi phục các thuộc tính mặc định.


3

Hầu hết các trình giả lập thiết bị đầu cuối hiện đại đều có thể sử dụng mã thoát ANSI để kiểm soát các khía cạnh khác nhau của màn hình.

Hầu hết các mã ANSI bắt đầu bằng mã 2 ký tự ESC- [Đó là ký tự thoát (ASCII thập phân 27) theo sau là ký tự dấu ngoặc vuông mở. Trình tự này còn được gọi là CSI hoặc Control Sequence Initiator.

Vì ký tự thoát không phải là ký tự bạn có thể nhập trực tiếp (phím Esc có loại khác, thường là ứng dụng cụ thể, sử dụng) nên bash sử dụng '\ e' để chỉ nó.

Thay đổi màu văn bản sử dụng lệnh ANSI Set Graphics Mode:

\e[<value>m

trong đó <value>có thể là một danh sách các giá trị được phân tách bằng dấu chấm phẩy ( ;). Thông thường chỉ sử dụng một giá trị, mặc dù thuộc tính in đậm rất hữu ích khi kết hợp với các thuộc tính màu.

Nhìn vào các giá trị được liệt kê trong câu trả lời của Alexander Pogrebnyak, 0 hoặc 1 trước dấu chấm phẩy có chọn in đậm hay không:

\e[1m  # bold
\e[5m  # blink
\e[0m  # all attributes off

Có một danh sách hữu ích về các mã ở đây http://ascii-table.com/ansi-escape- resultences.php

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.