Comentários do script de shell Multiline - como isso funciona?

86

Recentemente, deparei com um tipo de comentário de várias linhas que nunca vi antes - aqui está um exemplo de script:

echo a
#
: aaa 
: ddd 
#
echo b

Isso parece funcionar, mesmo vim syntax-destaca isso. O que é esse estilo de comentário chamado e como posso encontrar mais informações sobre ele?

    
por Wiesław Herr 27.04.2012 / 07:50

4 respostas

129

Esse não é um comentário de várias linhas. # é um comentário de linha única. : (colon) não é um comentário, mas um shell criado Em um comando que é basicamente um NOP , uma operação nula que não faz nada exceto retornar true, como true (e assim definindo $? para 0 como efeito colateral). No entanto, como é um comando, ele pode aceitar argumentos e, como ignora seus argumentos, na maioria dos casos, age superficialmente como um comentário. O principal problema com este kludge é que os argumentos ainda são expandidos, levando a uma série de conseqüências não intencionais. Os argumentos ainda são afetados por erros de sintaxe, os redirecionamentos ainda são executados, então : > file truncará file e : $(dangerous command) substituições ainda serão executadas.

A maneira menos surpreendente e completamente segura de inserir comentários em scripts de shell é com # . Atenha-se a isso mesmo para comentários de várias linhas. Nunca tente (ab) usar : para comentários. Não há um mecanismo dedicado de comentário de várias linhas no shell que seja análogo ao formato /* */ da barra invertida em% linguagens como C .

Por uma questão de perfeição, mas não porque seja uma prática recomendada, vou mencionar que é possível usar aqui-documents para fazer" comentários "com várias linhas:

: <<'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
    
por 27.04.2012 / 08:07
28

Não é um estilo de comentário. o comando interno : não faz absolutamente nada; está sendo abusado por comentar aqui.

$ help :
:: :
    Null command.

    No effect; the command does nothing.

    Exit Status:
    Always succeeds.
    
por 27.04.2012 / 07:55
24

Nos primeiros shells, o cólon era a única maneira de criar comentários.

No entanto, não é um comentário verdadeiro, porque a linha é analisada exatamente da mesma forma que qualquer outro comando é analisado, e isso pode ter efeitos colaterais. Para exemplo:

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

: $(command) # executes 'command'

(Às vezes, o cólon é usado apenas com o propósito de invocar esse lado efeitos, mas não está sendo usado como comentário.)

Às vezes, é conveniente usar os dois pontos para comentar uma seção de um script:

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

Este é um ótimo gasto de tempo sobre precedendo cada linha com # , particularmente se o comentar é apenas temporário.

    
por 16.01.2013 / 21:05
1

Se o seu comentário está no final do script, você pode fazer assim:

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