Comentários legíveis em linhas separadas em um comando bash de várias linhas com pipelines?

14

Ao criar scripts de shell usando pipelines e usando a barra invertida para continuar linhas, desejo inserir comentários em linhas separadas , de maneira robusta, legível e portátil.

Por exemplo, dado esse comando de várias linhas não comentado (roubado do @DigitalRoss por sua clareza):

echo abc |
     tr a-z A-Z |
     sort |
     uniq

... o abaixo é esteticamente o mais próximo do que eu quero realizar, mas por razões óbvias, não funciona ... e sim, eu estou ciente de que isso não é algo que vale a pena comentar:

# Perform critical system task.
# NOTE - An example of what does *not* work.
echo abc |
    # Convert lowercase to uppercase.
     tr a-z A-Z |

     # Sort the results.
     sort |

     # Only show unique lines.
     uniq

As respostas relacionadas existentes parecem insatisfatórias para mim , da seguinte maneira:

Primeiro, a resposta de glenn jackman (adicionando argumentos a uma matriz e, em seguida, executando a matriz) funciona para comandos únicos, mas não funciona para pipelining (e, mesmo que tivesse, adiciona complexidade que eu gostaria de evitar).

Segundo, a resposta do @Gilles aqui (que usa :) também não parece funcionar com o pipelining, porque altera o fluxo do pipeline:

$ echo "abc" | :
$

( OBSERVAÇÃO : Se houver um equivalente a :que passe a saída sem modificação, isso seria esteticamente aceitável, mas não consegui encontrar um. Eu poderia escrever um personalizado, mas reduziria a portabilidade.)

Finalmente, a última parte da resposta da DigitalRoss no StackOverflow funciona bem para adicionar comentários na mesma linha, mas eu prefiro fortemente comentários em linhas separadas. Caso contrário, quando as linhas tiverem comprimentos muito variados, a legibilidade será reduzida:

echo abc |         # normal comment OK here`
     /usr/local/bin/really/long/path/ridiculously-long-filename.sh |  # another normal comment OK here
     sort |        # the pipelines are automatically continued
     uniq          # final comment

Estou procurando respostas que preservem a legibilidade e minimizem a complexidade, ou então, algum histórico sobre por que o que estou procurando é inviável.

Royce Williams
fonte
1
Nota sobre seus comentários: fui ensinado a escrever comentários explicando uma seção ou unidade de trabalho. Se um codificador experiente escrever comentários inteligentes descrevendo o que está fazendo, presumivelmente qualquer pessoa que esteja mantendo o script sempre poderá usar páginas de manual se não entender os detalhes de uso. Nunca se deve escrever um comentário como esse i++; // increment i by one. Eu sugiro que você leia "os elementos de estilo de programação"
BSD
Eu acho que vou excluir a última edição. É incomum que uma pergunta contenha a pergunta, refutações de respostas e a resposta em si, mas a parte que explica por que outras respostas não funcionam é meio que necessária aqui. A resposta de rozcietrzewiacz e seu comentário juntos explicam o problema (pessoalmente, eu teria postado uma resposta separada e a aceito, já que o problema era bem diferente do que ele descreveu, mas isso funciona)
Michael Mrozek
Entendido - obrigado pelo feedback; lição aprendida!
Royce Williams

Respostas:

14

Que tal agora?

echo abc | \
# Convert lowercase to uppercase.
tr a-z A-Z | \

# Sort the results.
sort | \

# Only show unique lines.
uniq

(A barra invertida precisa ser usada como o último caractere nessas linhas.) Não tenho certeza sobre a portabilidade dessa abordagem, mas com certeza funciona com a corrente bash.

rozcietrzewiacz
fonte
Aha! (facepalm) Transformei o idioma que estava usando ao postar a pergunta sem perceber! Eu estava colocando o cano no início de cada linha, o que fico feliz em deixar de fazer agora que sei que esse método funciona bem em todos os sistemas que posso alcançar, tanto no bash quanto no sh. Obrigado!
Royce Williams
Esses comentários não arruinariam as continuações da linha?
Stuart P. Bentley
Enquanto houver uma linha vazia antes de cada comentário, ela funcionará bem.
Royce Williams