วิธีแทรกแท็บก่อนบรรทัดเอาต์พุตจากคำสั่งที่เรียกใช้งาน


16

แค่คำถามด่วน เป็นไปได้ไหมที่จะแท็บผลลัพธ์บน Ubuntu 16.04 LTS ฉันสร้างสองภาพด้านล่างเพื่อลองและอธิบายสิ่งที่ฉันหมายถึงโดยสิ่งนี้

img1

img2


1
มันจะโอเคไหมถ้าคุณต้องไพพ์เอาต์พุตคำสั่งผ่านคำสั่งอื่นเช่นYOUR COMMAND | indentหรือถ้าคุณต้องพิมพ์คำสั่งอื่นต่อหน้ามัน (อาจเป็นเพียงขีดล่าง) เช่น_ YOUR COMMAND?
ผู้บัญชาการไบต์

1
@ ByteCommander ฉันได้พิจารณาแล้ว แต่ฉันใช้วิธีนี้เพื่อความสะดวกในการใช้งานและทำให้การอ่านเอาต์พุตของคอนโซลง่ายขึ้น ดังนั้นฉันไม่คิดว่าการไพพ์ของคำสั่งทั้งหมดของฉันคือคำตอบ ขอบคุณสำหรับการตอบกลับและแก้ไข!
Alex Ng

1
[โปรดอย่าโพสต์ภาพยั่วยุของข้อความที่ส่งออก ] ( meta.askubuntu.com/q/8713/85695 )
terdon

คำตอบ:


15

คุณสามารถทำสิ่งนี้ - ด้วย file descriptors:

  1. บันทึก descriptor เอาต์พุตปัจจุบันเพื่อให้เราสามารถกู้คืนได้ในภายหลัง

    exec 3>&1
  2. เปลี่ยนเส้นทางสตรีมเอาต์พุตไปยังการทดแทนกระบวนการที่แทรกแท็บ - ตัวอย่างเช่น

    exec 1> >(paste /dev/null -)

จากจุดนี้กระบวนการใด ๆ ที่เขียนไปยังเอาต์พุตมาตรฐานจะมีเอาต์พุตที่ 'กรอง' ผ่านpasteคำสั่งเพื่อแทรกแท็บเมื่อเริ่มต้น

  1. เมื่อคุณทำเสร็จแล้วคุณสามารถกลับมาทำงานตามปกติได้โดยการกู้คืน descriptor ไฟล์ที่บันทึกไว้และปิดชั่วคราว

    exec 1>&3 3>&-

ฉันขอขอบคุณสำหรับการตอบกลับ นี่เป็นวิธีที่ใกล้เคียงที่สุดที่ฉันได้หาทางแก้
Alex Ng

@AlexNg ขอบคุณสำหรับ upvote - ในทางใดเป็นพิเศษมันไม่ได้ทำในสิ่งที่คุณขอ? ถ้าคุณบอกให้ฉันรู้ว่าฉันจะพยายามปรับปรุงให้ดีขึ้น
ช่างเหล็ก

ในการให้ตัวอย่าง: หลังจากป้อนคำสั่งของคุณแล้วบางคำสั่งจะทำงานตามที่ต้องการเช่น 'php -v', 'hostname' และอื่น ๆ อย่างไรก็ตามเมื่อใช้คำสั่งเช่น 'echo Hello World' เอาต์พุตจะแสดงแบบอินไลน์กับอินพุตและยังส่งผลกระทบต่อลักษณะที่ปรากฏของอินพุตเมื่อส่งคำสั่งถัดไป บางคำสั่งอื่นยังไม่มีผลกระทบจากกระบวนการแท็บเช่นเมื่อป้อนคำสั่งที่ไม่ถูกต้องเช่น 'asdasd'
Alex Ng

ในที่สุดมันไม่ถูกต้องแสดงผลลัพธ์ที่เปลี่ยนแปลง (ไม่แน่ใจว่าจะอธิบายอย่างถูกต้องขอโทษ) ตัวอย่างเช่นหากใช้คำสั่ง 'apt-get update' จะมีความแตกต่างที่เห็นได้ชัดเจนเมื่อเปรียบเทียบกับคอนโซลที่ไม่มีกระบวนการแท็บ
Alex Ng

