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
Lajos Nagy
fonte
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

Rafareino
fonte
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
Dan
fonte
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.

Ignacio Vazquez-Abrams
fonte
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
Karoly Horvath
fonte
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
KylePDavis
fonte
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
leedm777
fonte
1
droga, eu adicionei #sem um único espaço em branco após o comando. obrigado!
asgs
1

Se você souber que uma variável está vazia, use-a como um comentário. Obviamente, se não estiver vazio, ele estragará seu comando.

ls -l $ {1 # -F está desativado} -a / etc

§ 10.2 Substituição de Parâmetros

Steven Penny
fonte
Use ${name:=comment}para ser seguro.
Can-ned_food
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.
Ondra Žižka
fonte
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.

Jonathan Leffler
fonte