ความคิดเห็นที่อ่านได้ในแต่ละบรรทัดในคำสั่ง bash แบบหลายบรรทัดพร้อมไพพ์ไลน์


14

เมื่อสร้างเชลล์สคริปต์โดยใช้ไพพ์ไลน์และการใช้แบ็กสแลชเพื่อดำเนินการต่อบรรทัดฉันต้องการแทรกความคิดเห็นบนบรรทัดแยกในแฟชั่นที่แข็งแกร่งอ่านได้และพกพาได้

ตัวอย่างเช่นให้ใช้คำสั่งหลายบรรทัดที่ไม่ใส่เครื่องหมาย (ถูกขโมยจาก @DigitalRoss เพื่อความชัดเจน):

echo abc |
     tr a-z A-Z |
     sort |
     uniq

... ด้านล่างมีความสวยงามใกล้เคียงกับสิ่งที่ฉันต้องการให้สำเร็จ แต่ด้วยเหตุผลที่ชัดเจนไม่ทำงาน ... และใช่ฉันทราบดีว่านี่ไม่ใช่สิ่งที่ควรค่าแก่การแสดงความคิดเห็น:

# Perform critical system task.
# NOTE - An example of what does *not* work.
echo abc |
    # Convert lowercase to uppercase.
     tr a-z A-Z |

     # Sort the results.
     sort |

     # Only show unique lines.
     uniq

คำตอบที่เกี่ยวข้องที่มีอยู่ไม่น่าพอใจสำหรับฉันดังนี้:

ก่อนอื่นคำตอบของ glenn jackman (การเพิ่มอาร์กิวเมนต์ในอาเรย์แล้วเรียกใช้อาเรย์) ทำงานสำหรับคำสั่งเดี่ยว แต่ไม่ได้ผลสำหรับการไพพ์ไลน์ (และแม้ว่ามันจะทำมันจะเพิ่มความซับซ้อนที่ฉันต้องการ

ประการที่สอง@Gilles 'คำตอบที่นี่ (ซึ่งใช้:) ก็ไม่ได้ดูเหมือนจะทำงานกับ pipelining เพราะมันเปลี่ยนการไหลของไปป์ไลน์:

$ echo "abc" | :
$

( หมายเหตุ : หากมีสิ่งเทียบเท่ากับ:ที่ส่งผ่านเอาท์พุทที่ไม่ได้แก้ไขนั่นจะเป็นที่ยอมรับได้ แต่ฉันไม่สามารถหาได้ฉันสามารถเขียนแบบกำหนดเองได้ แต่มันจะลดการพกพา)

ในที่สุดคำตอบสุดท้ายของDigitalRoss ใน StackOverflowทำงานได้ดีสำหรับการเพิ่มความคิดเห็นในบรรทัดเดียวกัน แต่ฉันต้องการความคิดเห็นอย่างมากในบรรทัดแยกต่างหาก มิฉะนั้นเมื่อบรรทัดมีความยาวแตกต่างกันอย่างมากความสามารถในการอ่านจะลดลง:

echo abc |         # normal comment OK here`
     /usr/local/bin/really/long/path/ridiculously-long-filename.sh |  # another normal comment OK here
     sort |        # the pipelines are automatically continued
     uniq          # final comment

ฉันกำลังมองหาคำตอบที่รักษาความสามารถในการอ่านและลดความซับซ้อนหรืออื่น ๆ ที่เป็นสาเหตุของสิ่งที่ฉันกำลังมองหาเป็นไปไม่ได้


1
หมายเหตุเกี่ยวกับความคิดเห็นของคุณ: ฉันถูกสอนให้เขียนความคิดเห็นอธิบายส่วนหรือหน่วยงาน หากผู้เขียนโค้ดที่มีประสบการณ์เขียนความคิดเห็นที่ชาญฉลาดซึ่งอธิบายถึงสิ่งที่พวกเขากำลังทำอยู่ดังนั้นใครก็ตามที่เข้ามาดูแลรักษาสคริปต์สามารถใช้ man page ได้หากพวกเขาไม่เข้าใจรายละเอียดการใช้งาน i++; // increment i by oneหนึ่งไม่ควรเขียนความเห็นชอบ ผมขอแนะนำให้คุณอ่าน"องค์ประกอบของการเขียนโปรแกรม Style"
BSD

ฉันคิดว่าฉันจะลบการแก้ไขล่าสุด มันเป็นเรื่องแปลกสำหรับคำถามที่มีคำถาม refutations คำตอบและคำตอบเอง แต่ส่วนที่อธิบายว่าทำไมคำตอบอื่น ๆ ไม่ทำงานจำเป็นชนิดที่นี่ คำตอบ rozcietrzewiacz และความคิดเห็นของคุณร่วมกันอธิบายปัญหาแม้ว่า (ส่วนตัวผมจะได้โพสต์คำตอบที่แยกต่างหากและได้รับการยอมรับก็ไม่ได้เนื่องจากเป็นปัญหาที่ค่อนข้างแตกต่างจากสิ่งที่เขาอธิบาย แต่งานนี้)
ไมเคิล Mrozek

เข้าใจ - ขอบคุณสำหรับคำติชม บทเรียน!
Royce Williams

คำตอบ:


14

แล้วเรื่องนี้ล่ะ

echo abc | \
# Convert lowercase to uppercase.
tr a-z A-Z | \

# Sort the results.
sort | \

# Only show unique lines.
uniq

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


Aha! (facepalm) ฉันเปลี่ยนสำนวนที่ฉันใช้จริง ๆ เมื่อโพสต์คำถามโดยไม่รู้ตัว! ฉันวางท่อที่จุดเริ่มต้นของแต่ละบรรทัดซึ่งฉันมีความสุขที่จะหยุดทำตอนนี้ที่ฉันรู้ว่าวิธีนี้ใช้ได้ดีกับทุกระบบที่ฉันสามารถเข้าถึงได้ทั้งใน bash และ sh ขอบคุณ!
Royce Williams

ความคิดเห็นเหล่านั้นจะไม่ทำลายเส้นต่อเนื่องหรือไม่
Stuart P. Bentley

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