Quando a forma antiga de substituição de aspas invertidas é usada, a barra invertida retém seu significado literal, exceto quando seguida por '$', '`' ou '\'.
Ou seja, as barras invertidas escapam de cifrões, crases e outras barras invertidas antes que o comando seja dado ao shell para processar (incluindo antes do processamento normal de escapes de barra invertida e aspas). Isso significa que:
`echo \\ `
é equivalente a
$(echo \ )
e produz um único espaço. Esse espaço único é inserido como o argumento para o seu externo echoe, em seguida, geralmente perdido durante a divisão de campo, portanto, apenas echoexecuções sem argumentos.
Por outro lado
`echo \\`
deixa um pendente \no final do comando, o que geralmente não é legal (indicaria a continuação da linha em outro lugar) e está sendo tratado como literal. Ambos bashe dashfazem isso, assim como tcsh, mas zshnão fazem. Não parece ser especificado explicitamente no POSIX ou em outro lugar, então suponho que seja um comportamento definido pela implementação.
Em vez disso, usar $( ... )a substituição de comando permite que você escreva qualquer script sem interferência. Quase sempre será melhor do que a substituição de backtick.
O comportamento documentado das barras invertidas na substituição de comandos no estilo backtick é :
Ou seja, as barras invertidas escapam de cifrões, crases e outras barras invertidas antes que o comando seja dado ao shell para processar (incluindo antes do processamento normal de escapes de barra invertida e aspas). Isso significa que:
é equivalente a
e produz um único espaço. Esse espaço único é inserido como o argumento para o seu externo
echo
e, em seguida, geralmente perdido durante a divisão de campo, portanto, apenasecho
execuções sem argumentos.Por outro lado
deixa um pendente
\
no final do comando, o que geralmente não é legal (indicaria a continuação da linha em outro lugar) e está sendo tratado como literal. Ambosbash
edash
fazem isso, assim comotcsh
, maszsh
não fazem. Não parece ser especificado explicitamente no POSIX ou em outro lugar, então suponho que seja um comportamento definido pela implementação.Em vez disso, usar
$( ... )
a substituição de comando permite que você escreva qualquer script sem interferência. Quase sempre será melhor do que a substituição de backtick.