Comment puis-je empêcher bash de vérifier la syntaxe des fichiers d'origine?

9

J'ai le code suivant dans un fichier provenant à la fois de zsh et 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

SHELLNAMEest zshsi le shell est zsh et bashsi le shell est bash.

Chacune des fonctions ci-dessus contient du code qui fonctionne avec zsh, mais pas bash.

Lorsque je source ce fichier, je reçois les erreurs suivantes.

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

Pour le moment, j'utilise evalpour contourner la vérification de la syntaxe 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

Existe-t-il une meilleure solution à ce problème? (peut-être celui qui n'utilise pas eval)


la source

Réponses:

14

Vous n'avez besoin que d'un seul eval.

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

(notez que zshcontrairement à bashne supporte pas la syntaxe de la fonction 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

Mais j'aurais tendance à être d'accord avec le fait slmque le fait d'avoir la zshsyntaxe spécifique dans un fichier séparé uniquement fourni par zshaurait du sens.

Stéphane Chazelas
la source
Merci d'avoir mis en code ce à quoi je ne pouvais penser qu'avec les mots 8-).
slm
15

Plutôt que d'essayer d'obtenir que Bash ne vérifie pas la syntaxe, pourquoi ne pas avoir votre script qui fait le sourcing de cette source uniquement quand il est appelé par le bon shell.

slm
la source
Le fichier provient de bash et de zsh. Je pense cependant à diviser les parties spécifiques à zsh dans leur propre fichier.
6
Oui, c'est exactement ce que je ferais. Il est plus clair de maintenir et de vous soutenir sur la route et pour toute autre personne qui entrera dans le code à l'avenir. Dans le code, j'essaie toujours d'expliciter plutôt qu'intelligent.
slm