Se eu executar o seguinte arquivo .sh:
#!/bin/sh -a
echo "a" | sed -e 's/[\d001-\d008]//g'
O resultado é um erro:
expressão sed: -e # 1, caractere 18: final do intervalo inválido
Mas se eu executar o seguinte arquivo .sh:
#!/bin/sh
set -a
echo "a" | sed -e 's/[\d001-\d008]//g'
É executado sem erros. O segundo código não deveria ser equivalente ao primeiro? Por que o erro no primeiro?
shell-script
shell
sed
options
Rodrigo
fonte
fonte
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)?LC_COLLATE=C
(ouPOSIX
) para a chamada parased
trabalhos em torno da questãoPOSIXLY_CORRECT=y
no ambiente, o segundo não possuiPOSIXLY_CORRECT
no ambiente. O shell do qual invoco os dois scripts não possuiPOSIXLY_CORRECT
em seu ambiente.echo "a" | POSIXLY_CORRECT=y sed -e 's/[\d001-\d008]//g'
reproduza seu problemaRespostas:
Quando o bash é chamado com o nome
sh
, ele faz o seguinte :e depois define a
POSIXLY_CORRECT
variável do shell comoy
:bind_variable
chamabind_variable_internal
, que, se o atributo shella
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:
sed
é invocadoPOSIXLY_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:
mesmo estando
POSIXLY_CORRECT
definido no shell, ele não é exportado, portanto, o sed é invocado semPOSIXLY_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.fonte
/bin/sh
realmente estar Bash). O mesmo acontece sePOSIXLY_CORRECT
estiver no ambiente antes dosh
Bash começar: ele também passará comoPOSIXLY_CORRECT=y
.POSIXLY_CORRECT
não está no ambiente quando o shell é iniciado e o script não o define. A concha faz. Ele cria uma variável de ambiente do nada, o que é muito ruim, pois faz isso em um modo em que deveria estar e tenta ser compatível com os padrões.POSIXLY_CORRECT
por conta própria. Não há menção a isso na lista de efeitos do modo POSIX, e a descrição da variável diz apenas que a configuração altera o shell para o modo POSIX, e não o contrário.allexport
.