modo Force POSIX

5

Brace Expansion, por exemplo, {a, b, c} é não definido pelo POSIX . Eu gostaria de correr meu shell no modo POSIX. Com o Debian isso é bastante simples:

$ bash -c 'echo {a,b,c}'
a b c

$ sh -c 'echo {a,b,c}'
{a,b,c}

No entanto, o Fedora se comporta de maneira diferente:

$ bash -c 'echo {a,b,c}'
a b c

$ sh -c 'echo {a,b,c}'
a b c

Eu tentei usar a opção --posix , mas não tem efeito:

$ sh --posix -c 'echo {a,b,c}'
a b c

O Bash pode ser forçado a operar no modo POSIX?

    
por Steven Penny 30.01.2016 / 22:29

3 respostas

3

O Bash pode ser avisado para desativar a expansão de chaves com set +B , qual é o inverso de set -B :

-B The shell will perform brace expansion (see Brace Expansion). This option is on by default.

Você também pode fornecer isso na linha de comando ao iniciar o shell:

$ bash +B -c 'echo {a,b,c}'
{a,b,c}

Você pode combinar isso com as --posix ou set -o posix options para se aproximar do comportamento totalmente POSIX. Você também precisa habilitar shopt -s xpg_echo pelo menos.

Haverá outros cantos também - muitas das extensões estão profundamente arraigadas - e eu não acho que é possível fazer com que o Bash suporte apenas o comportamento que é realmente obrigatório pelo POSIX . Mesmo dash não consegue isso.

No entanto, você pode encontrar dash (o padrão /bin/sh no Debian) mais útil se você estiver com o objetivo de evitar comportamentos estendidos, embora também ofereça suporte a algumas extensões. Também há o ash applet do BusyBox , que também tem algumas extensões, mas muitas podem ser desabilitadas estaticamente.

    
por 31.01.2016 / 00:06
0

De acordo com o Bash Reference Manual ( link ), o --posix flag "fará com que o Bash fique mais próximo do padrão POSIX". Parece que a conformidade completa com POSIX não é uma opção.

Quanto à diferença de comportamento, acredito que você encontrará /bin/sh é um link simbólico para /bin/bash no Fedora. O Debian provavelmente tem uma implementação não bash para /bin/sh .

    
por 30.01.2016 / 22:42
0

No Debian padrão, sh é um link para dash (não bash ). O Dash se ajusta mais de perto ao comportamento do POSIX para "Expansão de Brace".

Bash tem essa diferença documentada com o histórico sh (do man bash):

Brace expansion introduces a slight incompatibility with historical versions of sh. sh does not treat opening or closing braces specially when they appear as part of a word, and preserves them in the output. Bash removes braces from words as a consequence of brace expansion. For example, a word entered to sh as file{1,2} appears identically in the output. The same word is output as file1 file2 after expansion by bash. If strict compatibility with sh is desired, start bash with the +B option or disable brace expansion with the +B option to the set command.

Qualquer um desses trabalhos:

bash +B -c 'echo {a,b,c}'
bash -c 'set +B; echo {a,b,c}'

E, se você ainda precisa de um POSIXly mais bash:

bash --posix +B -c 'echo {a,b,c}'
bash --posix -c 'set +B; echo {a,b,c}'

Como a alteração do shell padrão para /bin/sh tem muitas conseqüências no sistema, não recomendo que você altere /bin/sh para dash .

No entanto, é comum que $HOME/bin/ (ou a.k.a ~/bin/ ) seja definido antes de /bin/ no PATH. Assim, você pode copiar um executável de traço para seu usuário ~/bin/sh (ou até mesmo um link simbólico ou real) e o traço funcionará como o sh padrão para esse usuário.

Às vezes, a inclusão de ~/bin/ como programas executáveis do usuário é feita em .profile :

[ -d "${HOME}/bin" ] && export PATH="${HOME}/bin:$PATH"

que é originado por (quase qualquer shell) bash no primeiro login (na hora de início do servidor X para o usuário) e a partir de então ele existe como um valor de ambiente.

Se isso existir, tudo o que você precisa fazer é criar o diretório /home/$USER/bin .
É claro que você precisa fazer login novamente ou obter ~/.profile uma vez.

    
por 31.01.2016 / 00:21