여러 줄의 쉘 스크립트 주석 - 어떻게 작동하나요?

여러 줄의 쉘 스크립트 주석 - 어떻게 작동하나요?

최근에 저는 이전에 본 적이 없는 유형의 여러 줄 주석을 우연히 발견했습니다. 다음은 예제 스크립트입니다.

echo a
#
: aaa 
: ddd 
#
echo b

이것은 작동하는 것 같습니다. 심지어 vim구문 강조도 작동합니다. 이런 댓글 스타일을 뭐라고 부르나요? 이에 대한 추가 정보를 어떻게 찾을 수 있나요?

답변1

이것은 여러 줄 주석이 아닙니다. #한줄 코멘트입니다. :(콜론)전혀 주석이 아니라 쉘 내장 명령입니다.아니요, 아무것도 하지 않고 true를 반환하는 null 연산입니다 true(따라서 $?부작용으로 0으로 설정됨). 그러나 명령이기 때문에 인수를 받아들일 수 있고, 인수를 무시하기 때문에 대부분의 경우 표면적으로는 주석처럼 작동합니다. 이번 패치워크의 주요 문제점은 논쟁이 계속해서 확대되어 의도하지 않은 결과가 많이 나온다는 것입니다. 매개변수는 여전히 구문 오류의 영향을 받고, 리디렉션이 계속 수행되므로 : > 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

답변2

이것은 어떤 리뷰 스타일도 아닙니다. 내장 :명령은 전혀 아무 작업도 하지 않습니다. 여기에서는 주석으로 인해 남용되었습니다.

$ help :
:: :
    Null command.

    No effect; the command does nothing.

    Exit Status:
    Always succeeds.

답변3

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

그러나 이 줄은 다른 명령과 정확히 동일한 방식으로 구문 분석되고 부작용이 있을 수 있으므로 이는 실제 주석이 아닙니다. 예를 들어:

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

: $(command) # executes 'command'

(콜론은 이러한 사이드 이펙트를 호출할 목적으로만 사용되기도 하지만, 그 때는 주석으로 사용되지 않습니다.)

때로는 콜론을 사용하여 스크립트의 일부를 주석 처리하는 것이 편리할 때도 있습니다.

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

이렇게 하면 각 줄에 접두사를 붙이는 것보다 많은 시간을 절약할 수 있습니다 #. 특히 주석이 일시적인 경우라면 더욱 그렇습니다.

답변4

귀하의 의견이 스크립트 끝에 있는 경우 다음을 수행할 수 있습니다.

#!/bin/sh
echo 'hello world'
exec true
we can put whatever we want here
\'\"\$\`!#%&()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_
abcdefghijklmnopqrstuvwxyz{|}~

관련 정보