Jak zatrzymać bash przed sprawdzaniem składni pobranych plików?

9

Mam następujący kod w pliku pozyskiwanym zarówno przez Zsh, jak i 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

SHELLNAMEjest, zshjeśli powłoka jest zsh i bashjeśli powłoka jest bash.

Każda z powyższych funkcji zawiera kod, który działa z zsh, ale nie bash.

Gdy źródło tego pliku, otrzymuję następujące błędy.

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

W tej chwili używam evaldo ominięcia sprawdzania składni basha.

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

Czy istnieje lepsze rozwiązanie tego problemu? (być może taki, który nie używa eval)


źródło

Odpowiedzi:

14

Potrzebujesz tylko jednej ewaluacji.

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

(zauważ, że w zshprzeciwieństwie do bashobsługuje składnię funkcji Bourne'a)

Lub:

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

Ale zwykle zgadzam się z slmtym, że posiadanie zshokreślonej składni w osobnym pliku, z którego tylko pochodzą, zshmiałoby sens.

Stéphane Chazelas
źródło
Dzięki za włożenie do kodu tego, o czym mogłem myśleć tylko słowami 8-).
slm
15

Zamiast próbować sprawić, aby Bash nie sprawdzał składni, dlaczego nie ma skryptu, który korzysta z tego źródła tylko wtedy, gdy jest wywoływany przez poprawną powłokę.

slm
źródło
Plik pochodzi zarówno z bash, jak i zsh. Zastanawiam się nad podzieleniem części specyficznych dla Zsh na ich własne pliki.
6
Tak, właśnie to bym zrobił. Przejrzystsze jest utrzymanie i wsparcie dla siebie na drodze i dla każdego, kto wejdzie do kodu w przyszłości. W kodzie zawsze staram się jawnie, a nie sprytnie.
slm