Como faço para interromper o bash da sintaxe, verificando arquivos de origem?

9

Eu tenho o seguinte código em um arquivo que é originado pelo zsh e pelo bash.

if test $SHELLNAME = zsh ; then
    lss() { l -l ${1:-.}/*(s,S,t); }
    laf() { l ${1:-.}/.*(.); }
    lad() { l -d ${1:-.}/.*(/); }
    lsw() { l -ld ${1:-.}/.*(R,W,X.^ND/); }
fi

SHELLNAMEé zshse o shell for zsh e bashse o shell for bash.

Cada uma das funções acima contém código que funciona com zsh, mas não com bash.

Quando origino este arquivo, recebo os seguintes erros.

bash: <filename>: line 67: syntax error near unexpected token `('
bash: <filename>: line 67: `     lss() { l -l ${1:-.}/*(s,S,t); }'

No momento, estou usando evalpara ignorar a verificação de sintaxe do bash.

if test $SHELLNAME = zsh ; then
    # Using eval makes sure bash can't try to syntax-check these functions.
    eval 'lss() { l -l ${1:-.}/*(s,S,t); }'
    eval 'laf() { l ${1:-.}/.*(.); }'
    eval 'lad() { l -d ${1:-.}/.*(/); }'
    eval 'lsw() { l -ld ${1:-.}/.*(R,W,X.^ND/); }'
fi

Existe uma solução melhor para esse problema? (talvez um que não use eval)


fonte

Respostas:

14

Você só precisa de uma avaliação.

[ -n "$ZSH_VERSION" ] &&
  eval '
    lss() l -l ${1:-.}/*(s,S,t)
    laf() l ${1:-.}/.*(.)
    lad() l -d ${1:-.}/.*(/)
    lsw() l -ld ${1:-.}/.*(R,W,X.^ND/)
  '

(observe que, zshao contrário de bash, suporta a sintaxe da função Bourne)

Ou:

[ -n "$ZSH_VERSION" ] && . /dev/fd/3 3<< '# End of zsh specific section'
  lss() l -l ${1:-.}/*(s,S,t)
  laf() l ${1:-.}/.*(.)
  lad() l -d ${1:-.}/.*(/)
  lsw() l -ld ${1:-.}/.*(R,W,X.^ND/)
# End of zsh specific section

Mas eu tenderia a concordar com o slmfato de ter sentido a zshsintaxe específica em um arquivo separado, apenas fornecido por zsh,.

Stéphane Chazelas
fonte
Obrigado por colocar em código o que eu só conseguia pensar nas palavras 8-).
Slm
15

Em vez de tentar fazer com que o Bash não verifique a sintaxe, por que não fazer com que o seu script que está fornecendo essa única fonte seja quando está sendo chamado pelo shell correto.

slm
fonte
O arquivo é originado pelo bash e pelo zsh. Estou pensando em dividir as partes específicas do zsh em seu próprio arquivo.
6
Sim, é exatamente o que eu faria. É mais claro manter e dar suporte para você mesmo no caminho e para qualquer outra pessoa que entrar no código no futuro. No código, eu sempre tento explícito e não inteligente.
Slm