ฉันจะสร้างสีเอาต์พุตน้อยลงได้อย่างไร


25

เมื่อฉันรันโปรแกรม (ตัวอย่างเช่นgrepหรือls) โดยไม่มีเพจเจอร์ผลลัพธ์ของมันจะเป็นสี อย่างไรก็ตามเมื่อฉันเรียกใช้มันไปป์ไลน์เอาต์พุตของมันจะlessไม่มีสีปรากฏขึ้น

ตัวอย่างเช่นคำสั่งนี้แสดงผลเอาต์พุตสี:

grep -r something

แต่นี่ไม่ใช่:

grep -r something | less

ทำไม? ฉันจะดูสีผ่านได้lessอย่างไร


5
grep --color=always "search string" * | less -Rแต่ผมมักจะใช้ในปัจจุบันแทนmost lessนอกจากนี้: gnu.org/software/src-highliteเป็นปากกาเน้นข้อความสี (ทำงานได้น้อยลงเช่นกัน)
Rinzwind

@alex คุณได้ติดตั้งแล้วpython-pygments?
souravc

@souravc ไม่ฉันไม่ได้ติดตั้งนั้น
Mohammad Reza Rezwani

@ales ไม่สนใจฉันใช่ไหม >: - D
Rinzwind

คำตอบ:


36

มีสองปัญหาที่นี่:

  • คำสั่งเช่นls- ซึ่งตรวจจับการสนับสนุนสีโดยอัตโนมัติ - ไม่พบการสนับสนุนจากท่อ
  • less ถูกตั้งค่าเป็นเพียงแสดงรหัสสีตามค่าเริ่มต้น

ทั้งคู่สามารถเอาชนะได้ แต่มันก็เป็นเรื่องเล็กน้อย

ls --color=always | less -R

สิ่งนี้ไม่lsเฉพาะเจาะจง คำสั่งจำนวนมากที่สนับสนุนสีก็มีอาร์กิวเมนต์แทนที่


คำตอบเชิงลึกเพิ่มเติมเล็กน้อยlsคือการตรวจสอบว่า STDOUT ของมันเป็นของเทอร์มินัลจริงหรือไม่ เมื่อคุณไพพ์สิ่งรอบ ๆ STDOUT ถูกตั้งค่าเป็น STDIN ของคำสั่งถัดไป

คุณสามารถดูนี้ในที่ทำงานในlsรหัสที่มา มันใช้isattyคำสั่ง (อินเตอร์เฟส POSIX หลัก) เพื่อกำหนดว่าสถานการณ์คืออะไร:

  • เป็นสีตามค่าเริ่มต้น:

        print_with_color = (i == color_always
                            || (i == color_if_tty
                                && isatty (STDOUT_FILENO)));
    
  • เราจะพยายามส่งออกในหลายคอลัมน์:

    if (format == long_format)
      format = (isatty (STDOUT_FILENO) ? many_per_line : one_per_line);
    
    //...
    
    if (isatty (STDOUT_FILENO))
      {
        format = many_per_line;
        set_quoting_style (NULL, shell_escape_quoting_style);
        qmark_funny_chars = true;
      }
    else
      {
        format = one_per_line;
        qmark_funny_chars = false;
      }
    

grepทำสิ่งที่คล้ายกันมากเว้นแต่จะแทนที่อย่างชัดเจนมันจะตรวจจับการสนับสนุนสีด้วยisatty:

color_option = isatty (STDOUT_FILENO) && should_colorize ();

1
upvote ล่าสุดของฉัน (ถึงขีด จำกัด ) สำหรับวันนี้เพื่อสนับสนุนคุณ 100k แต่ฉันกับรินซวินด์ต้องการเค้กเมื่อมันเกิดขึ้น
hytromo

ฉันดาวน์โหลดโปรแกรมด้วยชื่อ ack-grep เมื่อพิมพ์ ack-grep foo มันจะค้นหา foo ในไดเรคทอรีย่อยทั้งหมดดังนั้นฉันก็เลย ack-grep foo | น้อยลงและสีก็หายไป แต่ดูเหมือนว่าโปรแกรมนี้จะไม่รองรับ "--color = always" ไม่ว่าจะเป็นการขอบคุณอะไรก็ตามสำหรับความช่วยเหลือ
Mohammad Reza Rezwani

1
@alex ack มี--colorข้อโต้แย้ง:ack-grep -i select --color | less -R
Oli

@Oli ......... พระเจ้าของฉัน ........ สิ่งเดียวที่ฉันสามารถพูดเกี่ยวกับความรู้และความช่วยเหลือของคุณและพลังของลินุกซ์
Mohammad Reza Rezwani

1
@ B1KMusic ฉันเห็นด้วย ฉันเห็นด้วยมากจนพบว่ามันทำงานอย่างไรและอัพเดตคำตอบ คุณสามารถบังคับคอลัมน์ด้วย-Cอาร์กิวเมนต์
Oli

2

หากคุณกำลังสนใจในสีlessอื่น ๆ lesspipe.shโดยทั่วไปคุณอาจต้องการที่จะมองไปที่ ดูตัวอย่างเช่นhttp://freecode.com/projects/lesspipe

lesspipe.sh เป็นตัวกรองอินพุตสำหรับเพจเจอร์น้อยตามที่อธิบายไว้ใน man page ของ less สคริปต์ทำงานภายใต้เชลล์ที่เข้ากันได้กับ ksh (เช่น bash, zsh) และช่วยให้คุณใช้งานน้อยลงในการดูไฟล์ที่มีเนื้อหาไบนารีไฟล์บีบอัดไฟล์เก็บถาวรและไฟล์ที่อยู่ในคลังข้อมูล

นอกจากนี้ยังจะทำให้ color shell เชลล์สคริปต์ perl และอื่น ๆ คล้ายกับ text editor โดยไม่ต้องใช้โปรแกรม "preprocessing" ใด ๆ ในการทำ colorizing

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