Estou usando shdoc para gerar arquivos markdown para minhas funções bash; no entanto, gostaria de anexar também o corpo da função bash associada , bem como os comentários nesse corpo, ao arquivo markdown gerado por shdoc
. Como posso imprimir um corpo de função bash e, ao mesmo tempo, incluir os comentários no corpo da função?
Como um exemplo simples, considere que todos os meus arquivos bash estão contidos em um diretório chamado src
e todos esses arquivos terminam em .sh
. A função abaixo no arquivosrc/foo.sh
# @description A function that does something
foo() {
# oh wow, a comment
echo "something cool"
}
Agora, se eu quiser obter o corpo da função sem comentários, posso fazer isso facilmente, declare -f
conforme mostrado abaixo, em um arquivo chamado src/doc.sh
:
# assuming you are in the `src` dir and both .sh files are executable
. foo.sh
foo_doc=$(declare -f foo)
echo "$foo_doc"
Mas o problema é foo_doc
que só tem a função body, já queecho "$foo_doc"
foo ()
{
echo "something cool"
}
e nenhum comentário. Então, se eu fosse anexar essas informações a um markdown gerado por shdoc
, não seria uma documentação ideal do código-fonte.
Acho que uma abordagem seria usar sed
para determinar as linhas correspondentes à função de interesse (minhas funções bash são "delimitadas" por {
e }
, embora, pelos comentários, eu entenda que há outras maneiras de declarar funções bash válidas), então eu poderia usar sed
para obter apenas essas linhas, como feito aqui .
É um pouco complicado, mas você pode usar comentários com dois pontos:
Explicação:
:
em bash é um comando no-op. Você pode passar a ele quaisquer argumentos que quiser, e ele os ignora. Então esse "comentário" é, na verdade, tecnicamente um comando que faz parte do corpo da função que não faz nada. Você tem que ter cuidado, porém, se seus comentários incluÃrem caracteres especiais, você terá que colocá-los entre aspas.Como você tem acesso aos arquivos que contêm as definições de função, você pode fazer isso com qualquer awk POSIX:
Não é 100% robusto, mas provavelmente será bom o suficiente para suas funções se elas se parecerem com o exemplo que você forneceu (ou seja, começar com
alphanumeric_name (
no inÃcio de uma linha e terminar com}
ou)
no inÃcio de uma linha) e você não tiver nenhum outro código em seus scripts que também se pareça com isso, mas não seja uma definição de função.Adicione mais palavras-chave ao
$1 !~
teste, se desejar, ou você pode torná-lo mais robusto adicionando uma chamadadeclare -F
e aceitando somente definições de função aparentes correspondidas pela expressão regular acima se a string corresponder a uma definição de função real, conforme relatado pordeclare -F
.Por exemplo:
e se você quiser obter comentários que terminem na linha imediatamente antes de cada função também:
Observe que isso imprimirá apenas as funções definidas em seus arquivos e que estão disponÃveis em seu ambiente, diferentemente do primeiro script, que imprimirá todas as funções em seus arquivos.