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?


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
'

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

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.


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.


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


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
  }
}

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

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

'

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

-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!


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.