Eu gostaria de imprimir uma mensagem de uso de estilo man para descrever uma função shell como esta saída man find
:
NAME
find - search for files in a directory hierarchy
SYNOPSIS
find [-H] [-L] [-P] [-D debugopts] [-Olevel] [starting-point...] [expression]
DESCRIPTION
This manual page documents the GNU version of find. GNU find searches the directory tree rooted at each
given starting-point by evaluating the given expression from left to right, according to the rules of
precedence (see section OPERATORS), until the outcome is known (the left hand side is false for and opera‐
tions, true for or), at which point find moves on to the next file name. If no starting-point is speci‐
fied, `.' is assumed.
OPTIONS
Estou enfrentando uma mensagem de erro no caractere `.
O seguinte script simples mostra o erro:
~$ cat <<EOF
`.'
EOF
bash: bad substitution: no closing "`" in `.'
Eu pensei que heredoc
era uma maneira legal de ecoar strings colando-as sem ter que escapar de seu conteúdo, como citações, etc ...
Presumo que estava errado :/
Alguém pode explicar esse comportamento, por favor? Pode heredoc
aceitar o caractere `?
Editar 2 : Aceitei a resposta do here-document citado <<'END_HELP'
, mas finalmente não o usarei para esse tipo de saída manual completa, como kusalananda sugere
Editar 1 : (para leituras futuras) o limite com o uso do documento aqui citado é que impede o uso tput
no arquivo here-document
.
Para isso, fiz o seguinte:
- sem aspas
here-document
, paratput
comandos a serem executados - evite o erro de "substituição ruim" escapando do crase
- usar
tput
dentro dohere-document
Exemplo:
normal=$( tput sgr0 ) ;
bold=$(tput bold) ;
cat <<END_HELP # here-document not quoted
${bold}NAME${normal}
find - search for files in a directory hierarchy
${bold}SYNOPSIS${normal}
find [-H] [-L] [-P] [-D debugopts] [-Olevel] [starting-point...] [expression]
${bold}DESCRIPTION${normal}
This manual page documents the GNU version of find. GNU find searches the directory tree rooted at each
given starting-point by evaluating the given expression from left to right, according to the rules of
precedence (see section OPERATORS), until the outcome is known (the left hand side is false for and opera‐
tions, true for or), at which point find moves on to the next file name. If no starting-point is speci‐
fied, \`.' is assumed.
END_HELP
unset normal ;
unset bold ;
Aqui, observe o backtick escapado que foi a fonte do erro:
\`.'
O backtick introduz uma substituição de comando. Como o documento here não é citado, isso será interpretado pelo shell. O shell reclama, pois a substituição do comando não tem backtick final.
Para citar um documento aqui, use
ou
Em relação aos seus comentários sobre a resolução deste problema:
Os utilitários raramente produzem um manual completo sozinhos, mas podem oferecer uma sinopse ou informações básicas de uso. Isso raramente, ou nunca, é colorido (uma vez que sua saída pode não ser direcionada para um terminal ou pager como
less
). O manual real geralmente é composto usandogroff
ou um formatador de página de manual dedicadomandoc
e é tratado completamente separado do código.Você deseja usar especificamente um backtick/acento grave com aspas simples/apóstrofo para citar algo? Por favor, não, a combinação parece horrível. Na maioria das fontes, o acento grave é inclinado e o apóstrofo (ASCII) é reto. É assim que meu navegador mostra a última linha do trecho de sua página de manual:
Se você quiser usar aspas mais sofisticadas do que as aspas ASCII verticais, provavelmente deve usar algo como U+2018 e U+2019 .
A saída obviamente dependeria de suas fontes, mas acho que 'this' parece melhor do que 'this'.