มีหลายแง่มุมในการเล่นในสิ่งที่คุณถาม
ประการแรกทุบตีไม่ได้กำหนดสี ในความเป็นจริงทุบตีมีความคิดอย่างแน่นอนว่าสียังคงมีอยู่ \033[0;36m
ทั้งหมดก็รู้คือการที่คุณบอกว่ามันเอาท์พุทตัวละคร เทอร์มินัลอีมูเลเตอร์ของคุณ (xterm, gnome-terminal, อะไรก็ตาม) รับตัวอักษรเหล่านี้และเข้าใจว่า "ฉันต้องเริ่มส่งสัญญาณเป็นสีฟ้า"
ดังนั้นจึงเป็นเทอร์มินัลอีมูเลเตอร์ของคุณที่เข้าใจสี เทอร์มินัลอีมูเลเตอร์ของคุณเข้าใจว่า\033[0;36m
เป็นสีฟ้า แต่เทอร์มินัลอีมูเลเตอร์อื่นอาจใช้ชุดอักขระที่แตกต่างไปจากเดิมอย่างสิ้นเชิงสำหรับสีฟ้า (แม้ว่าจะไม่มีเทอร์มินัลอีมูเลเตอร์จำลอง) tput
นี่คือเหตุผลที่ เมื่อคุณเรียกใช้tput setaf 6
, tput
เป็นไปได้ที่จะมองขึ้นรหัสหนี terminal ของคุณสำหรับสี 6 (สีฟ้า) และเอาท์พุทว่ารหัสการหลบหนี
(ดูคำถามนี้สำหรับข้อมูลเพิ่มเติมเกี่ยวกับtput setaf
รหัส)
ตอนนี้กลับไปทุบตี ในขณะที่คุณอาจจะสังเกตเห็นเมื่อฉันได้รับหมายถึงสีฟ้าที่ผมเคยใช้ไม่ได้\033[0;36m
\[\033[0;36m\]
วงเล็บเหลี่ยมหายไป จุดประสงค์ของเครื่องหมายวงเล็บเหลี่ยมคือเมื่อใช้รหัสหลบหลีก (สี) ในพรอมต์ทุบตีต้องทราบว่าอักขระใดที่ไม่ได้พิมพ์ (ความกว้างเป็นศูนย์ไม่แสดงอะไรเลย) ดังนั้นคุณจึงใส่อักขระที่ไม่พิมพ์\[
\]
ออกมา หากคุณลบอักขระเหล่านี้ทุกอย่างอาจดูเหมือนจะใช้ได้ดีในตอนแรก แต่คุณจะเริ่มพบกับความแปลกประหลาดทุกประเภทเมื่อคำสั่งของคุณเกินความกว้างของเทอร์มินัล นี่เป็นเพราะเมื่อพิมพ์ bash จะต้องรู้ว่าเมื่อใดที่คำสั่งควรตัดบรรทัดถัดไป เมื่อต้องการทำสิ่งนี้มันจะคำนวณความกว้างของพรอมต์จากนั้นความกว้างของจำนวนที่คุณพิมพ์
tput
ทราบอีกประมาณ CYAN="\[\033[0;36m\]"
คือไม่ได้CYAN="$(tput setaf 6)"
เป็นสิ่งเดียวกับ ขณะที่เราเพิ่งพูดถึงวงเล็บเหลี่ยมจะเกี่ยวข้องกับการทุบตีและtput
กำลังจะส่งออกรหัสหลบหนีเทอร์มินัลเท่านั้น
เนื่องจากโดยปกติแล้วเครื่องหมายวงเล็บเหลี่ยมจะเกี่ยวข้องกับการแจ้งเตือนเท่านั้นหากคุณใช้สีในการแสดงผลของสคริปต์หรือบางสิ่งบางอย่างคุณจึงไม่ควรใช้ หมายความว่าหากคุณกำลังจะใช้สีเป็นมากกว่าการแจ้งเตือนคุณจะต้องกำหนดตัวแปรหลายตัว หนึ่งที่มีวงเล็บเหลี่ยมสำหรับใช้ในการแจ้งและหนึ่งโดยไม่ต้องสำหรับทุกอย่างอื่น แม้ว่าคุณจะสามารถเพิ่มวงเล็บสี่เหลี่ยมด้วยตนเองทุกครั้งที่คุณอ้างอิงสีในพรอมต์
เรื่องสั้นยาวมากคุณอาจต้องการนิยาม:
local CYAN="$(tput setaf 6)" # OR CYAN="\033[0;36m"
local LIGHT_CYAN="$CYAN$(tput bold)" # OR LIGHT_CYAN="\033[1;36m"
local PROMPT_CYAN="\[$CYAN\]"
local PROMPT_LIGHT_CYAN="\[$LIGHT_CYAN\]"
\e[1;30m
ยกตัวอย่างเช่นพวกมันไม่ใช่เพราะในทางเทคนิคไม่ได้เป็นตัวแทนของสีเทา แต่ช่องสีมักจะแสดงเป็นสีเทาโดยขั้ว เทอร์มินัลอีมูเลเตอร์มีอิสระในการเปลี่ยนสีของจอแสดงผลจริงและมักจะทำให้พวกเขาเป็นตัวเลือกที่ผู้ใช้สามารถกำหนดค่าได้