Considerar
echo \ # this is a comment
foo
Isto dá:
$ sh foo.sh
# this is a comment
foo.sh: line 2: foo: command not found
Após algumas pesquisas na web, encontrei uma solução da DigitalRoss no site irmão Stack Overflow. Então pode-se fazer
echo `: this is a comment` \
foo
ou alternativamente
echo $(: this is a comment) \
foo
No entanto, a DigitalRoss não explicou por que essas soluções funcionam. Eu apreciaria uma explicação. Ele respondeu com um comentário:
Costumava haver um
goto
comando shell que ramifica para rótulos especificados como:
aqui. Ogoto
se foi, mas você ainda pode usar a: whatever
sintaxe ...:
é uma espécie de comentário analisado agora.
Mas eu gostaria de mais detalhes e contexto, incluindo uma discussão sobre portabilidade.
Obviamente, se alguém tiver outras soluções, isso também seria bom.
Consulte também a pergunta anterior Como comentar comandos de várias linhas em scripts de shell? .
Leve a mensagem para casa da discussão abaixo. O `: this is a comment`
é apenas uma substituição de comando. A saída de : this is a comment
é nada, e isso é colocado no lugar de `: this is a comment`
.
Uma escolha melhor é a seguinte:
echo `# this is a comment` \
foo
make_FIND
um script quickie que cria uma longa lista de argumentos parafind
. Aqui, a motivação para construí-lo parte por parte é que cada parte vem do corpo de um loop, mas o mesmo estilo permite comentar cada parte.Você pode conseguir isso usando matrizes Bash, por exemplo,
Isso define uma matriz
$CMD
e depois a expande. Uma vez expandida, a linha resultante é avaliada, portanto, neste caso,echo foo
é executada.O texto entre
(
e)
define a matriz e está sujeito à sintaxe usual do bash; portanto, tudo em uma linha depois#
é ignorado.Nota sobre como preservar o espaço em branco entre aspas
${CMD[@]}
expande para uma única sequência que é a concatenação de todos os elementos, separados por um espaço. Uma vez expandido, o Bash analisava a sequência em tokens da maneira usual (cf $ IFS ), que geralmente não é o que queremos.Por outro lado, se a expansão estiver entre aspas duplas, ou seja
"${CMD[@]}"
, cada elemento na matriz será preservado. Considere a diferença entrehello world second item
e"hello world" "second item"
.Exemplo ilustrativo:
fonte
${CMD[@]}
não se expande para uma única sequência. - Ele se expande para várias strings: não apenas é dividido para cada elemento da matriz, mas também no espaço em branco em cada elemento. (Ie: completamente inútil)Não faça
$(: comment)
. Isso não é um comentário - é um subshell - outro processo de shell totalmente novo para a maioria dos shells. Seu objetivo é fazer menos com sua contribuição, não mais, o que isso faria - mesmo que seja inútil.Você pode fazer ...
Basicamente, o que está acontecendo lá é que o shell está fazendo uma substituição. Ele substitui o valor do parâmetro shell especial
$-
duas vezes a cada vez. De qualquer maneira, é uma cadeia curta, mas sempre é definida - e, portanto, a substituição interna - que é interpretada como um padrão a ser retirado da parte externa - não se expande para o conteúdo entre parênteses quando eu uso o-
formulário de expansão.Aqui:
Vejo? Então, ele é expandido apenas duas vezes. Assim que o shell descobre que o parâmetro está definido, tudo no campo de expansão opcional é descartado, praticamente e se expande para todo o valor que é removido de si mesmo e, portanto, para nada. Na maioria das conchas, você nem precisa escapar de aspas, mas
bash
exige.Melhor ainda é:
fonte