Quando o bash é chamado com o nome sh, ele faz o seguinte :
if (shell_name[0] == 's' && shell_name[1] == 'h' && shell_name[2] == '\0')
act_like_sh++;
e depois define a POSIXLY_CORRECTvariável do shell comoy :
if (act_like_sh)
{
bind_variable ("POSIXLY_CORRECT", "y", 0);
sv_strict_posix ("POSIXLY_CORRECT");
}
bind_variablechama bind_variable_internal, que, se o atributo shell aestiver ativado no momento (o que seria se você invocasse o shell -a), marca a variável do shell como exportada .
Então, no seu primeiro script:
#!/bin/sh -a
echo "a" | sed -e 's/[\d001-\d008]//g'
sedé invocado POSIXLY_CORRECT=yem seu ambiente, o que fará com que ele se queixe [\d001-\d008]. (O mesmo acontece se sed tiver a --posixopção.)
Em GNU sed, é um código de escape para o carácter cujo valor numérico na base 10 é NNN , mas no modo POSIX, este é desactivado dentro de um suporte de expressão, assim , meios literalmente os caracteres , etc., com o intervalo sendo desde para . Na ordem dos códigos de caracteres, vem antes (e o intervalo inclui todos os dígitos, exceto zero, além de todas as letras maiúsculas e alguns caracteres especiais). No local que você estava usando, classifica antes , no entanto, portanto, o intervalo é inválido.\dNNN[\d001-\d008]\d1\1\en_US.UTF-8\1
No seu segundo script:
#!/bin/sh
set -a
echo "a" | sed -e 's/[\d001-\d008]//g'
mesmo estando POSIXLY_CORRECTdefinido no shell, ele não é exportado, portanto, o sed é invocado sem POSIXLY_CORRECTo ambiente e o sed é executado com extensões GNU.
Se você adicionar export POSIXLY_CORRECTperto da parte superior do seu segundo script, também verá sed recla.
shsão iguais. Nem todos os sed são equivalentes. Qualshvocê está usando? Em qual SO? e Qual sed (talvez?sed --versionse não falhar)?