พรอมต์สีใน KornShell


11

ตามโพสต์ StackOverflow นี้เป็นไปได้ที่จะมีพรอมต์สีใน KornShell ฉันไม่สามารถหาวิธีการทำสิ่งนี้ได้ ฉันสามารถใช้สี:

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

ให้เอาต์พุต "Linux" สีน้ำเงินเช่นเดียวกับ:

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

อย่างไรก็ตามเมื่อฉันรวมรหัสการยกเว้นลงในPS1ตัวแปรที่พร้อมท์ของฉันพวกเขาจะไม่ถูกยกเว้น ฉันต้องทำอย่างไรจึงจะได้รับพรอมต์สี นอกเหนือจากการเป็นเครื่องดูดฝุ่นสำหรับ eyecandy ฉันพบว่าพรอมต์สีมีประโยชน์เมื่อแยกวิเคราะห์การมองเห็น

คำตอบ:


10

เพียงใช้ตัวอักษร Esc ตามตัวอักษรที่ป้อนด้วยCtrl- v, Esc(จะปรากฏเป็น^[บนหน้าจอ):

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

หรือใช้ผลลัพธ์ของechoคำสั่งที่คุณพบว่าทำงาน:

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

บางครั้งเป็นเช่นนี้ที่ฉันรู้ว่าฉันยังเป็น commandline noob ฉันมักจะรู้สึกดีมากเมื่อเทียบกับเพื่อนของฉัน :) รุ่นแรกทำงานได้ดี; ช่างเป็นกลลวงที่เรียบร้อย! ฉันไม่ประสบความสำเร็จกับรุ่นที่สอง +1
Kazark

5

คุณต้องใส่อักขระตัวอักษรที่แท้จริงในPS1ตัวแปร Ksh88 และโคลนเช่น pdksh และ mksh (เวอร์ชั่นที่เก่ากว่า) ไม่มีไวยากรณ์ที่แท้จริงสำหรับอักขระควบคุมยกเว้นผ่านในprintตัว Mksh เข้าใจ\eสำหรับการหลบหนี แต่ pdksh \033ต้องใช้รหัสเลขฐานแปด

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

ATT ksh93 แนะนำไวยากรณ์ตัวอักษรแบคแลชต์ที่หลบหนี$'…'(มีให้ใน mksh ตั้งแต่ R39b) คุณสามารถใช้เครื่องหมายแบคสแลชเพื่อวางอักขระควบคุมในตัวอักษรเหล่านี้

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

2
ที่จริงแล้วmkshยังรองรับ$'…'- เป็นที่ยอมรับเพราะ Dave Korn (Korn ใน Korn Shell) ยืนยันว่าฉันเพิ่มเข้าไป
mirabilos

@ mirabilos Ah ขอบคุณ ฉันอาจพิมพ์คำตอบนั้นบนเครื่องที่มี mksh R39 และไม่ได้ตรวจสอบเวอร์ชั่นที่ใหม่กว่า
Gilles 'SO- หยุดความชั่วร้าย'

2

ฉันใช้สิ่งเหล่านี้ในmkshสำหรับผู้ใช้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 '

& แตกต่างกันเล็กน้อยshellสำหรับ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 '

ป้อนคำอธิบายรูปภาพที่นี่

เนื่องจากอักขระพิเศษไม่ได้คัดลอกนี่คือ paste pasteสำหรับทั้งผู้ใช้ปกติและรูท


1

มีหลายสิ่งเกิดขึ้นในคำตอบของผู้ใช้แต่ละคนมีไวยากรณ์ที่แตกต่างกัน

  1. ลำดับ escape สำหรับโปรแกรมเทอร์มินัลของคุณที่ระบุในเอกสารคู่มือ

  2. วิธีการเข้ารหัสลำดับ escape ของเทอร์มินัลในตัวแปร PS1 เช่น \ e หรือ escape ตามตัวอักษร ขึ้นอยู่กับเปลือก

  3. วิธีการเพิ่มข้อมูลการเปลี่ยนแปลงให้กับพรอมต์เช่นชื่อโฮสต์ไดเรกทอรีปัจจุบัน ฯลฯ นอกจากนี้ยังขึ้นอยู่กับเปลือก คุณอาจจะสามารถใช้ลำดับแบ็กสแลชพิเศษเช่น \ w สำหรับไดเรกทอรีการทำงานหรือคุณอาจต้องตั้งชื่อตัวแปรสภาพแวดล้อมหรือฝังบรรทัดคำสั่งลงในสตริง

  4. วิธีบอกเชลล์ที่พิมพ์อักขระและอักขระใดไม่ได้ เชลล์ไม่ทราบว่าจุดเริ่มต้นและจุดสิ้นสุดของการหลบหนีของคุณอยู่ที่ใด หากเชลล์มีตัวแก้ไขบรรทัดคำสั่งหรือสิ่งที่คล้ายกันก็จำเป็นต้องรู้ว่าตัวอักษรใดพิมพ์เพื่อให้รู้ว่าเคอร์เซอร์อยู่ที่ไหน ถ้าไม่มีรายละเอียดนี้พรอมต์ของคุณอาจดูถูกต้อง แต่การแก้ไขอาจมีพฤติกรรมแปลก ๆ

    • ในทุบตีคุณใส่ \ [ก่อนแต่ละลำดับหนีและ \] หลังจาก

    • ใน ksh คุณเลือกอักขระ ASCII ที่ไม่พิมพ์อักขระตัวเดียวที่ไม่สามารถเกิดขึ้นได้ทุกที่ในสตริง ที่จุดเริ่มต้นของสตริงคุณเขียนอักขระนั้นตามด้วย ASCII carriage return จากนั้นคุณเขียนตัวละครเดียวกันทั้งก่อนและหลังแต่ละลำดับหนี z3ntu เลือก \ a เป็นตัวทำเครื่องหมาย


0

ขอบคุณคำตอบก่อนหน้าและแหล่งข้อมูลอื่น ๆ ฉันจึงสามารถหาคำตอบเหล่านี้ได้:

Korn เชลล์พร้อมต์:

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

Bash prompt:

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

สิ่งเหล่านี้ให้พรอมต์สีเดียวกัน (ใช่ฉันพูดภาษาอังกฤษของ Queen) ในรูปแบบ:

username@computername /current/working/directory
$

เทียบเท่า DOS (แม้ว่าจะไม่มีตัวเลือกสี) คือ:

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

ซึ่งจะช่วยให้:

username@computername /current/working/directory
>

">" กำลังทำให้มันเป็น 'DOSsy' มากกว่า 'nixy' ด้วย "$" แต่ถ้าคุณต้องการ sigil ("$") แทนมันจะเป็น:

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

ให้บัญชีเข้าสู่ระบบของคุณมีสิทธิ์ที่จำเป็นในการทำให้ถาวร 'nixies' เติมพวกเขาด้วย "ส่งออก":

export PS1="..."

และเปลี่ยน DOSsy เป็น:

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

หรือ

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