ปัญหาคือว่าวิธีการนี้จะจัดการ STDOUT เท่านั้น (สตรีม 1) แต่ไม่ใช่ STDERR (สตรีม 2) มันยังทำลายการส่งออกของโปรแกรมที่ใช้หรือคล้ายกันเครื่องมือที่จะช่วยให้การเลื่อนของการส่งออกเช่นเช่นless man
ผู้บัญชาการไบต์

9

ฉันเข้าใจว่าคำตอบนี้ไม่เหมาะสำหรับคุณ แต่คุณสามารถสร้างฟังก์ชั่น Bash ด้วยชื่อแบบง่าย ๆ_(หรือสิ่งอื่น ๆ ที่ยังไม่ได้ใช้) ซึ่งรันคำสั่งที่ได้รับเป็นอาร์กิวเมนต์และเยื้องเอาต์พุตทั้งหมดด้วยแท็บ

ตัวอย่าง:

$ _ lsb_release -a
        No LSB modules are available.
        Distributor ID: Ubuntu
        Description:    Ubuntu 16.04 LTS
        Release:    16.04
        Codename:   xenial

รหัสของฟังก์ชั่นนี้จะเป็นแบบนี้:

_(){ sed "s/^/\t/" <($*); }

คุณสามารถต่อท้าย~/.bashrcไฟล์ของคุณเพื่อให้สามารถใช้งานได้ในเซสชัน Bash ทั้งหมดของผู้ใช้ของคุณโดยการเรียกใช้:

echo '_(){ sed "s/^/\t/" <($*); }' >> ~/.bashrc

หากคุณต้องการให้ผู้ใช้ทุกคนสามารถใช้งานได้ให้ผนวกเข้าด้วยกัน/etc/bash.bashrc(ต้องใช้สิทธิ์ผู้ดูแลระบบ):

echo '_(){ sed "s/^/\t/" <($*); }' | sudo tee -a /etc/bash.bashrc

หรือคุณสามารถสร้างไฟล์สคริปต์เช่นเดียว/usr/local/bin/_กับเนื้อหาต่อไปนี้เพื่อให้ได้เหมือนกันโดยไม่มีฟังก์ชัน Bash และสำหรับผู้ใช้ทั้งหมด:

#!/bin/bash
sed "s/^/\t/" <($*)

คุณต้องทำให้สคริปต์เรียกใช้งานได้หลังจากบันทึกไฟล์โดยใช้

sudo chmod +x /usr/local/bin/_

5

ด้วยการechoเฉพาะคุณสามารถตีความเครื่องหมายทับขวาเช่น\t( หยุดแท็บ ) ด้วย-eสวิตช์:

echo -e "\tHello World"

แต่มันก็แทบจะเป็นไปไม่ได้ (หรืออาจเป็นไปได้) ในการแก้ไขเอาต์พุตของคำสั่งทุกวิธี หากเป้าหมายของคุณคือความสะดวกในการอ่านคุณอาจต้องการปรับแต่งรูปลักษณ์ (เช่นการระบายสี) ของพรอมต์คำสั่งของคุณดังที่แสดงที่นี่:

PS1คุณสามารถปรับแต่งรวดเร็วของคุณโดยการเปลี่ยนเนื้อหาของตัวแปรสภาพแวดล้อม คุณสามารถดูตัวอย่างเล็กน้อยเกี่ยวกับวิธีการทำเช่นนั้นในบล็อกโพสต์ภาพหน้าจอด้านบนมาจาก วิธีการใช้รายละเอียดลำดับที่เรียกว่า ANSI escape ในรายละเอียดวิธีใช้เครื่องมือที่สะดวกสบายมากขึ้นวิธีการใช้การเปลี่ยนแปลงที่เป็นค่าเริ่มต้นในเทอร์มินัลใหม่เป็นต้นอยู่นอกเหนือขอบเขตของคำตอบนี้ แต่ถ้าคุณตัดสินใจที่จะใช้เทคนิคนั้นมีบทเรียนมากมายและข้อมูลเพิ่มเติมเกี่ยวกับเว็บ


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