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:
:( 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
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.
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 BruceWillis or a relative of MillaJovovich.////
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.
Ó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 eitherfunction 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.
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;thenwhile you respect syntax a bit, please
do write here (almost) whatever you want.
but when you are
done# writefi
Uma versão um pouco sofisticada:
time_of_debug=false # Let's set this variable at the beginning of a scriptif $time_of_debug;then# in a middle of the script
echo I keep this code aside until there is the time of debug!fi
# 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):
Selecione, copie o texto onde quer que esteja e cole-o na ferramenta regex online
Use (^.+)como regex e #$1ou #\1como padrões de substituição
Selecione, copie o texto e cole-o de volta onde você começou
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.
:
esteja na primeira coluna (sem espaços à esquerda) na linha.Respostas:
Use
: '
para abrir e'
fechar.Por exemplo:
fonte
#
S e nunca mais isso ...:
é uma abreviação paratrue
etrue
não processa nenhum parâmetro. (página do manual:SYNOPSIS true [ignored command line arguments]
:
e'
é importante# '
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.Comentário multilinha no bash
fonte
:
não é necessária. Basta começar<<
.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:
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 houverset -e
), se não fossem as aspas simples:Você poderia, é claro, apenas usar
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:
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.fonte
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.).${FOO:=bar}
ou${FOO{}}
. O primeiro pode ter o efeito colateral de criar e definir a variávelFOO
; o segundo gera um erro de substituição incorreto; ambos os efeitos que você não esperaria de um comentário real.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:
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.fonte
Usage:
<< EOF ... EOF
qual a sua opinião sobre este?
fonte
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.
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:
fonte
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.fonte
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.Solução simples, pouco inteligente:
Bloqueie temporariamente uma parte de um script:
Uma versão um pouco sofisticada:
fonte
# 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:
# $1
ou 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):
(^.+)
como regex e#$1
ou#\1
como padrões de substituição# Aproveite seus hashes!
fonte
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.