Bash에서 여러 줄 주석을 만드는 방법은 무엇입니까?


225

최근에 셸 스크립트를 공부하기 시작했으며 셸 스크립트에서 일련의 줄을 주석 처리하고 싶습니다. C / Java의 경우와 같습니다.

/* comment1
   comment2 
   comment3
*/`

내가 어떻게 할 수 있습니까?


2
#this는 주석입니다.
Mohammad Tayyab

1
알지만 멀티 라인에는 약간 번거 롭습니다.
Enes Malik Turhan

2
아래 답변은 :행의 첫 번째 열에 선행 공백이 없어야합니다.
ty

답변:


393

: '열고 '닫을 때 사용 합니다 .

예를 들면 다음과 같습니다.

: '
This is a
very neat comment
in bash
'

27
:(도 않은 읽기 능력과 잠재적 인 버그 소스의 큰 금액을 추가 이럴 더 나은 단지 여러 사용합니다. #s와 결코 이 ...
jm666을

51
@ jm666 이럴 결코 좋은 아이디어라는 단어를 사용하지합니다 않습니다 당신은 모든 사용 사례 아무 생각이 없을 때.
겨울

19
설명 : :대한 속기 truetrue매개 변수를 처리하지 않습니다. (수동 페이지 :SYNOPSIS true [ignored command line arguments]
phil294

46
사이의 공간 :과는 '중요하다
becko

23
코드 블록에 대해 약간 수정하여 코드를 쉽게 켜거나 끌 수 있습니다. 내 변경은 # '작은 따옴표 대신 마지막 줄 에서 사용 하는 것입니다. 이렇게하면 #코드 블록을 활성화하기 위해 첫 번째 줄에 하나 를 넣을 수 있습니다 . #첫 번째 줄을 제거하여 코드를 비활성화하십시오.
JohnMudd

131

bash의 여러 줄 주석

: <<'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
이것이 주석 자체가 아니라는 점에 주목할 가치가 있습니다. 이것은 여러 줄 문자열로 NOP 명령으로 리디렉션되는 heredoc입니다. 작은 따옴표는 변수 및 명령 해석을 비활성화하는 데 중요합니다.
Nux

1
@Freek는 공간을 추가해야합니다
mazs

데비안의 shebang 라인 #! ​​/ bin / bash를 통해 실행되는 간단한 bash 스크립트에서 이것을 테스트했지만 실패했습니다. 이 페이지의 각 답변을 시도하고 있으며 아래 답변에 도달 할 때까지 모두 실패했습니다. 그들이 실패했기 때문에 나는 그들을 투표하고 실제로 제대로 실행되는 것을 투표합니다.
PyTis

1
귀하의 예에서 좋은 테스트. 선행 :은 필요하지 않습니다. 로 시작하십시오 <<.
wisbucky

34

의견 및 기타 답변을 바탕으로이 게시물을 업데이트하고 있으므로 2020 년 5 월 22 일 이전의 의견은 더 이상 적용되지 않을 수 있습니다.

Bash는 여러 줄 주석에 대한 내장 구문을 제공하지 않지만 "지금 작동"하는 기존 bash 구문을 사용하는 핵이 있습니다.

개인적으로 나는 가장 간단한 (즉, 가장 시끄럽고, 가장 이상하고, 가장 타이핑하기 쉽고, 가장 명백한) 인용 된 HEREDOC을 사용하는 것이지만, 당신이하고있는 일을 분명히하고 모든 곳에서 동일한 HEREDOC 마커를 사용하는 것입니다.

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

line 3
line 4
### BLOCK COMMENT

HEREDOC 마커를 작은 따옴표로 묶으면 충돌이나 출력을 유발하는 이상한 대체 및 마커 자체의 구문 분석과 같은 일부 쉘 구문 분석 부작용을 피할 수 있습니다. 따라서 작은 따옴표를 사용하면 마감 종점 주석 표시를 더 자유롭게 사용할 수 있습니다. 예를 들어 다음은 트리플 해시를 사용하여 bash에서 여러 줄 주석을 제안합니다. 작은 따옴표가 없으면 스크립트가 중단됩니다. 제거해도 ###의가 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 2018

1
앞의 답변에서 언급했듯이, 역 따옴표 외에도, 두 형식이 명령 대체이므로 $ (...) 시퀀스도 확장됩니다.
Perl Ancar

"둘 다 해킹이므로 나중에 스크립트를 깨뜨릴 수 있습니다." 이것을 확장 할 수 있습니까? 의미 적으로 해킹이 있지만 구문 적으로는 해시가 유효하지만 앞으로 bash가 맹렬한 결정을 내리고 heredocs를 중단하지 않는 한 중단되지 않아야합니다.
Perl Ancar

@perlancar 우리가 해킹이 문제와 전혀 관련이없는 언어 / lib 기능을 사용하는 솔루션이라는 데 동의한다면 (예를 들어, heredoc을 주석에 사용하거나 같은 명령에 매개 변수를 사용하는 것과 같이 true) 위험을 감수하지 마십시오 (heredoc 접근 방식은 아니지만 콜론 버전은) 1) 해킹은 여전히 ​​의도를 혼란스럽게합니다. 여러 줄 주석에 대한 첫 번째 힌트가 없으면 대부분 코드가 무엇을하는지 궁금해합니다. 2) 예상치 못한 어두운 구석이 있습니다 (예 : 인용문을 두 배로 늘리거나 특정 경우 heredoc 마커를 인용하는 등).
Oliver

@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

bash에서 여러 줄 주석을 수행하는 방법은 다음과 같습니다.

이 메커니즘에는 두 가지 장점이 있습니다. 하나는 주석을 중첩 할 수 있다는 것입니다. 다른 하나는 시작 라인을 주석 처리하여 블록을 활성화 할 수 있다는 것입니다.

#!/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"블록은 주석 처리되지만 "B"블록이 아닌 "A"블록의 부분은 주석 처리되지 않습니다.

이 예제를 실행하면 다음과 같은 출력이 생성됩니다.

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

3

선택한 답변을 시도했지만 쉘 스크립트를 실행했을 때 모든 것이 화면에 인쇄되고 (주피터 노트북이 모든 것을 '''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 PRESS :] 찾기 기능을 트리거하기 위해 ctrl + F 또는 cmd + F 또는 기타를 찾습니다.

2 다음과 같이 찾기 필드에서 정규식을 사용하십시오. (^.+)

3 다음으로 교체하십시오 : # $1또는 원하는 경우#$1


# 참고 : 편집기에 세 단계가 없을 수 있습니다. 이 경우 온라인 정규식 도구를 사용하십시오 (정책상의 이유로 여기에서 제안 할 수 없음).

  1. 어디에서나 텍스트를 선택하고 복사하여 온라인 정규식 도구에 붙여 넣습니다.
  2. 사용 (^.+)정규식으로하고 #$1또는 #\1대체 패턴으로
  3. 텍스트를 선택하여 복사 한 다음 시작한 곳에 붙여 넣기

# 해시를 즐기십시오!


요즘 많은 편집자들은 ctrl+/여러 줄의 주석을 켜거나 끄는 단축키 를 가지고 있습니다. 또한 사용중인 언어에 따라 주석 문자를 변경할 수 있습니다.
ninMonkey
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.