여러 줄로 된 쉘 스크립트 주석-어떻게 작동합니까?


92

최근에 나는 전에 본 적이없는 여러 줄 주석 유형을 우연히 발견했습니다-여기 스크립트 예제가 있습니다.

echo a
#
: aaa 
: ddd 
#
echo b

이것은 vim구문이 강조되는 것처럼 작동하는 것처럼 보입니다 . 이 스타일의 주석은 무엇이며 이에 대한 추가 정보를 찾는 방법은 무엇입니까?


1
대신 코드를 함수로 묶어 주석 처리하면 어떻게 될까요? CommentedOutBlock() { echo "test"; }
Buksy

답변:


135

그것은 여러 줄 주석이 아닙니다. #한 줄 주석입니다. :(콜론) 은 전혀 주석이 아니라 기본적으로 NOP 인 쉘 내장 명령입니다 . 널 연산 true( 예 : $?부작용으로 0으로 설정)과 같이 true를 반환하지 않는 null 연산입니다 . 그러나 명령이므로 인수를 사용할 수 있으며 인수를 무시하므로 대부분 주석처럼 피상적으로 작동합니다. 이 kludge의 주요 문제점은 논증이 여전히 확장되어 의도하지 않은 결과가 발생한다는 것입니다. 인수는 여전히 리디렉션은 여전히 수행, 구문 오류에 의해 영향을 : > file자릅니다 file: $(dangerous command)대체는 여전히 실행됩니다.

쉘 스크립트에 주석을 삽입하는 가장 놀라운 방법은입니다 #. 여러 줄로 된 주석에도 충실하십시오. 댓글 에 (ab) 사용 하지 마십시오: . 쉘에는 슬래시 스타 /* */형식과 C유사한 언어로 된 전용 다중 행 주석 메커니즘이 없습니다 .


완전성을 위해 권장되는 방법이 아니기 때문에 여기에 여러 문서 "설명"을 작성 하기 위해 여기 문서 를 사용할 수 있다고 언급 할 것입니다 .

: <<'end_long_comment'
This is an abuse of the null command ':' and the here-document syntax
to achieve a "multi-line comment".  According to the POSIX spec linked 
above, if any character in the delimiter word ("end_long_comment" in 
this case) above is quoted, the here-document will not be expanded in 
any way.  This is **critical**, as failing to quote the "end_long_comment" 
will result in the problems with unintended expansions described above. 
All of this text in this here-doc goes to the standard input of :, which 
does nothing with it, hence the effect is like a comment.  There is very 
little point to doing this besides throwing people off.  Just use '#'.
end_long_comment

29
작은 따옴표를 유지하는 것이 매우 중요합니다 <<.
glenn jackman

4
주석으로 쉘 스크립트를 채우면 :RAM / CPU가 추가로 소비됩니다. 그것은 당신의 바탕 화면에 간단한 것들에 대한 이잖아요하지 않습니다하지만 만약 뭔가 두 번째는 것입니다 수백 번, 수천 실행되지 거대한 빨리 일을 할 것도, .
바하마

3
@bahamat : 만약 당신이 1 초에 수백 또는 수천 번 무언가를 실행한다면, 나는 그것을 쉘에 쓰지 않기를 바란다 ... = /
7heo.tk

1
때로는 여러 줄의 텍스트에 null 유틸리티를 사용하는 것이 유용 할 수 있습니다. 주석으로 시작하면 쉘 스크립트에서 POD: <<=cut작성할 수 있습니다 . 자세한 내용은이 예제를 참조하십시오 . 이것으로 사용할 수 있습니다 perldoc script.sh. 그러나이 답변에 표시된 여러 줄 주석은 주석 블록이어야합니다 (각 줄은로 시작 # ).
basic6

: 여기에 (심지어 dynaimc 스크립트 세대 포함)의 의견과 다른 흥미로운 사용 사례 모두에 사용 heredocs에 좋은 토론의 tldp.org/LDP/abs/html/here-docs.html#EX71C
bguiz

28

어떤 스타일의 주석도 아닙니다. :내장 명령은 절대적으로 아무것도하지 않는다; 여기에 댓글을 남용하여 남용되고 있습니다.

$ help :
:: :
    Null command.

    No effect; the command does nothing.

    Exit Status:
    Always succeeds.

25

초기 쉘에서는 콜론이 주석을 작성하는 유일한 방법이었습니다.

그러나 다른 명령을 구문 분석 할 때와 동일한 방식으로 행이 구문 분석되고 부작용이있을 수 있으므로 실제 주석이 아닙니다. 예를 들면 다음과 같습니다.

: ${a:=x} # assigns the value 'x' to the variable, 'a'

: $(command) # executes 'command'

(때로는 콜론이 부작용을 유발할 목적으로 만 사용되지만 주석으로 사용되지는 않습니다.)

콜론을 사용하여 스크립트 섹션을 주석 처리하는 것이 편리한 경우가 있습니다.

: '
while [ "$n" -ne "$x" ]
do
  : whatever
done
'

이것은 #주석 처리가 일시적인 경우 특히 각 행 앞에있는 시간을 크게 절약 합니다.


2
작은 따옴표 주석 달기 방법은 작은 따옴표를 사용하는 스크립트 섹션에서는 작동하지 않습니다. 그리고 필요한만큼 따옴표를 사용하는 경우, 스크립트 전체에 합법적 인 작은 따옴표가 뿌려집니다. 라인 단위 주석을 차단할 수있는 괜찮은 편집기를 사용하는 것이 훨씬 간단합니다.
jw013

인용 된 섹션에 작은 따옴표가없는 경우에만 작동 할 것입니다. 그러나 스크립트에는 작은 따옴표가 많이 필요하지 않습니다. 내 스크립트 중 일부를 살펴보면 상대적으로 드문 드문 한 것이 많으며 많은 사람들이 큰 따옴표로 바꿀 수 있습니다.
크리스 FA 존슨

작은 따옴표 또는 큰 따옴표의 선택은 사소하고 스크립트 텍스트 자체가 유효한 작은 따옴표 문자열인지 여부와 관련이없는 사소한 영향을받지 않아야합니다. 작은 따옴표는 확장을 방지하는 데 사용되는 반면 큰 따옴표는 특정 확장을 허용하고 추가 구문 분석이 필요합니다. 이것은 어떤 것을 사용할 것인지 결정하기위한 실제 기준입니다.
jw013

이것은 지금까지 가장 세련된 방법입니다. 작은 문서 블록에 적합합니다. 나는 그것을 좋아 /* */하고 웃어, 나를 시작하지 마십시오 <!-- -->!
alex grey

1

주석이 스크립트 끝에 있으면 다음과 같이 할 수 있습니다.

#!/bin/sh
echo 'hello world'
exec true
we can put whatever we want here
\'\"\$\`!#%&()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_
abcdefghijklmnopqrstuvwxyz{|}~
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.