Comentários de script de shell multilinha – como isso funciona?

Recentemente, me 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 a sintaxe o realça. Qual é o nome desse estilo de comentário e como posso encontrar mais informações sobre ele?

Comentários

  • E se você agrupar seu código em funções para comentar? CommentedOutBlock() { echo "test"; }
  • Como outros já mencionaram, comentários de várias linhas não estão disponíveis nativamente. Então eu uso if false; então < quantas linhas você deseja > fi

Resposta

Este não é um comentário de várias linhas. # é um comentário de uma única linha. : (dois pontos) não é um comentário, mas sim um comando interno de shell que é basicamente um NOP , uma operação nula que não faz nada, exceto retornar verdadeiro, como true (e, portanto, definindo $? a 0 como efeito colateral). Porém, por ser um comando, ele pode aceitar argumentos e, como ignora seus argumentos, na maioria dos casos, superficialmente age como um comentário. O principal problema dessa confusão é que os argumentos ainda são expandidos, levando a uma série de consequências indesejadas. Os argumentos ainda são afetados por erros de sintaxe, os redirecionamentos ainda são executados, então : > file truncará file e : $(dangerous command) as 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á nenhum mecanismo dedicado de comentário de várias linhas no shell que seja análogo ao formato /* */ em C idiomas semelhantes. / p>


Para fins de integralidade, mas não porque seja uma prática recomendada, mencionarei que é possível usar here-documents para fazer “comentários” multilinhas:

: <<"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 

Comentários

  • +1 muito importante para mantenha as aspas simples na linha << – isso desativa a substituição e a expansão.
  • E como uma observação extra, preenchendo scripts de shell com : para coisas que deveriam ser comentários causarão consumo extra de RAM / CPU. Ele ganhou ' t mater para coisas simples em sua área de trabalho, mas se ' algo executado centenas ou milhares de vezes por segundo, você ' ll não faça nada, muito rápido .
  • @bahamat: se você executar algo centenas ou milhares de vezes por segundo, espero que você tenha ganhado ' t escrever no shell … = /
  • Às vezes, usando o utilitário null para várias linhas de o texto pode ser útil. Iniciar o comentário com : <<=cut torna possível escrever POD em scripts de shell, consulte este exemplo para obter detalhes . Isso torna possível usar perldoc script.sh. No entanto, o comentário de várias linhas mostrado nesta resposta é algo que definitivamente deveria ser um bloco de comentário (cada linha começando com # ).
  • Aqui ' uma boa discussão sobre heredocs, usada para comentários e outros casos de uso interessantes (até mesmo incluindo geração de script dynaimc): tldp.org/LDP/ abs / html / here-docs.html # EX71C

Resposta

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

$ help : :: : Null command. No effect; the command does nothing. Exit Status: Always succeeds. 

Resposta

Nos primeiros shells, os dois pontos eram a única maneira de criar comentários.

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

: ${a:=x} # assigns the value "x" to the variable, "a" : $(command) # executes "command" 

(Às vezes, os dois pontos são usados apenas para invocar esses efeitos colaterais, mas não estão sendo usados como um comentário.)

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

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

Isso economiza muito tempo em relação a cada linha com #, especialmente se o comentário for apenas temporário.

Comentários

  • Aquele único- o método de comentário de citações não ' funciona em nenhuma seção do script que use aspas simples.E se você estiver usando aspas quase tanto quanto deveria, isso significa que ' terá aspas simples legítimas espalhadas por todo o script. É muito mais simples usar qualquer editor decente que permita bloquear comentários em linha.
  • Você está certo de que só funcionará se não houver aspas simples na seção citada. No entanto, um script não precisa ter muitas aspas simples. Ao examinar alguns dos meus scripts, eu os acho relativamente esparsos e muitos poderiam ser substituídos por aspas duplas.
  • A escolha de aspas simples ou duplas dificilmente deve ser influenciada por algo tão trivial e irrelevante como preocupação quanto ao fato de o texto do seu script ser uma string válida entre aspas simples. As aspas simples são usadas para evitar expansões, enquanto as aspas duplas permitem certas expansões e requerem análise extra. Este é o verdadeiro critério para determinar qual usar.
  • Esta é de longe a maneira mais chique de fazer isso. Ótimo para pequenos blocos de documentação. Eu gosto mais disso do que /* */ e ugh, não ' t me deixe começar em <!-- --> !

Resposta

Se o seu comentário estiver 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{|}~ 

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *