สวิตช์ grep --color = auto ทำอะไร


8

สิ่งที่มีผลไม่autoเป็นตัวเลือกสำหรับที่--colorสวิทช์ได้ใน grep? grep ตัดสินใจเลือกสีของสตริงการจับคู่และเมื่อใด

คำตอบ:


12

พฤติกรรมที่คาดหวัง

กับ --color=auto grep จะเน้นสตริงที่ตรงกันหาก (และเฉพาะในกรณี) เอาต์พุตถูกเขียนโดยตรงไปยังเทอร์มินัลและเทอร์มินัลดังกล่าวสามารถแสดงผลสีได้

โดยปกติ--color=autoคือสิ่งที่คุณต้องการ ถ้าเช่นคุณใช้ grep เพื่อจับคู่ URL และไปป์กับ Wget Wget จะเห็น\e[1;31mhttp://...แทนที่จะเป็น URL จริง (และทำให้หายใจไม่ออก)

คำสั่งต่อไปนี้ควรทำให้ได้ผลลัพธ์เป็นสี:

echo Super User | grep --color=auto Super
echo Super User | grep --color=always Super | cat

อย่างไรก็ตามคำสั่งนี้ไม่ควร:

echo Super User | grep --color=auto Super | cat

ความไม่สอดคล้องใด ๆ กับพฤติกรรมนี้ควรถือว่าเป็นข้อบกพร่อง

รหัสแหล่งที่มา

ด้วย--color=autoล่าสุดGrep สำหรับ Windowsรุ่น (2.5.4) - เช่นเดียวกับต้นฉบับ 2.5.4 มันขึ้นอยู่กับ - สีเอาท์พุทถ้าหากว่าสภาพ

isatty(STDOUT_FILENO) && getenv("TERM") && strcmp(getenv("TERM"), "dumb")

เป็นจริงเช่นถ้าเพียง แต่หากเอาต์พุตกำลังถูกเขียนไปยังเทอร์มินัลตัวแปรสภาพแวดล้อมTERMจะถูกกำหนดและเทอร์มินัลจะไม่เป็นใบ้ใบ้

สิ่งนี้จะไม่ทำให้เกิดพฤติกรรมที่ต้องการใน Windows เนื่องจากTERMโดยปกติจะไม่ได้กำหนดไว้ วิธีแก้ไขปัญหานี้ง่าย ๆ คือการตั้งค่าTERM=windowsในแผงควบคุม

grepรุ่นล่าสุด(2.14) แก้ไขปัญหานี้ได้โดยการกำหนดผลลัพธ์ถ้ามีเงื่อนไข

isatty(STDOUT_FILENO) && should_colorize()

เป็นจริงซึ่งshould_colorize()มีการกำหนดแตกต่างกันสำหรับ POSIX และ Win32:

สำหรับอดีตเงื่อนไขเท่ากับหนึ่งใน 2.5.4; สำหรับหลังตัวแปรสภาพแวดล้อมTERMไม่จำเป็นต้องตั้งค่า (มันเป็นไปไม่ได้dumb)


มันจะรู้ได้อย่างไรว่ามันเขียนไปยังเทอร์มินัลหรือไม่?
Trolzen

1
มีฟังก์ชั่น C สำหรับสิ่งนั้น หากคุณรวมไฟล์ส่วนหัวsdgstd.h, istty(stdout)ผลตอบแทน0ถ้าเอาท์พุทถูกเปลี่ยนเส้นทางไปยังแฟ้ม
Dennis

ฉันทดลองกับพอร์ต windows ของgrepและlessจากโครงการ GnuWin (gnuwin32.sourceforge.net) cmd.exeปรับปรุงด้วยansiconยูทิลิตี้ less --color=autoใช้งานได้ตามที่คาดไว้: ใช้สีเมื่อไม่มีการเปลี่ยนเส้นทางและไม่ใช้เมื่อมีการเปลี่ยนเส้นทางผลลัพธ์ แต่grep --color=autoไม่ได้พิมพ์ลำดับการหลีกเลี่ยงในทั้งสองกรณี
Trolzen

ฉันไม่เข้าใจว่าทำไมสิ่งนี้จึงเกิดขึ้น ฉันคิดว่ายูทิลิตี้เหล่านี้มีรหัสเดียวกันทั้งในรุ่น unix และ windows และมันค่อนข้างเก่า ดังนั้นพวกเขาควรประพฤติตนเหมือนกัน
Trolzen

นั่นเป็นข้อบกพร่องใน grep ของ GnuWin32 แล้ว บน Ubuntu มันทำงานตามที่ฉันได้อธิบายไว้ในคำตอบของฉัน ในขณะที่ทั้งคู่สืบทอดมาจากซอร์สโค้ดเดียวกันมีการปรับเปลี่ยนเล็กน้อยที่ต้องทำหากคุณจะคอมไพล์ในแพลตฟอร์มอื่น นอกจากนี้โปรดทราบว่า grep รุ่นปัจจุบันของ GnuWin32 คือ 2.5.4 เวอร์ชันล่าสุดบน Ubuntu คือ 2.12
Dennis
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.