De acordo com a página de linguagem de comando POSIX Shell :
\
O<backslash>
deve manter seu significado especial como um caractere de escape (consulte Caractere de escape (barra invertida)) somente quando seguido por um dos seguintes caracteres quando considerado especial :
$
`
"
\
<newline>
Eu interpreto isso como significando que \
só deve escapar um desses cinco caracteres especiais se for especial em seu determinado contexto.
As páginas man para ash, dash, bash e ksh não contêm a cláusula "quando consideradas especiais". Eu entendo que isso significa (e confirmei através de experimentação básica) que \
tem o efeito de escapar desses cinco caracteres incondicionalmente, mesmo quando um desses cinco caracteres não é especial em seu contexto.
Considere a saída de $ printf '%s\n' "\abcde"
, que é \abcde
. Isso é esperado porque a
não é especial neste contexto (ou em qualquer contexto para esse assunto); portanto, o \
não é especial e é tratado literalmente.
Agora considere a saída de $ printf '%s\n' "\\abcde"
, que é \abcde
. Este não é o comportamento que eu espero. Na minha opinião, a primeira barra invertida na string \\abcde
também deve ser tratada literalmente, porque é seguida por \
um contexto em que \
não é especial. A saída que eu esperaria é \\abcde
.
Outro cenário em que vejo um comportamento inesperado está na saída de $ printf '%s\n' "ab\$"
, que é ab$
. Na minha opinião, $
tem um significado especial neste contexto porque serve para introduzir expansão de parâmetros, substituição de comandos ou expansão aritmética. Portanto, na minha opinião, o \
deve ser tratado literalmente porque é seguido por $
um contexto onde $
não é especial. A saída que eu esperaria é ab\$
.
Para que conste, espero estar totalmente fora da base aqui. Torna minha vida muito mais difícil ter que me preocupar em escapar desses cinco personagens apenas em certas circunstâncias. Eu me esforço para ser posixly correto sempre que possível, e não quero depender de \
escapar desses cinco caracteres especiais incondicionalmente se esse comportamento (pessoalmente desejado) em shells compatíveis com POSIX não estiver alinhado com POSIX.
Esta nota faz uma recomendação para remover o texto quando considerado especial .
Um conjunto sugerido de correções está na Nota: 0000998 .
A nota também informa que a mudança foi aprovada em 30 de agosto de 2012.
Não sei dizer por que razão ainda é utilizada na presente redacção .
Eu acredito que você poderia esquecer essas palavras.
Existem duas etapas envolvidas em
echo "\abc\$\\"
(por exemplo).Primeiro, uma vez que o argumento de string para
echo
está entre aspas duplas, o shell fará coisas com os caracteres de escape dentro.No caso
"\abc\$\\"
dele irá transformá-lo para\abc$\
antes de entregá-lo aoecho
. O\a
permanecerá inalterado, poisa
não é um dos caracteres "especiais". Os outros caracteres de escape serão literais , o que significa que eles não têm mais seu significado especial no shell (o$
não inicia uma expansão, a barra invertida não escapa o próximo caractere etc.) Observe que um$
no final de um double a string citada ainda é "especial", pois poderia ter introduzido uma expansão, se a string não terminasse logo após ela. As duas strings"a$"
e"a\$"
são idênticas, pois o$
da primeira string não se aplica a nada.Então,
echo
pode fazer sua própria interpretação desse argumento de string. Algumas implementações deecho
considerariam\a
como significando "o caractere de sino", por exemplo.Eu também acho que você está interpretando mal o padrão aqui. A avaliação da barra invertida seguida por um dos caracteres especiais removerá a barra invertida. Você parece pensar que deve permanecer inalterado e que, por exemplo
\$
, deve ser deixado como\$
. A norma diz o contrário disso.