จะสร้างความคิดเห็นแบบหลายบรรทัดใน Bash ได้อย่างไร


226

ฉันเพิ่งเริ่มศึกษาเชลล์สคริปต์และฉันต้องการที่จะแสดงความคิดเห็นชุดของบรรทัดในเชลล์สคริปต์ ฉันหมายถึงชอบในกรณีของ C / Java:

/* comment1
   comment2 
   comment3
*/`

ฉันจะทำสิ่งนั้นได้อย่างไร


2
คุณสามารถใช้แฮชที่ชอบ: # นี่คือความคิดเห็น
Mohammad Tayyab

1
ฉันรู้ แต่มันลำบากเล็กน้อยสำหรับ multiline
Enes Malik Turhan

2
ควรสังเกตว่าคำตอบด้านล่างต้องการให้:อยู่ในคอลัมน์แรก (ไม่มีช่องว่างนำหน้า) ในบรรทัด
ty

คำตอบ:


394

ใช้: 'เพื่อเปิดและ'ปิด

ตัวอย่างเช่น:

: '
This is a
very neat comment
in bash
'

27
:( และยังเพิ่มจำนวนมากของความสามารถในการอ่านและความสามารถในการแก้บั๊กได้อย่างยอดเยี่ยม IMHO ดีกว่าเพียงใช้หลาย ๆ ตัว#และไม่เคยทำเช่นนี้ ...
jm666

51
@ jm666 IMHO ไม่ควรใช้คำไม่เคยเมื่อคุณไม่มีความคิดในการใช้งานทุกกรณี
ฤดูหนาว

19
เพื่ออธิบาย: :มีการจดชวเลขtrueและtrueไม่ได้ประมวลผลพารามิเตอร์ใด ๆ (หน้าคู่มือ:SYNOPSIS true [ignored command line arguments]
phil294

46
ช่องว่างระหว่าง:และ'เป็นสิ่งสำคัญ
becko

23
ฉันแก้ไขสิ่งนี้เล็กน้อยสำหรับบล็อกของรหัสเพื่อให้ฉันสามารถสลับรหัสเปิดหรือปิดได้อย่างง่ายดาย การเปลี่ยนแปลงของฉันคือการใช้# 'ในบรรทัดสุดท้ายแทนคำพูดเดียว ด้วยวิธีนี้ฉันสามารถใส่หนึ่ง#ในบรรทัดแรกเพื่อเปิดใช้งานบล็อกของรหัส ลบ#บรรทัดแรกเพื่อปิดการใช้งานรหัส
JohnMudd

131

แสดงความคิดเห็นหลายบรรทัดในทุบตี

: <<'END_COMMENT'
This is a heredoc (<<) redirected to a NOP command (:).
The single quotes around END_COMMENT are important,
because it disables variable resolving and command resolving
within these lines.  Without the single-quotes around END_COMMENT,
the following two $() `` commands would get executed:
$(gibberish command)
`rm -fr mydir`
comment1
comment2 
comment3
END_COMMENT

4
ใช้งานได้คำตอบที่ยอมรับในปัจจุบันไม่ได้ (สำหรับฉัน)
Freek

5
มันอาจจะน่าสังเกตว่านี่ไม่ใช่ความคิดเห็นต่อ se นี่คือ heredoc ที่เปลี่ยนเส้นทางไปยังคำสั่ง NOP เป็นสตริงแบบหลายบรรทัด อัญประกาศเดี่ยวเป็นสิ่งสำคัญที่จะปิดการใช้งานการแก้ไขตัวแปรและคำสั่ง
Nux

1
@Freek ต้องเพิ่มพื้นที่
mazs

ฉันทดสอบสิ่งนี้ในสคริปต์ทุบตีแบบง่ายๆที่ทำงานผ่านสายของ shebang, #! / bin / bash ใน Debian และมันล้มเหลว ฉันพยายามแต่ละคำตอบในหน้านี้และพวกเขาทั้งหมดล้มเหลวจนกว่าฉันจะไปถึงด้านล่าง เนื่องจากพวกเขาล้มเหลวฉันจึงลงคะแนนพวกเขาและลงคะแนนคนที่ทำงานอย่างถูกต้อง
PyTis

1
การทดสอบที่ดีในตัวอย่างของคุณ ผู้นำ:ไม่จำเป็น <<เพียงแค่เริ่มต้นด้วย
wisbucky

34

ฉันกำลังอัปเดตโพสต์นี้ตามความคิดเห็นและคำตอบอื่น ๆ ดังนั้นความคิดเห็นก่อน 22 พฤษภาคม 2020 อาจไม่สามารถใช้งานได้อีกต่อไป

Bash ไม่ได้มีไวยากรณ์ในตัวสำหรับความคิดเห็นแบบหลายบรรทัด แต่มีแฮ็กที่ใช้ไวยากรณ์ของ bash ที่มีอยู่ซึ่ง "เกิดขึ้นกับการทำงานตอนนี้"

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

<<'### BLOCK COMMENT'
line 1
line 2

line 3
line 4
### BLOCK COMMENT

Single-quoting the marker HEREDOC หลีกเลี่ยงการแยกผลข้างเคียงของเชลล์เช่นการย่อยแบบแปลก ๆ ที่อาจทำให้เกิดความผิดพลาดหรือเอาต์พุตและแม้แต่การแยกเครื่องหมายของตัวเอง ดังนั้นเครื่องหมายคำพูดเดียวให้อิสระคุณมากขึ้นในเครื่องหมายแสดงความคิดเห็นแบบเปิดปิด ตัวอย่างเช่นต่อไปนี้ใช้แฮชสามเท่าซึ่งชนิดของคำแนะนำแสดงความคิดเห็นหลายบรรทัดในทุบตี สิ่งนี้จะทำให้สคริปต์ขัดข้องหากไม่มีการเสนอราคาเดียว แม้ว่าคุณจะลบออก###แต่FOO{}ก็จะทำให้สคริปต์ผิดพลาด (หรือทำให้เกิดการแทนที่ที่ไม่ดีที่จะพิมพ์หากไม่มีset -e) หากไม่ได้ใช้เครื่องหมายคำพูดเดี่ยว:

set -e

<<'### BLOCK COMMENT'
something something ${FOO{}} something
more comment
### BLOCK COMMENT

ls

แน่นอนคุณสามารถใช้

set -e

<<'###'
something something ${FOO{}} something
more comment
###

ls

แต่เจตนาของเรื่องนี้ชัดเจนน้อยกว่าสำหรับผู้อ่านที่ไม่คุ้นเคยกับกลอุบายนี้

ทุกวันนี้เครื่องมือแก้ไขที่ดีจะอนุญาตให้คุณกด ctrl- / หรือคล้ายกันเพื่อยกเลิก / แสดงความคิดเห็นการเลือก ทุกคนเข้าใจสิ่งนี้อย่างแน่นอน:

# something something ${FOO{}} something
# more comment
# yet another line of comment

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

แน่นอนว่ามีเทคนิคอื่น ๆ แต่ดูเหมือนจะไม่มีวิธี "ธรรมดา" ที่จะทำ มันจะดีถ้า###>และ###<สามารถเพิ่มลงใน bash เพื่อระบุจุดเริ่มต้นและจุดสิ้นสุดของบล็อกความคิดเห็นดูเหมือนว่ามันจะค่อนข้างตรงไปตรงมา


1
อา, อันนี้ง่าย / สะอาดพอที่จะจำ!
Thamme Gowda

1
ดังที่บันทึกไว้คำตอบก่อนหน้านี้นอกเหนือจาก backquotes ลำดับ $ (... ) จะถูกขยายเนื่องจากทั้งสองแบบเป็นการทดแทนคำสั่ง
Perl Ancar

"ทั้งคู่เป็นแฮ็คดังนั้นพวกเขาจึงสามารถทำลายสคริปต์ในอนาคต" คุณสามารถขยายสิ่งนี้ได้ไหม? แม้ว่าแฮ็กจะมีความหมายทาง syntactically พวกเขาจะถูกต้องและไม่ควรทำลายในอนาคตเว้นแต่ทุบตีตัดสินใจที่จะไปบ้าดีเดือดและทำลาย heredocs
Perl Ancar

@perlancar ถ้าเรายอมรับว่า hacks เป็นวิธีแก้ปัญหาที่ใช้คุณสมบัติภาษา / lib ที่ไม่เกี่ยวข้องกับปัญหาอย่างสมบูรณ์ (เช่นใช้ heredoc เพื่อแสดงความคิดเห็นหรือใช้พารามิเตอร์ในคำสั่ง do-nothing เช่นtrue) แม้ว่าพวกเขาจะไม่สวมก็ตาม ไม่เสี่ยงต่อการถูกทำลาย (วิธี heredoc ไม่ได้ แต่รุ่นโคลอนทำ), 1) แฮ็กยังคงทำให้งงงวยเจตนา: โดยไม่มีบรรทัดแรกบอกใบ้เกี่ยวกับความคิดเห็นหลายบรรทัดส่วนใหญ่จะเกาหัวของพวกเขาสงสัยว่ารหัสกำลังทำอะไร และ 2) มีมุมมืดที่ไม่คาดคิด (เช่นต้องเพิ่มเครื่องหมายคำพูดเป็นสองเท่าให้อ้างอิงเครื่องหมาย heredoc ในบางกรณี ฯลฯ )
โอลิเวอร์

@Oliver: หากไม่ได้ระบุตัวแปรอาจมีผลข้างเคียงที่น่ารังเกียจ ลองจินตนาการว่าคุณมีการฝังตัวในของคุณheredoc -comment สตริงเช่นหรือ${FOO:=bar} ${FOO{}}ครั้งแรกอาจมีผลข้างเคียงในการสร้างและตั้งค่าตัวแปรFOOที่สองจะเพิ่ม ข้อผิดพลาดในการทดแทนที่ไม่ดี ; เอฟเฟกต์ทั้งสองที่คุณไม่คาดหวังจากความคิดเห็นจริง
user1934428

24

หลังจากอ่านคำตอบอื่น ๆ ที่นี่ฉันมาด้วยด้านล่างซึ่ง IMHO ทำให้ชัดเจนจริงๆมันเป็นความคิดเห็น เหมาะอย่างยิ่งสำหรับข้อมูลการใช้งานในสคริปต์:

<< ////

Usage:
This script launches a spaceship to the moon. It's doing so by 
leveraging the power of the Fifth Element, AKA Leeloo.
Will only work if you're Bruce Willis or a relative of Milla Jovovich.

////

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

แน่นอน"////"มันเป็นแค่สตริง จำนวนเครื่องหมายทับในส่วนนำหน้าและส่วนต่อท้ายต้องเท่ากัน


3
ฉันเกือบพลาดUsage:
RNA

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

มีคำตอบ "ด้านบน" เล็กน้อย (ขึ้นอยู่กับลำดับการเรียงของคุณ) และโดยการตอบแยกต่างหากฉันต้องการอธิบายเหตุผลเบื้องหลังสตริงที่ฉันเลือก
noamtm

<< EOF ... EOF
l mingzhi

5

คุณมีความคิดเห็นต่อเรื่องนี้อย่างไร

function giveitauniquename()
{
  so this is a comment
  echo "there's no need to further escape apostrophes/etc if you are commenting your code this way"
  the drawback is it will be stored in memory as a function as long as your script runs unless you explicitly unset it
  only valid-ish bash allowed inside for instance these would not work without the "pound" signs:
  1, for #((
  2, this #wouldn't work either
  function giveitadifferentuniquename()
  {
    echo nestable
  }
}

สวัสดีไม่ได้ตั้งใจเป็นคำถามแทนที่จะตอบคำถามดั้งเดิม
Imre

IMO ไม่ดี มันต้องมีความคิดเห็นที่จะแยกเป็นรหัสเปลือกซึ่งค่อนข้าง จำกัด
user1934428

3

นี่คือวิธีที่ฉันแสดงความคิดเห็นหลายบรรทัดในทุบตี

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

#!/bin/bash
# : <<'####.block.A'
echo "foo {" 1>&2
fn data1
echo "foo }" 1>&2
: <<'####.block.B'
fn data2 || exit
exit 1
####.block.B
echo "can't happen" 1>&2
####.block.A

ในตัวอย่างด้านบนบล็อก "B" ถูกใส่ความคิดเห็น แต่ส่วนของบล็อก "A" ที่ไม่ใช่บล็อก "B" จะไม่ได้รับการใส่ความคิดเห็น

การรันตัวอย่างนั้นจะสร้างเอาต์พุตนี้:

foo {
./example: line 5: fn: command not found
foo }
can't happen

3

ฉันลองคำตอบที่เลือกแล้ว แต่พบเมื่อฉันรันเชลล์สคริปมันทั้งหมดก็จะถูกพิมพ์ไปที่หน้าจอ (คล้ายกับว่าโน๊ตบุ๊ค jupyter พิมพ์ทุกอย่างด้วย'''xx'''เครื่องหมายคำพูด) และมีข้อความแสดงข้อผิดพลาดในตอนท้าย มันก็ไม่ได้ทำอะไร แต่: น่ากลัว จากนั้นฉันก็รู้ว่าในขณะที่แก้ไขมันราคาเดียวสามารถขยายหลายบรรทัด ดังนั้น .. ขอเพียงแค่กำหนดบล็อกให้กับตัวแปร

x='
echo "these lines will all become comments."
echo "just make sure you don_t use single-quotes!"

ls -l
date

'

ไม่จำเป็นต้องกำหนดให้กับตัวแปรซึ่งเป็นผลข้างเคียงที่เราไม่คาดหวังจาก 'ความคิดเห็น' แทนที่x=ด้วย a : และคุณมีเอฟเฟกต์เดียวกันโดยไม่มีผลข้างเคียง ข้อเสียเปรียบเพียงอย่างเดียวคือความคิดเห็นนั้นจะต้องไม่มีคำพูดเดียว นั่นเป็นเหตุผลที่ฉันชอบการใช้ heredoc ที่อ้างถึง: ด้วยสิ่งนี้ผู้แสดงความคิดเห็นสามารถเลือกสตริงการเลิกจ้างที่เหมาะสมตามที่เขาชอบ
user1934428

2

วิธีแก้ปัญหาง่าย ๆ ไม่ฉลาดมาก:

บล็อกส่วนหนึ่งของสคริปต์ชั่วคราว:

if false; then
    while you respect syntax a bit, please
    do write here (almost) whatever you want.
    but when you are
    done # write
fi

รุ่นที่ซับซ้อนเล็กน้อย:

time_of_debug=false # Let's set this variable at the beginning of a script

if $time_of_debug; then # in a middle of the script  
    echo I keep this code aside until there is the time of debug!
fi

-2

# ฉันชอบความเกียจคร้านและความเรียบง่าย ฉันใช้ # กับวิธีแก้ปัญหาตลก:

1 กด:] ค้นหา ctrl + F หรือ cmd + F หรืออะไรก็ตาม [เพื่อเรียกใช้ฟังก์ชันการค้นหา

2 ใช้ regex ในช่องค้นหาเช่น: (^.+)

3 แทนที่ด้วย: # $1หรือหากคุณต้องการ#$1


# หมายเหตุ: คุณอาจไม่มีสามขั้นตอนในโปรแกรมแก้ไขของคุณ ในกรณีนั้นให้ใช้เครื่องมือ regex ออนไลน์ (ไม่สามารถแนะนำหนึ่งที่นี่เพื่อเหตุผลด้านนโยบาย):

  1. เลือกคัดลอกข้อความทุกที่และวางไว้ในเครื่องมือ regex ออนไลน์
  2. ใช้(^.+)เป็น regex และ#$1หรือ#\1เป็นรูปแบบการทดแทน
  3. เลือกคัดลอกข้อความและวางกลับที่ที่คุณเริ่ม

# เพลิดเพลินกับแฮชของคุณ!


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