O manual do Bash observa que :
The POSIX $() form of command substitution is implemented (see Command Substitution), and preferred to the Bourne shell’s '' (which is also implemented for backwards compatibility).
Portanto, $(...)
é preferido em relação a '...'
em algo novo e específico para Bash que você esteja escrevendo¹. A substituição de Backtick não se encaixa bem (você precisa escapar deles) e tem um comportamento de cotação um pouco estranho. Você pode aninhar $(... $(...) ...)
arbitrariamente sem problemas. O manual descreve o comportamento dos dois como :
When the old-style backquote form of substitution is used, backslash retains its literal meaning except when followed by ‘$’, ‘'’, or ‘\’. The first backquote not preceded by a backslash terminates the command substitution. When using the $(command) form, all characters between the parentheses make up the command; none are treated specially.
É normalmente considerada a melhor prática para citar todas as expansões de strings para evitar problemas de divisão de palavras, inclusive em locais onde não é estritamente necessário, por isso "$(...)"
também é uma prática melhor aqui.
Por fim, duas partes relevantes dessa mesma página de lã :
- It's also time you forgot about
'...'
. It isn't consistent with the syntax of Expansion and is terribly hard to nest without a dose of painkillers. Use$(...)
instead.- And for heaven's sake, "Use more quotes!" Protect your strings and parameter expansions from word splitting. Word splitting will eat your babies if you don't quote things properly.
¹ Na verdade, mesmo em scripts POSIX sh
, estas são consideradas boas práticas. Ainda há bombas mais fracas por aí, mas você saberá se vai encontrá-las.