Perigos do shopt

3

Em outra pergunta, sugerimos usar

shopt -s extglob

Para corrigir um problema. Tenho a impressão de que esses comandos de tipo devem ser usados com moderação, talvez porque possam ter efeitos negativos com outros scripts. Alguém pode falar sobre isso?

    
por Steven Penny 03.12.2012 / 01:03

1 resposta

3

shopt afeta apenas o comportamento do shell no qual esse comando é executado. Se você colocá-lo em ~/.bashrc , ele afetará os shells interativos e os comandos executados sobre rsh / ssh (os shells de login também podem será afetado se ~/.bashrc for originado em ~/.profile ou ~/.bash_profile ).

A configuração da variável de ambiente BASHOPTS to extglob afetará todos os shells bash interativos ou não interativos iniciados enquanto essa variável de ambiente estiver configurada (a menos que sejam chamados de sh ).

Shells interativos são onde você deseja ter extglob set porque é onde você quer usá-lo, então ~/.bashrc é um bom lugar para se beneficiar dele em todos os shell interativos. Se você quiser usá-lo em um script, basta adicioná-lo no início do script.

O único local onde isso poderia causar problemas é quando é definido enquanto algum código que você não escreveu não espera que seja configurado. Isso pode ser, por exemplo, scripts que você envia no prompt ou em ~/.bashrc depois de definir a opção.

Embora isso seja verdade para algumas opções, não é para extglob como foi cuidadosamente projetado (por David Korn como provém do ksh) para não quebrar a compatibilidade com o shell Bourne (e explica por que a sintaxe é tão estranho).

Basicamente, qualquer coisa usando globs estendidas seria um erro de sintaxe no shell Bourne ou na sintaxe do shell POSIX. Se um script Bourne ou POSIX tivesse echo @(a) , ele seria quebrado (por causa do parêntese sem aspas). Não importa se, de repente, ele começou a produzir "a" em vez de uma mensagem de erro.

Por que o bash não o habilita por padrão não está claro para mim, dado que o bash não possui nenhuma outra sintaxe alternativa do glob globalizado como o zsh faz.

EDITAR . Embora David Korn tenha tentado não quebrar a compatibilidade Bourne / POSIX, parece que o bash não foi tão cuidadoso e é provavelmente por isso que ele não está ativado por padrão como no ksh.

Na emulação ksh (e zsh in ksh), os operadores de globbing estendido são desativados ao executar a globbing na substituição de parâmetros ou comandos:

$ touch a
$ a='@(a)' ksh93 -c 'echo $a'
@(a)

Enquanto no bash, não é o caso:

$ a='@(a)' BASHOPTS=extglob bash -c 'echo $a'
a
    
por 03.12.2012 / 23:39

Tags