Как мне остановить bash от проверки синтаксиса исходных файлов?

9

У меня есть следующий код в файле, который поставляется как zsh, так и 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это zshесли оболочка zsh и bashесли оболочка bash.

Каждая из вышеперечисленных функций содержит код, который работает с zsh, но не bash.

Когда я получаю этот файл, я получаю следующие ошибки.

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

На данный момент я использую, evalчтобы обойти проверку синтаксиса 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

Есть ли лучшее решение этой проблемы? (возможно тот, который не использует eval)


источник

Ответы:

14

Вам нужен только один 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/)
  '

(обратите внимание, что в zshотличие от bashдействительно поддерживает синтаксис функции Борна)

Или:

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

Но я склонен согласиться с тем, slmчто иметь zshопределенный синтаксис в отдельном файле, полученном только из источника, zshимеет смысл.

Стефан Шазелас
источник
Спасибо, что вставили в код то, о чем я мог думать только словами 8-).
SLM
15

Вместо того, чтобы пытаться заставить Bash не проверять синтаксис, почему бы не получить ваш скрипт, который получает источник этого единственного источника, когда он вызывается правильной оболочкой.

SLM
источник
Файл поставляется как bash, так и zsh. Я подумываю о том, чтобы разбить специфичные для zsh части на их собственный файл.
6
Да, именно это я и сделаю. Проще поддерживать и поддерживать себя в будущем и для всех, кто придет в код в будущем. В коде я всегда стараюсь для явного, а не умного.
SLM