Bash'ın kaynaklı dosyaları sözdizimi kontrolünden nasıl durdurabilirim?


9

Hem zsh hem de bash tarafından kaynaklı bir dosyada aşağıdaki kodu var.

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

SHELLNAMEbir zshkabuk zsh ise ve bashkabuk darbe ise.

Yukarıdaki işlevlerin her biri zsh ile çalışan, ancak bash ile çalışmayan kod içerir.

Bu dosyayı kaynakladığımda, aşağıdaki hataları alıyorum.

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

Şu anda evalbash'ın sözdizimi denetimini atlamak için kullanıyorum .

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

Bu soruna daha iyi bir çözüm var mı? (belki de kullanmayan eval)

bash  zsh 

Yanıtlar:


14

Sadece bir değerlendirmeye ihtiyacın var.

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

( zshaksine bashBourne işlevinin söz dizimini desteklediğini unutmayın )

Veya:

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

Ama kabul etmek güderdik slmo sahip zshtek kaynaklı ayrı bir dosyada belirli sözdizimi zshmantıklıdır.


Sadece kelimeler 8-) ne düşünebilirsiniz kod koyduğunuz için teşekkür ederiz.
slm

15

Bash'i sözdizimi kontrolüne sokmamak yerine denemek yerine, neden bu kodun kaynağını yapan betiğiniz sadece doğru kabuk tarafından çağrıldığında onu kaynak yapmıyorsunuz?


Dosya hem bash hem de zsh tarafından sağlanmıştır. Zsh'a özgü parçaları kendi dosyalarına ayırmayı düşünüyorum.

6
Evet aynen bunu yapardım. Yolda kendiniz ve gelecekte koda giren herkes için bakım ve destek daha açıktır. Kodda her zaman akıllı yerine açık deneyin.
slm
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.