Bagaimana cara menghentikan bash dari sintaks memeriksa file yang bersumber?

9

Saya memiliki kode berikut dalam file yang bersumber dari zsh dan 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

SHELLNAMEadalah zshjika shell adalah zsh dan bashjika shell adalah bash.

Masing-masing fungsi di atas berisi kode yang berfungsi dengan zsh, tetapi tidak bash.

Ketika saya sumber file ini, saya menerima kesalahan berikut.

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

Saat ini, saya menggunakan evaluntuk memotong memeriksa sintaks 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

Apakah ada solusi yang lebih baik untuk masalah ini? (mungkin yang tidak digunakan eval)


sumber

Jawaban:

14

Anda hanya perlu satu 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/)
  '

(perhatikan bahwa zshbertentangan dengan bashtidak mendukung sintaks fungsi Bourne)

Atau:

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

Tapi saya cenderung setuju dengan slmmemiliki zshsintaks khusus dalam file terpisah hanya bersumber oleh zshakan masuk akal.

Stéphane Chazelas
sumber
Terima kasih telah memasukkan ke dalam kode apa yang hanya dapat saya pikirkan dalam kata 8-).
slm
15

Daripada mencoba dan membuat Bash untuk tidak memeriksa sintaks, mengapa skrip Anda tidak melakukan sumber dari sumber ini hanya ketika sedang dipanggil oleh shell yang benar.

slm
sumber
File ini bersumber dari bash dan zsh. Saya sedang berpikir tentang memisahkan bagian-bagian khusus zsh ke dalam file mereka sendiri.
6
Ya itulah yang akan saya lakukan. Lebih jelas untuk mempertahankan dan mendukung untuk diri Anda sendiri di jalan dan untuk siapa pun yang masuk ke kode di masa depan. Dalam kode saya selalu mencoba untuk eksplisit daripada pintar.
slm