최근에 저는 이전에 본 적이 없는 유형의 여러 줄 주석을 우연히 발견했습니다. 다음은 예제 스크립트입니다.
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{|}~