Как мне остановить 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)

bash  zsh 

Ответы:


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


Файл поставляется как bash, так и zsh. Я подумываю о том, чтобы разбить специфичные для zsh части на их собственный файл.

6
Да, именно это я и сделаю. Проще поддерживать и поддерживать себя в будущем и для всех, кто придет в код в будущем. В коде я всегда стараюсь для явного, а не умного.
SLM
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.