ลำดับการหลีกสีของเทอร์มินัลถูกกำหนดไว้ทุกที่เพื่อทุบตีหรือไม่?


22

ฉันใช้ทุกสีบ่อยในการเขียนสคริปต์ Bash (ส่วนใหญ่เป็น CentOS) แต่เพื่อให้การใช้งานของพวกเขาง่ายขึ้นฉันก็สิ้นสุดการกำหนดตัวแปรใหม่เป็นค่าสี:

local GRAY="\[\033[1;30m\]"
local LIGHT_GRAY="\[\033[0;37m\]"
local CYAN="\[\033[0;36m\]"
local LIGHT_CYAN="\[\033[1;36m\]"
local NO_COLOUR="\[\033[0m\]"

หรือด้วยtput:

bold=`tput bold`
normal=`tput sgr0`
whitef=`tput setaf 7`
greenf=`tput setaf 2`
redb=`tput setab 1`

ฉันเคย grep'ed รอบ/etc/rc.d/init.dไดเรกทอรี แต่ไม่พบสิ่งที่เกี่ยวข้องกับคำจำกัดความสีในนั้น

มีคำจำกัดความดังกล่าวแล้วหรือยัง? ถ้าไม่ใช่ฉันจะเอาไฟล์เหล่านั้นใส่ลงในไฟล์/etc/rc.d/init.dเพื่อพูดและรวมไว้ในสคริปต์ของฉัน/etc/rc.d/init.d/functions


\e[1;30mยกตัวอย่างเช่นพวกมันไม่ใช่เพราะในทางเทคนิคไม่ได้เป็นตัวแทนของสีเทา แต่ช่องสีมักจะแสดงเป็นสีเทาโดยขั้ว เทอร์มินัลอีมูเลเตอร์มีอิสระในการเปลี่ยนสีของจอแสดงผลจริงและมักจะทำให้พวกเขาเป็นตัวเลือกที่ผู้ใช้สามารถกำหนดค่าได้
chepner

คำตอบ:


36

มีหลายแง่มุมในการเล่นในสิ่งที่คุณถาม

ประการแรกทุบตีไม่ได้กำหนดสี ในความเป็นจริงทุบตีมีความคิดอย่างแน่นอนว่าสียังคงมีอยู่ \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\]"

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