Existe algum código sh que não seja código sintático sintaticamente válido?

30

Existe algum código sh que não seja código basticamente válido sintaticamente (não irá sintetizar na sintaxe)?

Estou pensando em sobrescrever sh com bash para determinados comandos.

    
por Alexander Mills 11.05.2018 / 05:33

2 respostas

48

Aqui está um código que faz algo diferente no POSIX sh e Bash:

hello &> world

Se isso é "inválido" para você, não sei.

No Bash, redireciona a saída padrão e erro padrão de hello no arquivo world . No POSIX sh , ele executa hello no segundo plano e, em seguida, faz um redirecionamento vazio para world , truncando-o (isto é, é tratado como & > ).

Existem muitos outros casos em que as extensões Bash farão as suas coisas quando executadas em bash e terão efeitos diferentes em um POSIX sh puro. Por exemplo, expansão de chaves é outra, e ela também funciona da mesma maneira em Bash Modo POSIX e não.

No que diz respeito aos erros de sintaxe estática, o Bash tem ambas as palavras reservadas (como [[ e time ) não especificadas pelo POSIX, tal que [[ x é código shell POSIX válido, mas um erro de sintaxe Bash e um histórico de vários erros de incompatibilidade POSIX que podem resultar em erros de sintaxe, como o desta pergunta :

x=$(cat <<'EOF'
'
EOF
)
bash: line 2: unexpected EOF while looking for matching '''
bash: line 5: syntax error: unexpected end of file

Apenas erros de sintaxe é uma definição bastante perigosa de "inválido" para qualquer circunstância em que seja importante, mas aí está.

    
por 11.05.2018 / 06:13
15

Um pequeno exemplo:

time()(:)

time no Bash é uma palavra reservada e se comporta de maneira diferente do programa time . É bem provável que você irá quebrar alguns scripts práticos tentando analisar o resultado de time usando o bash. Mas tecnicamente não é um erro de sintaxe. Redefinir time como uma função seria raro, mas causaria um erro de sintaxe, conforme esta pergunta especifica.

Um exemplo mais curto:

a():

Válido em dash , mas não em conformidade com POSIX.

    
por 11.05.2018 / 16:52