Maneira de criar comentários multilinhas no Bash?

226

Recentemente, comecei a estudar shell script e gostaria de poder comentar um conjunto de linhas em um shell script. Quero dizer, como é no caso de C / Java:

/* comment1
   comment2 
   comment3
*/`

Como eu pude fazer isso?

Enes Malik Turhan
fonte
2
Você pode usar o hash como: # isto é um comentário.
Mohammad Tayyab
1
Eu sei, mas é um pouco problemático para multilinhas.
Enes Malik Turhan
2
Note-se que as respostas abaixo exigem que :esteja na primeira coluna (sem espaços à esquerda) na linha.
Ty

Respostas:

394

Use : 'para abrir e 'fechar.

Por exemplo:

: '
This is a
very neat comment
in bash
'
Vegas
fonte
27
:( e também adiciona uma grande quantidade de leitura un-capacidade e potencial bug-source IMHO é melhor usar apenas múltiplas. #S e nunca mais isso ...
jm666
51
@ jm666 IMHO Nunca é uma boa idéia usar a palavra nunca quando você não tem idéia de todos os casos de uso.
Inverno
19
explicar: :é uma abreviação para truee truenão processa nenhum parâmetro. (página do manual:SYNOPSIS true [ignored command line arguments]
phil294
46
O espaço entre :e 'é importante
Becko
23
Eu modifiquei isso levemente para blocos de código para poder ativar ou desativar o código facilmente. Minha alteração é usar # 'na última linha, em vez de aspas simples. Dessa forma, posso colocar um único #na primeira linha para ativar o bloco de código. Remova a #primeira linha para desativar o código.
JohnMudd
131

Comentário multilinha no bash

: <<'END_COMMENT'
This is a heredoc (<<) redirected to a NOP command (:).
The single quotes around END_COMMENT are important,
because it disables variable resolving and command resolving
within these lines.  Without the single-quotes around END_COMMENT,
the following two $() `` commands would get executed:
$(gibberish command)
`rm -fr mydir`
comment1
comment2 
comment3
END_COMMENT
David Okwii
fonte
4
Isso funciona, a resposta atualmente aceita não funciona (para mim).
Freek
5
Provavelmente vale a pena notar que este não é um comentário em si. Este é um heredoc que é redirecionado para o comando NOP como uma sequência de várias linhas. Aspas simples são importantes para desativar a resolução de variáveis ​​e comandos.
Nux
1
@Freek precisa adicionar espaço
mazs
Eu testei isso em um script bash simples que roda via linha shebang, #! / Bin / bash no Debian e falhou. Estou tentando cada resposta nesta página, e todas falharam até que eu cheguei na abaixo. Desde que eles falharam, eu estou votando para baixo e votando para cima aquele que realmente funciona corretamente.
PyTis 5/10/19
1
Bons testes no seu exemplo. A liderança :não é necessária. Basta começar <<.
22619 wisbucky
34

Como estou atualizando esta postagem com base em comentários e outras respostas, os comentários anteriores a 22 de maio de 2020 podem não se aplicar mais.

O Bash não fornece uma sintaxe interna para comentários de várias linhas, mas há hacks usando a sintaxe do bash existente que "funcionam agora".

Pessoalmente, acho que o mais simples (ou seja, menos barulhento, menos estranho, mais fácil de digitar, mais explícito) é usar um HEREDOC citado, mas torne óbvio o que você está fazendo e use o mesmo marcador HEREDOC em todos os lugares:

<<'### BLOCK COMMENT'
line 1
line 2

line 3
line 4
### BLOCK COMMENT

A citação única do marcador HEREDOC evita alguns efeitos colaterais da análise de shell, como subsecções estranhas que causariam falha ou saída e até mesmo a análise do próprio marcador. Portanto, as aspas simples oferecem mais liberdade no marcador de comentário de abertura / fechamento. Por exemplo, o seguinte usa um hash triplo, que sugere um comentário de várias linhas no bash. Isso travaria o script se as aspas simples estivessem ausentes. Mesmo que você o remova ###, FOO{}ele travaria o script (ou causaria uma substituição incorreta, se não houver set -e), se não fossem as aspas simples:

set -e

<<'### BLOCK COMMENT'
something something ${FOO{}} something
more comment
### BLOCK COMMENT

ls

Você poderia, é claro, apenas usar

set -e

<<'###'
something something ${FOO{}} something
more comment
###

ls

mas a intenção disso é definitivamente menos clara para um leitor não familiarizado com esse truque.

Atualmente, qualquer bom editor permite que você pressione ctrl- / ou similar, para desmarcar / comentar a seleção. Todo mundo definitivamente entende isso:

# something something ${FOO{}} something
# more comment
# yet another line of comment

embora seja certo que isso não seja tão conveniente quanto o comentário em bloco acima, se você quiser preencher novamente seus parágrafos.

Certamente existem outras técnicas, mas não parece haver uma maneira "convencional" de fazê-lo. Seria bom se ###>e ###<pudesse ser adicionado ao bash para indicar o início e o fim do bloco de comentários, parece que poderia ser bem direto.

Oliver
fonte
1
Ah, este é fácil / limpo o suficiente para lembrar!
Thamme Gowda
1
Como observa a resposta anterior, além das aspas, a sequência $ (...) também será expandida, pois os dois formulários são substituídos por comandos.
Perl Ancar
"Ambos são hacks, para que possam quebrar scripts no futuro." Você poderia expandir isso? Embora hackear semanticamente, sintaticamente, eles são válidos e não devem ser interrompidos no futuro, a menos que o bash decida enlouquecer e quebre heredocs.
Perl Ancar
@perlancar Se concordarmos que hacks são soluções que usam um recurso de linguagem / lib que não tem nenhuma relação com o problema (como usar um heredoc para comentar ou usar um parâmetro em um comando do-nothing true), mesmo que não corre o risco de quebrar (a abordagem do heredoc não, mas a versão do cólon), 1) os hacks ainda ofuscam a intenção: sem a primeira linha sugerindo comentários multilinha, a maioria iria coçar a cabeça imaginando o que esse código está fazendo; e 2) têm cantos escuros inesperados (como precisar dobrar uma cotação, citar o marcador heredoc em certos casos, etc.).
Oliver
@ Oliver: Se não estiver entre aspas, as variáveis podem ter efeitos colaterais desagradáveis. Imagine que você tenha incorporado em seu heredoc -comment uma string como ${FOO:=bar}ou ${FOO{}}. O primeiro pode ter o efeito colateral de criar e definir a variável FOO; o segundo gera um erro de substituição incorreto; ambos os efeitos que você não esperaria de um comentário real.
user1934428
24

Depois de ler as outras respostas aqui, vim com o abaixo, que o IMHO deixa bem claro que é um comentário. Especialmente adequado para informações de uso no script:

<< ////

Usage:
This script launches a spaceship to the moon. It's doing so by 
leveraging the power of the Fifth Element, AKA Leeloo.
Will only work if you're Bruce Willis or a relative of Milla Jovovich.

////

Como programador, a sequência de barras é registrada imediatamente no meu cérebro como um comentário (mesmo que as barras sejam normalmente usadas para comentários de linha).

Claro, "////"é apenas uma string; o número de barras no prefixo e no sufixo deve ser igual.

noamtm
fonte
3
Eu quase perdi oUsage:
RNA
Ótimo complemento para a resposta acima. Sinceramente, acho que você poderia ter editado a resposta acima e a adicionado, em vez de responder separadamente.
PyTis 5/10/19
Existem algumas respostas "acima" (dependendo da sua ordem de classificação). E, respondendo separadamente, eu queria explicar a lógica por trás da string que eu escolhi.
noamtm
<< EOF ... EOF
precisa saber é o seguinte
5

qual a sua opinião sobre este?

function giveitauniquename()
{
  so this is a comment
  echo "there's no need to further escape apostrophes/etc if you are commenting your code this way"
  the drawback is it will be stored in memory as a function as long as your script runs unless you explicitly unset it
  only valid-ish bash allowed inside for instance these would not work without the "pound" signs:
  1, for #((
  2, this #wouldn't work either
  function giveitadifferentuniquename()
  {
    echo nestable
  }
}
Imre
fonte
Olá, não foi concebido como uma pergunta, em vez de uma resposta para a pergunta original
Imre
Não é bom OMI. Requer que o comentário seja analisável como código de shell, o que é bastante restritivo.
user1934428
3

Veja como eu faço comentários com várias linhas no bash.

Esse mecanismo tem duas vantagens que eu aprecio. Uma é que os comentários podem ser aninhados. A outra é que os blocos podem ser ativados simplesmente comentando a linha inicial.

#!/bin/bash
# : <<'####.block.A'
echo "foo {" 1>&2
fn data1
echo "foo }" 1>&2
: <<'####.block.B'
fn data2 || exit
exit 1
####.block.B
echo "can't happen" 1>&2
####.block.A

No exemplo acima, o bloco "B" é comentado, mas as partes do bloco "A" que não são o bloco "B" não são comentadas.

A execução desse exemplo produzirá esta saída:

foo {
./example: line 5: fn: command not found
foo }
can't happen
bugi
fonte
3

Tentei a resposta escolhida, mas descobri que, quando rodava um script de shell, a coisa toda estava sendo impressa na tela (semelhante à maneira como os cadernos jupyter imprimem tudo entre '''xx'''aspas) e havia uma mensagem de erro no final. Não estava fazendo nada, mas: assustador . Então, ao editar, percebi que aspas simples podem se estender por várias linhas. Então .. vamos apenas atribuir o bloco a uma variável.

x='
echo "these lines will all become comments."
echo "just make sure you don_t use single-quotes!"

ls -l
date

'
Nikhil VJ
fonte
Apenas não há necessidade de atribuí-lo a uma variável, que é um efeito colateral que não esperaríamos de um 'comentário'. Substitua x=por por : e você tem o mesmo efeito sem efeito colateral. A única desvantagem é que o comentário não deve conter uma única citação. É por isso que prefiro o uso de um heredoc citado: com isso, o comentarista pode escolher uma sequência de terminação adequada como desejar.
user1934428
2

Solução simples, pouco inteligente:

Bloqueie temporariamente uma parte de um script:

if false; then
    while you respect syntax a bit, please
    do write here (almost) whatever you want.
    but when you are
    done # write
fi

Uma versão um pouco sofisticada:

time_of_debug=false # Let's set this variable at the beginning of a script

if $time_of_debug; then # in a middle of the script  
    echo I keep this code aside until there is the time of debug!
fi
xerostomus
fonte
-2

# Eu gosto de preguiça e simplicidade. Eu usaria # com uma solução alternativa engraçada:

1 PRESSIONE:] encontre ctrl + F ou cmd + F ou o que for [para ativar a funcionalidade de localização

2 use uma regex no campo de localização, como: (^.+)

3 substitua por: # $1ou se você preferir#$1


# Nota: você pode não ter as três etapas no seu editor. Nesse caso, use uma ferramenta de regex online (não é possível sugerir uma aqui por motivos de política):

  1. Selecione, copie o texto onde quer que esteja e cole-o na ferramenta regex online
  2. Use (^.+)como regex e #$1ou #\1como padrões de substituição
  3. Selecione, copie o texto e cole-o de volta onde você começou

# Aproveite seus hashes!

AMDP
fonte
Atualmente, muitos editores têm a tecla de atalho ctrl+/que ativa ou desativa os comentários, mesmo para várias linhas. Ele também pode alterar o caractere de comentário com base no idioma que você está usando.
NinMonkey 7/09/19