Comentários embutidos para Bash?


142

Eu gostaria de comentar um único sinalizador em um comando de uma linha. Bash apenas parece ter from # till end-of-linecomentários. Estou vendo truques como:

ls -l $([ ] && -F is turned off) -a /etc

É feio, mas melhor que nada. Existe uma maneira melhor?

O seguinte parece funcionar, mas não tenho certeza se é portátil:

ls -l `# -F is turned off` -a /etc

O #commenttruque também é mencionado aqui: stackoverflow.com/questions/9522631/…
Juha Palomäki

1
Seguindo o link mencionado por @Juha Palomäki, existe esse truque maravilhoso ${IFS#comment}introduzido por @pjh nos comentários. Nenhum sub-shell é chamado.
Alexis

Respostas:


110

O meu preferido é:

Comentando em um script Bash

Isso terá alguma sobrecarga, mas tecnicamente ele responde à sua pergunta

echo abc `#put your comment here` \
     def `#another chance for a comment` \
     xyz etc

E para tubulações especificamente, existe uma solução mais limpa, sem custos indiretos

echo abc |        # normal comment OK here
     tr a-z A-Z | # another normal comment OK here
     sort |       # the pipelines are automatically continued
     uniq         # final comment

Como colocar um comentário de linha para um comando de várias linhas


3
Observe que você precisa usar reticulares, $(#comment)não funciona.
funroll 27/09/16

1
Algumas versões considerarão isso )como parte do próprio comentário. A maioria dos desafios do bash se deve à retro compatibilidade com versões mais antigas, e uma estratégia comum é usar a solução mais antiga possível.
Rafareino

2
Observe que este não é um comentário real: true && `# comment` && trueé uma expressão válida. Um comentário real geraria algo como: syntax error near unexpected token && ''
Sebastian Wagner

Você está certo, @sebastianwagner, observe também que isso falharia em um curto-circuito OR ou algo assim, mas acho que é o melhor possível, sem complicar muito as coisas. Para mim, é um sinal de que precisamos de uma linguagem melhor, mas ela pode se sair bem, mantendo o código já construído com esses comentários para documentá-lo.
Rafareino 13/09/19

Obrigado que me ajudou!
Xiarnousx # 6/18

58

Acho mais fácil (e mais legível) copiar a linha e comentar a versão original:

#Old version of ls:
#ls -l $([ ] && -F is turned off) -a /etc
ls -l -a /etc

Voto positivo para maior clareza. Não sei por que essa não é a primeira opção.
David Tabernero M.

mas então não está embutido? eu suponho que o seu justo dizer que a necessidade de fazer as coisas desta não suportados pelo bash é causa para encontrar uma outra maneira
ThorSummoner

25

$(: ...) é um pouco menos feio, mas ainda não é bom.


2
Com esta sintaxe, você está disparando um sub-shell, um comentário deve melhorar a redabilidade sem alterar o comportamento do código, mas o tempo para lançar / finalizar esse sub-shell fará com que seu código seja mais lento (para dizer o mínimo), por que não usar apenas dois pontos no início de uma nova linha?
Rafareino 26/05

1
Com $ {IFS # ...}, nenhum sub-shell é chamado.
12135 alexis

3
@Rafareino: sim. Mas, falando sério, em 95% dos aplicativos, essa sobrecarga não importa. Para muitos dos casos em que isso importa, provavelmente seria uma boa ideia usar um idioma mais rápido que o Bash.
usar o seguinte comando

... o problema é que a $(: ...)sintaxe não parece permitir comentários incorporados: enquanto echo "foo" `# comment` "bar"o comentário será finalizado no segundo backtick, o suposto equivalente echo "foo" $(: # comment) "bar"não analisa nada por trás do #.
precisa saber é o seguinte

4

Que tal armazená-lo em uma variável?

#extraargs=-F
ls -l $extraargs -a /etc

4

Aqui está minha solução para comentários embutidos entre vários comandos canalizados.

Exemplo de código não comentado:

    #!/bin/sh
    cat input.txt \
    | grep something \
    | sort -r

Solução para um comentário de canal (usando uma função auxiliar):

    #!/bin/sh
    pipe_comment() {
        cat - 
    }
    cat input.txt \
    | pipe_comment "filter down to lines that contain the word: something" \
    | grep something \
    | pipe_comment "reverse sort what is left" \
    | sort -r

Ou, se preferir, aqui está a mesma solução sem a função auxiliar, mas é um pouco mais confusa:

    #!/bin/sh
    cat input.txt \
    | cat - `: filter down to lines that contain the word: something` \
    | grep something \
    | cat - `: reverse sort what is left` \
    | sort -r

7
Além disso, se você mover o caractere de pipe para o final da linha anterior, poderá se livrar das novas linhas de barra invertida.
tripleee

3

A maioria dos comandos permite que os argumentos cheguem em qualquer ordem. Basta mover os sinalizadores comentados para o final da linha:

ls -l -a /etc # -F is turned off

Em seguida, para ativá-lo, remova o comentário e remova o texto:

ls -l -a /etc -F

1
droga, eu adicionei #sem um único espaço em branco após o comando. obrigado!
asgs


1

Para desativar uma parte de um comando como a && b, simplesmente criei um script vazio xque está no caminho, para que eu possa fazer coisas como:

mvn install && runProject

quando eu preciso construir, e

x mvn install && runProject

quando não (usando Ctrl + Ae Ctrl + Epara ir para o início e o fim).

Conforme observado nos comentários, outra maneira de fazer isso é o Bash interno, em :vez de x:

$  : Hello world, how are you? && echo "Fine."
Fine.

2
Tal builtin já existe: :Como em:string; of; commands; : disabled; enabled;
xenithorb

Ainda melhor :) Obrigado
Ondra Žižka

-1

Se o comentário vale a pena ser feito, provavelmente ele pode ir no final da linha ou em uma linha por conta própria. Raramente acho necessário comentários dentro da linha com o código antes e depois do comentário em qualquer idioma.

Ah, há uma exceção, que é o dialeto do SQL que eu costumo usar que usa '{comments}'. Ocasionalmente, escreverei:

CREATE UNIQUE INDEX u1_table ON Table(...);
CREATE {DUPS} INDEX d1_table ON Table(...);

Mas mesmo isso é exagero.

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.