Nhắc màu trong KornShell


11

Theo bài đăng StackOverflow này , có thể có một dấu nhắc màu trong KornShell. Tôi đã không thể tìm ra cách để làm điều này. Tôi có thể sử dụng màu:

echo -e "\033[34mLinux\033[00m"

cung cấp một đầu ra "Linux" màu xanh, cũng như:

printf "\033[34mLinux\033[00m"

Tuy nhiên, khi tôi kết hợp các mã thoát vào PS1biến nhắc của mình , chúng sẽ không được thoát. Tôi cần làm gì để có được một dấu nhắc màu? Bên cạnh đó là một cái gì đó của một kẻ hút mắt, tôi thấy rằng một dấu nhắc màu là hữu ích khi phân tích cú pháp trực quan đầu ra.

Câu trả lời:


10

Chỉ cần sử dụng ký tự Esc theo nghĩa đen, được nhập bằng Ctrl- v, Esc(sẽ được hiển thị như ^[trên màn hình):

PS1="^[[34mLinux^[[00m"

Hoặc sử dụng đầu ra của echolệnh bạn tìm thấy đang hoạt động:

PS1="$(echo -e "\033[35mLinux\033[00m")"

Vào những lúc như thế này, tôi nhận ra mình vẫn chưa phải là người chỉ huy. Tôi thường cảm thấy rất tốt so với bạn bè của tôi. :) Phiên bản đầu tiên hoạt động độc đáo; Thật là một mánh khóe gọn gàng! Tôi đã không thành công với phiên bản thứ hai. +1
Kazark

5

Bạn cần đặt một ký tự thoát theo nghĩa đen trong PS1biến. Ksh88 và các bản sao như pdksh và mksh (phiên bản cũ hơn) không có cú pháp bằng chữ cho các ký tự điều khiển ngoại trừ thông qua tích printhợp. Mksh hiểu \eđể thoát, nhưng pdksh yêu cầu mã bát phân \033.

PS1=$(print '\033[34mLinux\033[00m')

ATT ksh93 giới thiệu cú pháp nghĩa đen thoát khỏi $'…'backlash (cũng có sẵn trong mksh kể từ R39b). Bạn có thể sử dụng các dấu gạch chéo ngược để đặt các ký tự điều khiển trong các chữ này.

PS1=$'\e[34mLinux\e[00m'

2
Trên thực tế, mkshcũng hỗ trợ $'…'- phải thừa nhận vì Dave Korn (Korn trong Korn Shell) khăng khăng tôi thêm nó.
mirabilos

@mirabilos À, cảm ơn. Có lẽ tôi đã gõ câu trả lời đó trên máy có mksh R39 và không kiểm tra các phiên bản mới hơn.
Gilles 'SO- ngừng trở nên xấu xa'

2

Tôi sử dụng chúng mkshcho một người dùng shell:

# custom prompt see http://comments.gmane.org/gmane.os.miros.mksh/126
PS1=$'\a\r\a\e[1;34m\a ^ ^  ^ ^ | \a\e[36m\a${USER:=$(ulimit -c 0; id -un 2>/dev/null || echo
\?)}@${HOSTNAME%%.*}\a\e[34m\a | ^ ^  ^ ^ | \a\e[0;33m\a$(local d=${PWD:-?} p=~; [[ $p = ?(*/) ]] || d=${d/#$p/~};
print -nr -- "$d")\a\e[1;34m\a |\n ^ ^  ^ ^ | \a\e[32m\a$(date +%H:%M)\a\e[34m\a | ^ ^ >>\a\e[0m\a '

& một chút khác biệt shellcho root:

PS1=$'\a\r\a\e[1;34m\a ^ ^  ^ ^  ^   \a\e[31m\a${USER:=$(ulimit -c 0; \
    id -un 2>/dev/null || echo \?)}@${HOSTNAME%%.*}\a\e[34m\a  ^ ^  ^ ^  ^ ^  ^   \a\e[0;33m\a$(
        local d=${PWD:-?} p=~
        [[ $p = ?(*/) ]] || d=${d/#$p/~}
        print -nr -- "$d"
)\a\e[1;34m\a  ^ ^ \n ^ ^  ^ ^  ^   \a\e[32m\a$(date +%H:%M)\a\e[34m\a  ^ ^  ^ ^   \a\e[0m\a '

nhập mô tả hình ảnh ở đây

Vì các ký tự đặc biệt không sao chép, đây là một miếng dán pastebin cho cả người dùng và root thông thường.


1

Một số điều đang diễn ra trong câu trả lời của mọi người, mỗi câu có một cú pháp khác nhau.

  1. Trình tự thoát cho chương trình thiết bị đầu cuối của bạn được đưa ra trong tài liệu.

  2. Cách mã hóa các chuỗi thoát thiết bị đầu cuối trong biến PS1, ví dụ \ e hoặc thoát theo nghĩa đen. Điều này phụ thuộc vào vỏ.

  3. Cách thêm thông tin thay đổi vào dấu nhắc, ví dụ tên máy chủ, thư mục hiện tại, v.v ... Điều này cũng phụ thuộc vào trình bao. Bạn có thể sử dụng các chuỗi dấu gạch chéo ngược đặc biệt như \ w cho thư mục làm việc hoặc bạn có thể phải đặt tên biến môi trường hoặc nhúng các dòng lệnh vào chuỗi.

  4. Làm thế nào để nói với shell mà ký tự in và ký tự nào không. Shell không biết trình tự thoát thiết bị đầu cuối của bạn bắt đầu và kết thúc ở đâu. Nếu shell có trình soạn thảo dòng lệnh hoặc một cái gì đó tương tự, nó cần biết ký tự nào được in để nó biết con trỏ ở đâu. Không có chi tiết này, lời nhắc của bạn có thể nhìn đúng nhưng chỉnh sửa có thể hành xử kỳ lạ.

    • Trong bash, bạn đặt \ [trước mỗi chuỗi thoát và \] sau.

    • Trong ksh, bạn chọn một ký tự ASCII không in không thể xuất hiện ở bất kỳ nơi nào khác trong chuỗi. Ở đầu chuỗi, bạn viết ký tự đó theo sau là trả về vận chuyển ASCII. Sau đó, bạn viết cùng một ký tự trước và sau mỗi chuỗi thoát. z3ntu đã chọn \ a làm ký tự đánh dấu.


0

Nhờ các câu trả lời trước đó và các nguồn khác, tôi đã có thể đưa ra những điều sau:

Dấu nhắc vỏ Korn:

PS1="$(echo "\033[32m`logname`\033[35m@\033[32m`hostname` \033[33m`pwd`\033[36m\n\$\033[0m")"

Dấu nhắc Bash:

PS1="\[\e[32m\]\u\[\e[35m\]@\[\e[32m\]\h \[\e[33m\]\w\[\e[36m\]\n\$\[\e[0m\]"

Chúng đưa ra cùng một dấu nhắc màu (vâng, tôi nói tiếng Anh của Nữ hoàng;)) theo định dạng:

username@computername /current/working/directory
$

Tương đương với DOS (mặc dù không có tùy chọn màu) là:

prompt %username%@%computername% $P$_$G

cung cấp cho:

username@computername /current/working/directory
>

">" Đang giữ nó là 'DOSsy' thay vì 'nixy' với "$", nhưng nếu bạn muốn sigil ("$") thì đó sẽ là:

prompt %username%@%computername% $P$_$$

Với điều kiện tài khoản đăng nhập của bạn có các quyền cần thiết, để làm cho 'nixies' vĩnh viễn trả trước chúng bằng "xuất khẩu":

export PS1="..."

và thay đổi DOSsy thành:

setx PROMPT "%username%@%computername% $P$_$G"

hoặc là

setx PROMPT "%username%@%computername% $P$_$$"
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.