¿Cómo evito que bash compruebe la sintaxis de los archivos de origen?

9

Tengo el siguiente código en un archivo que proviene tanto de zsh como de 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

SHELLNAMEes zshsi el shell es zsh y bashsi el shell es bash.

Cada una de las funciones anteriores contiene código que funciona con zsh, pero no bash.

Cuando obtengo este archivo, recibo los siguientes errores.

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

Por el momento, estoy usando evalpara evitar la verificación de sintaxis de 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

¿Hay una mejor solución para este problema? (tal vez uno que no use eval)


fuente

Respuestas:

14

Solo necesitas una evaluación.

[ -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/)
  '

(tenga en cuenta que, al zshcontrario bash, admite la sintaxis de la función Bourne)

O:

[ -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

Pero tendería a estar de acuerdo con slmque tener sentido de la zshsintaxis específica en un archivo separado solo con origen zsh.

Stéphane Chazelas
fuente
Gracias por poner en código lo que solo podía pensar en las palabras 8-).
slm
15

En lugar de tratar de hacer que Bash no compruebe la sintaxis, ¿por qué no tener su script que está haciendo el abastecimiento de esta única fuente cuando la llama el shell correcto?

slm
fuente
El archivo proviene de bash y zsh. Sin embargo, estoy pensando en dividir las partes específicas de zsh en su propio archivo.
66
Sí, eso es exactamente lo que haría. Es más claro mantener y brindar soporte para usted en el futuro y para cualquier otra persona que ingrese al código en el futuro. En el código siempre trato de explícito en lugar de inteligente.
slm