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_CORRECT
variável do shell comoy
:
if (act_like_sh)
{
bind_variable ("POSIXLY_CORRECT", "y", 0);
sv_strict_posix ("POSIXLY_CORRECT");
}
bind_variable
chama bind_variable_internal
, que, se o atributo shell a
estiver 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=y
em seu ambiente, o que fará com que ele se queixe [\d001-\d008]
. (O mesmo acontece se sed tiver a --posix
opçã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]
\
d
1
\
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_CORRECT
definido no shell, ele não é exportado, portanto, o sed é invocado sem POSIXLY_CORRECT
o ambiente e o sed é executado com extensões GNU.
Se você adicionar export POSIXLY_CORRECT
perto da parte superior do seu segundo script, também verá sed recla.
sh
são iguais. Nem todos os sed são equivalentes. Qualsh
você está usando? Em qual SO? e Qual sed (talvez?sed --version
se não falhar)?