ทุบตั้งค่า PS1


9

ฉันกำลังพยายามกำหนดค่า PS1 ดังนี้

= สีเขียว "\ [\ E [32 1m \]"
สีแดง = "\ E [0; 31m"
= สีม่วง "\ E [0; 35m"
STARTCOLOR = "\ [\ E [40m \]"
ENDCOLOR = "\ [\ E [0m \]"
ส่งออก PS1 = "$ STARTCOLOR $ สีเขียว \ u @ $ สีม่วง \ h $ สีแดง \ w $ สีเขียว> $ ENDCOLOR"

และฉันมีคำถาม

  • อะไรคือความแตกต่างระหว่าง "[\ e [32; 1m]" และ \ e [32; 1m "? พวกเขาเหมือนกันหรือไม่
  • หลังจากรันคำสั่ง 'ส่งออก PS1' ก็ใช้งานได้ดี แต่เมื่อฉันป้อนอินพุตประมาณ 20 อักขระอักขระจะถูกเขียนทับตามที่ฉันแนบ เกิดอะไรขึ้นกับสิ่งนี้?
  • อะไรคือความหมายของ STARTCOLOR (\ e [40m) / ENDCOLOR (\ e [0m)]?

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

ADDED

หลังจากการทดสอบบางอย่างฉันได้รับการเปลี่ยนแปลงต่อไปนี้สามารถแก้ปัญหาได้ นั่นคือรูปแบบ "\ e" ควรแทนที่ด้วยรูปแบบ "\ [\ e"

Red = "\\ e [1; 31m" - ไม่ทำงาน
Red = "\ [\ e [1; 31m \]" - กำลังทำงาน

คำตอบ:


12

ฉันมีฟังก์ชั่นตัวช่วยในการตั้งค่าพรอมต์และเนื่องจากฉันไม่ต้องการใช้เวลามากขึ้นในการค้นหาการอ้างอิงรหัสการหลบหนีฉันจึงใส่รหัสสีข้อความทั้งหมดลงไป

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}"
}

จากนั้นคุณสามารถทำได้:

PS1=$( set_prompt )

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

unset -f set_prompt

นี่คือลิงค์ที่อธิบายรหัสเทอร์มินัล VT100: http://www.termsys.demon.co.uk/vtansi.htm

\[- เริ่มต้นลำดับของอักขระที่ไม่พิมพ์
\]- ลำดับสุดท้ายของอักขระที่ไม่พิมพ์

  • อะไรคือความแตกต่างระหว่าง "[\ e [32; 1m]" และ \ e [32; 1m "? พวกเขาเหมือนกันหรือไม่

ไม่เหมือนกันและควรเป็น\[\e[32;1m\]'. Without[] `มันจะพยายามพิมพ์ลำดับในคอนโซล

  • อะไรคือความหมายของ STARTCOLOR (\ e [40m) / ENDCOLOR (\ e [0m)]?

STARTCOLOR หมายถึงตั้งค่าพื้นหลังเป็นสีดำ ENDCOLOR หมายถึงรีเซ็ตแอตทริบิวต์ข้อความทั้งหมดหมายถึง 'ให้ฉันสีคอนโซลเริ่มต้น'


+1 ดีมาก !!! ไม่เป็นไรฉันจะคัดลอกสิ่งนี้ไปยัง bashrc ของฉัน :)
Eldelshell

@Ubersoldat ไม่ใช่เลย.
Alexander Pogrebnyak

1
ใช้\$เพื่อสลับระหว่างตัวบ่งชี้ root และ non-root โดยอัตโนมัติ
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

9

จากคู่มือทุบตี:

\[    เริ่มต้นลำดับของอักขระที่ไม่ใช่การพิมพ์ซึ่งสามารถใช้เพื่อฝังลำดับการควบคุมเทอร์มินัลลงในพรอมต์ให้
\]    สิ้นสุดลำดับของอักขระที่ไม่พิมพ์

\[และ\]ไม่ถูกส่งไปยังเทอร์มินัล พวกเขาบอกว่าทุบตีตัวละครระหว่างพวกเขาจะไม่ถูกพิมพ์ หากไม่มีพวกเขาแล้วทุบตีจะไม่สามารถรู้ได้ว่าลำดับที่ตามหลังตัวหนี (e, g. [32;1m) นั้นไม่ได้ใช้พื้นที่บนหน้าจอใด ๆ ซึ่งอธิบายว่าทำไมมันถึงไม่คำนวณความยาวของพรอมต์อย่างถูกต้อง

โปรดทราบว่าคุณยังไม่สอดคล้องกับคำถามของคุณมาก (หรืออาจเป็นเพียงความผิดพลาดของ Markdown) คุณจำเป็นต้องมีเครื่องหมายแบ็กสแลช - วงเล็บตามตัวอักษร$PS1ไม่ใช่เพียงแค่เครื่องหมายวงเล็บ (ซึ่งจะแสดงตามตัวอักษร)

escape sequences ที่ขึ้นต้นด้วย\eจะถูกตีความโดย terminal emulator พวกเขาจะถูกบันทึกไว้ในเอกสารลำดับ Xterm (ctlseqs) (ตัวจำลองเทอร์มินัลอื่น ๆ มักเข้ากันได้เป็นส่วนใหญ่) ตัวอย่างเช่น\e[32;1mสลับไปยังส่วนหน้าตัวหนาและสีเขียว \e[40mเปลี่ยนสีพื้นหลังเป็นสีดำ \e[0mเรียกคืนแอตทริบิวต์เริ่มต้น


3

เทอร์มินัลอีมูเลเตอร์สมัยใหม่ส่วนใหญ่สามารถใช้รหัสหลบหนี ANSI เพื่อควบคุมด้านต่าง ๆ ของจอแสดงผล

รหัส ANSI ส่วนใหญ่เริ่มต้นด้วยรหัส 2 ตัวอักษร ESC- [นั่นคือตัวหนี (ASCII ทศนิยม 27) ตามด้วยอักขระวงเล็บเหลี่ยมเปิด ลำดับนี้เรียกอีกอย่างว่า CSI หรือ Control Sequence Initiator

เนื่องจากอักขระเลี่ยงไม่ได้คุณสามารถพิมพ์โดยตรง (คีย์ Esc มีอื่น ๆ มักใช้เฉพาะแอปพลิเคชันใช้) bash ใช้ '\ e' เพื่ออ้างอิง

การเปลี่ยนสีข้อความใช้คำสั่ง ANSI Set Graphics Mode:

\e[<value>m

โดยที่<value>สามารถเป็นรายการค่าคั่นด้วยเซมิโคลอน ( ;) โดยปกติจะใช้เพียงหนึ่งค่าแม้ว่าแอตทริบิวต์ตัวหนาจะมีประโยชน์ร่วมกับแอตทริบิวต์สี

ดูค่าที่ระบุไว้ในคำตอบของ Alexander Pogrebnyak ค่า 0 หรือ 1 ก่อนเซมิโคลอนจะเลือกตัวหนาหรือไม่:

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

มีรายการรหัสที่เป็นประโยชน์ที่นี่http://ascii-table.com/ansi-escape-sequences.php

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.