Em uma substituição de comando delimitada com $(…)
, o que está dentro dos parênteses é analisado da mesma maneira que um comando de nível superior (exceto em alguns casos de canto envolvendo parênteses de fechamento desequilibrados). O que está dentro dos parênteses é um trecho de shell comum, não há nenhuma expansão de contrabarra adicional sendo feita.
O comando echo '\'
imprime três caracteres: duas barras invertidas e uma nova linha (assumindo um comando echo
que não faz expansão de barra invertida). Portanto, o resultado de uma substituição de comando $(echo '\')
é a string de dois caracteres \
(a nova linha final é removida, a substituição de comando sempre faz isso). Como você usou a substituição de comandos dentro de aspas duplas, nenhuma outra expansão é executada: a parte da palavra resultante é \
.
Em echo "$(echo '\')$"
, a substituição do comando gera uma única barra invertida. Sua contribuição para o argumento de echo
é a string \
. O seguinte $
é seguido por um caractere que não pode iniciar um nome de parâmetro, portanto, ele se expande para si mesmo. Assim, o argumento para echo é a cadeia de dois caracteres \$
. As strings com aspas duplas não são mais expandidas, não há nada que possa fazer com que a barra invertida seja interpretada como um caractere especial (exceto alguns tipos do comando echo
).
Você pode procurar as regras de expansão completas nos manuais de shell e em outra documentação, com vários graus de (in) legibilidade. A especificação POSIX não é tão ruim quanto os padrões (louvor).
P.S. Como garantir que a string seja interpolada na substituição 'sed' escapa de todos os metacarismos