การปรับแต่ง bash shell: คำสั่งตัวหนา / สี


13

มีจำนวนบทเรียน / โพสต์ออนไลน์ (เช่นhttp://www.cyberciti.biz/faq/bash-shell-change-the-color-of-my-shell-prompt-under-linux-or-unix/ ) PS1เกี่ยวกับวิธีการปรับแต่งรวดเร็วของคุณในทุบตีโดยการตั้งค่า มีวิธีในการปรับแต่งสี / ตัวหนาของคำสั่งที่ฉันพิมพ์หรือไม่?

ในคำอื่น ๆ ตัวอย่างเช่นสมมติว่าฉันต้องการพรอมต์สีเขียวคำสั่งสีน้ำเงินตัวหนาแล้วส่งออกในสีใดก็ตามที่จะเป็นค่าเริ่มต้น ในตัวอย่างด้านล่างที่ผมรู้อยู่แล้วว่าวิธีที่จะทำให้ " joe>" แสดงเป็นสีเขียว, สีฟ้า, ตัวหนา, PS1สิ่งโดยการตั้งค่า แต่มีวิธีที่ฉันสามารถgit statusแสดงเป็นตัวหนาเช่น?

joe> git status
# On branch master
# Your branch is ahead of 'origin/master' by 2 commits.
#
...

หากคุณต้องการเปลือกที่ดีจริงๆคุณควรใช้ zsh สิ่งที่คุณต้องการเพื่อให้บรรลุนั้นจะง่ายมากด้วยpreexec() { printf '\e[0m' }
bollovan

3
@bollovan - 'ดีจริง ๆ ' เป็นอัตนัยเล็กน้อยฉันคิดว่ามันน่ารังเกียจจริง ๆ เพราะการขยายตัวและการไม่ปฏิบัติตาม POSIX แต่สิ่งที่ลอยเรือของคุณ
Chris Down

@ChrisDown bloat ลอยเรือของคุณ - ไม่เคยได้ยินมันค่อนข้างสนุก
n611x007

คำตอบ:


13

คุณต้องทิ้งร่องรอยสีไว้หลัง PS1 (เริ่มจาก>ตัวอย่างในตัวอย่างของคุณ) จากนั้นใช้ bash DEBUGtrap เพื่อล้างสีก่อนที่คำสั่งของคุณจะถูกเรียกใช้ (แต่หลังจากที่คุณกด Enter ในเชลล์ลองสิ่งนี้ :

shopt -s extdebug
trap "tput sgr0" DEBUG

สำหรับคนแปลกหน้าที่จะหลบหนีรหัส: สิ่งนี้จะรักษาสีเดิมของคำสั่ง (เช่นจะls --color=alwaysเป็นสี)?
n611x007

@naxa - ใช่เพราะนี่เป็นการกำหนดรหัสสีอย่างชัดเจน (ยกเว้นสีที่มีสีเป็นสีเทอร์มินัลเริ่มต้นซึ่งจะมีผลหลังจากสีแรกเท่านั้น)
Chris Down

เคล็ดลับนี้ดูเหมือนจะรบกวนการเติมแท็บ (พิมพ์สิ่งแปลก ๆ เช่น^[(B^[[m) มันเกิดขึ้นเฉพาะในบางระบบเท่านั้น: ฉันทดสอบสิ่งนี้กับสองระบบทั้งที่ใช้ Ubuntu 12.04 LTS และมีเพียงหนึ่งระบบเท่านั้นที่มีสัญญาณรบกวน
musiphil

7

เพื่อความสมบูรณ์นี่คือวิธีตั้งค่าสีพรอมต์และสีอินพุตบรรทัดคำสั่งเป็น bash .bashrcใส่เส้นเหล่านี้ในของคุณ

PS1='\[\e[1;34m\]\w\$ \[\e[0;32m\]'
trap 'printf \\e[0m' DEBUG

กับดัก DEBUG ตามที่ Chris Down แนะนำให้ใช้เพื่อรีเซ็ตแอตทริบิวต์ข้อความ มันมีความหมายสำหรับการแก้จุดบกพร่อง แต่ก็ยังมีประโยชน์ในการรันโค้ดก่อนที่จะดำเนินการคำสั่งที่พิมพ์โดยผู้ใช้

ในการตั้งค่าพรอมต์:

  • \[…\] ใช้รอบ escape sequences เพื่อแจ้ง bash ว่าไม่มีการใช้อสังหาริมทรัพย์ใด ๆ บนหน้าจอ
  • \e[…mโดยที่เป็นตัวเลขหรือมากกว่าโดยทั่วไปคือลำดับของตัวเลขคั่นด้วยเครื่องหมายอัฒภาคคือescape sequence ที่ส่งไปยังเทอร์มินัลเพื่อส่งผลกระทบต่อสีและคุณลักษณะอื่น ๆ ของข้อความต่อไปนี้ ตัวอย่างเช่น1;34ตั้งค่าตัวหนาสีน้ำเงิน 0;32รีเซ็ตแอตทริบิวต์ทั้งหมดจากนั้นสลับสีเป็นสีเขียว ปรับเพื่อลิ้มรส
  • \w\$พิมพ์ไดเรกทอรีปัจจุบันและหรือ$ #แน่นอนคุณสามารถเปลี่ยนสิ่งนี้เป็นสิ่งที่คุณต้องการและแทรกการเปลี่ยนแปลงคุณสมบัติข้อความในระหว่างถ้าคุณต้องการ
  • มีการเปลี่ยนแปลงคุณสมบัติขั้นสุดท้ายในตอนท้ายซึ่งจะกำหนดสีของการป้อนข้อความ

FYI, รหัสสี bash / ลำดับสามารถค้นหาได้ที่นี่: misc.flogisoft.com/bash/tip_colors_and_formatting
kaiwan

0

ฉันเพิ่งเรียนรู้เกี่ยวกับคำสั่ง BASH และฉันได้นั่งที่นี่เล่นกับคำสั่งสีในรุ่นของฉัน ฉันหาวิธีแก้ปัญหานี้:

ใช้คำสั่งนี้:

PS1='\[\e[0:36m\]\h>\[\e[0;31m\]'

Deconstruct: PS1 =: เริ่มต้นคำสั่ง PS1

'': มีคำสั่งในเครื่องหมายคำพูดเดี่ยว (ดังนั้น BASH ไม่คิดว่ามันเป็นคำสั่งสำหรับมัน)

\: แต่ละคำสั่งเริ่มต้นด้วยสิ่งนี้

[]: มีแต่ละคำสั่ง

\ e (อาจเป็น \ 033 อักขระหลีกเลี่ยง ASCII): เริ่มคำสั่งสี

คำสั่ง color นำหน้าสิ่งที่นำไปใช้

[\ e [0; 36m]: สีฟ้า

\ h: ชื่อโฮสต์

'>': พิมพ์หลังชื่อโฮสต์

[\ e [0; 31m]: สีแดง

เห็นได้ชัดว่าคำสั่งสีแดงที่ปลายทำให้อินพุตสีแดง เพียงแค่เปลี่ยนสีตามที่คุณต้องการและนั่นคือสิ่งที่คุณกำลังมองหา

นอกจากนี้ไซต์นี้ช่วยฉันเล็กน้อย:

https://www.linuxnix.com/linuxunix-shell-ps1-prompt-explained-in-detail/

รุ่นของฉัน: GNU bash, v. 4.2.46

ดูแล,

พังพอน

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