ความคิดเห็นแบบอินไลน์สำหรับ Bash?


142

ฉันต้องการที่จะสามารถออกความเห็นธงเดียวในคำสั่งบรรทัดเดียว Bash ดูเหมือนจะมีfrom # till end-of-lineความคิดเห็นเท่านั้น ฉันกำลังดูเทคนิคที่ชอบ:

ls -l $([ ] && -F is turned off) -a /etc

มันน่าเกลียด แต่ดีกว่าไม่มีอะไร มีวิธีที่ดีกว่า?

ดูเหมือนว่าจะทำงานต่อไปนี้ แต่ฉันไม่แน่ใจว่ามันเป็นแบบพกพา:

ls -l `# -F is turned off` -a /etc

#commentเคล็ดลับยังกล่าวถึงที่นี่: stackoverflow.com/questions/9522631/...
จูฮาPalomäki

1
ตามลิงก์ที่กล่าวถึงโดย @Juha Palomäkiมีเคล็ดลับที่ยอดเยี่ยมนี้ที่${IFS#comment}@pjh แนะนำในการแสดงความคิดเห็น ไม่มีการเรียกเชลล์ย่อย
alexis

คำตอบ:


110

สิ่งที่ฉันชอบคือ:

การแสดงความคิดเห็นในสคริปต์ Bash

สิ่งนี้จะมีค่าใช้จ่าย แต่ในทางเทคนิคแล้วมันจะตอบคำถามของคุณ

echo abc `#put your comment here` \
     def `#another chance for a comment` \
     xyz etc

และสำหรับท่อโดยเฉพาะมีวิธีการทำความสะอาดที่ไม่มีค่าใช้จ่าย

echo abc |        # normal comment OK here
     tr a-z A-Z | # another normal comment OK here
     sort |       # the pipelines are automatically continued
     uniq         # final comment

วิธีใส่ความคิดเห็นของบรรทัดสำหรับคำสั่งหลายบรรทัด


3
โปรดทราบว่าคุณต้องใช้ backticks $(#comment)ไม่ทำงาน
funroll

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

2
หมายเหตุนี่ไม่ใช่ความคิดเห็นจริง: true && `# comment` && trueเป็นนิพจน์ที่ถูกต้อง ความคิดเห็นจริงจะสร้างบางสิ่งเช่น: syntax error near unexpected token && ''
เซบาสเตียนแว็กเนอร์

คุณพูดถูก @sebastianwagner โปรดทราบว่ามันจะล้มเหลวในการลัดวงจรหรืออะไรแบบนั้น แต่ฉันคิดว่ามันดีมากที่เราจะได้รับโดยไม่ต้องยุ่งอะไรมากมาย สำหรับฉันมันเป็นสัญญาณว่าคนเราต้องการภาษาที่ดีกว่า แต่ก็ทำได้ดีมากรักษารหัสที่สร้างไว้แล้วด้วย 'coments' ดังกล่าวเพื่อจัดทำเอกสาร
Rafareino

ขอบคุณที่ช่วยฉันออกไป!
xiarnousx

58

ฉันคิดว่ามันง่ายที่สุด (และอ่านมากที่สุด) เพียงแค่คัดลอกบรรทัดและแสดงความคิดเห็นในเวอร์ชันดั้งเดิม:

#Old version of ls:
#ls -l $([ ] && -F is turned off) -a /etc
ls -l -a /etc

โหวตขึ้นเพื่อความชัดเจน ไม่รู้ว่าทำไมนี่ไม่ใช่ตัวเลือกแรก
David Tabernero M.

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

25

$(: ...) ค่อนข้างน่าเกลียดน้อย แต่ก็ยังไม่ดี


2
โดยไวยากรณ์นี้คุณกำลังยิง sub-shell ความคิดเห็นจะถูกแทนที่เพื่อปรับปรุงความสามารถในการ redability โดยไม่เปลี่ยนพฤติกรรมโค้ดเลย แต่เวลาที่จะ lauch / จบ sub เชลล์นี้จะทำให้โค้ดของคุณช้าลง (เพื่อพูดน้อย) ทำไมไม่ใช้เฉพาะเครื่องหมายจุดคู่ในการขึ้นบรรทัดใหม่
Rafareino

1
ด้วย $ {IFS # ... } ไม่มีการเรียกใช้งานเชลล์ย่อย
alexis

3
@Rafareino: ใช่ แต่จริงจังใน 95% ของการใช้งานค่าใช้จ่ายนี้จะไม่สำคัญเลย สำหรับหลาย ๆ กรณีที่มันมีความสำคัญอาจเป็นความคิดที่ดีที่จะใช้ภาษาที่เร็วกว่า Bash ในตอนแรก
leftaroundabout

... ปัญหาคือ$(: ...)ไวยากรณ์ไม่จริงดูเหมือนจะอนุญาตให้มีการฝังความคิดเห็น: ในขณะที่echo "foo" `# comment` "bar"จะยุติความคิดเห็นที่ backtick ที่สองเทียบเท่าควรทำอะไรไม่ได้แจงเบื้องหลังecho "foo" $(: # comment) "bar" #
leftaroundabout


4

นี่คือวิธีแก้ปัญหาของฉันสำหรับความคิดเห็นแบบอินไลน์ระหว่างคำสั่ง piped หลายคำสั่ง

ตัวอย่างโค้ดที่ไม่ใส่เครื่องหมาย:

    #!/bin/sh
    cat input.txt \
    | grep something \
    | sort -r

โซลูชันสำหรับการแสดงความคิดเห็นไปป์ (ใช้ฟังก์ชันตัวช่วย):

    #!/bin/sh
    pipe_comment() {
        cat - 
    }
    cat input.txt \
    | pipe_comment "filter down to lines that contain the word: something" \
    | grep something \
    | pipe_comment "reverse sort what is left" \
    | sort -r

หรือหากคุณต้องการนี่เป็นวิธีแก้ปัญหาเดียวกันโดยไม่มีฟังก์ชั่นตัวช่วย แต่มันก็ยุ่งกว่าหน่อย:

    #!/bin/sh
    cat input.txt \
    | cat - `: filter down to lines that contain the word: something` \
    | grep something \
    | cat - `: reverse sort what is left` \
    | sort -r

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

3

คำสั่งส่วนใหญ่อนุญาตให้ args มาในลำดับใดก็ได้ เพียงแค่ย้ายธงที่มีความคิดเห็นไปที่ท้ายบรรทัด:

ls -l -a /etc # -F is turned off

จากนั้นเมื่อต้องการเปิดใช้งานอีกครั้งเพียงยกเลิกการคอมเมนต์และลบข้อความ:

ls -l -a /etc -F

1
ประณามฉันเพิ่ม#โดยไม่มีช่องว่างเดียวหลังจากคำสั่ง ขอบคุณ!
asgs

1

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

ls -l $ {1 # -F ถูกปิด} -a / etc

§ 10.2 การทดแทนพารามิเตอร์


ใช้${name:=comment}เพื่อความปลอดภัย
can-ned_food

1

สำหรับการปิดการใช้งานส่วนหนึ่งของคำสั่งเช่นa && bนั้นฉันเพิ่งสร้างสคริปต์เปล่าxที่อยู่บนเส้นทางดังนั้นฉันสามารถทำสิ่งต่าง ๆ เช่น:

mvn install && runProject

เมื่อฉันต้องการสร้างและ

x mvn install && runProject

เมื่อไม่ใช้Ctrl + AและCtrl + Eเพื่อย้ายไปยังจุดเริ่มต้นและจุดสิ้นสุด)

ตามที่ระบุไว้ในความคิดเห็นวิธีอื่นในการทำเช่นนั้นคือ Bash ใน:ตัวแทนx:

$  : Hello world, how are you? && echo "Fine."
Fine.

2
ตัวอาคารดังกล่าวมีอยู่แล้ว:เช่นเดียวกับใน:string; of; commands; : disabled; enabled;
xenithorb

ดียิ่งขึ้น :) ขอบคุณ
Ondra Žižka

-1

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

โอ้มีข้อยกเว้นอย่างหนึ่งซึ่งเป็นภาษาถิ่นของ SQL ที่ฉันมักจะใช้ซึ่งใช้ '{comments}' ฉันจะเขียนเป็นครั้งคราว:

CREATE UNIQUE INDEX u1_table ON Table(...);
CREATE {DUPS} INDEX d1_table ON Table(...);

แต่นั่นก็เป็นการยืด

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