Як зупинити 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

Вам потрібен лише один евал.

[ -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підтримує синтаксис функції Bourne)

Або:

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