Làm cách nào để dừng bash khỏi kiểm tra cú pháp các tệp có nguồn gốc?


9

Tôi có đoạn mã sau trong một tệp có nguồn gốc từ cả zsh và 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

SHELLNAMEzshnếu vỏ là zsh và bashnếu vỏ là bash.

Mỗi hàm trên chứa mã hoạt động với zsh, nhưng không bash.

Khi tôi lấy tệp này, tôi nhận được các lỗi sau.

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

Hiện tại, tôi đang sử dụng evalđể bỏ qua việc kiểm tra cú pháp của 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

Có một giải pháp tốt hơn cho vấn đề này? (có lẽ không sử dụng eval)

bash  zsh 

Câu trả lời:


14

Bạn chỉ cần một 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/)
  '

(lưu ý rằng zshtrái với bashkhông hỗ trợ cú pháp hàm Bourne)

Hoặc là:

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

Nhưng tôi có xu hướng đồng ý với slmviệc có zshcú pháp cụ thể trong một tệp riêng biệt chỉ có nguồn gốc zshsẽ có ý nghĩa.


Cảm ơn bạn đã đưa vào mã những gì tôi chỉ có thể nghĩ trong các từ 8-).
slm

15

Thay vì thử và yêu cầu Bash không kiểm tra cú pháp, tại sao không có tập lệnh của bạn đang tìm nguồn cung ứng này chỉ lấy nguồn khi nó được gọi bởi shell chính xác.


Các tập tin có nguồn gốc bởi cả bash và zsh. Tôi đang suy nghĩ về việc chia các phần cụ thể của zsh vào tập tin riêng của họ.

6
Vâng, đó chính xác là những gì tôi sẽ làm. Rõ ràng hơn để duy trì và hỗ trợ cho chính bạn và cho bất kỳ ai khác đi vào mã trong tương lai. Trong mã tôi luôn cố gắng rõ ràng hơn là thông minh.
slm
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.