ฉันจะหยุดทุบตีจากการตรวจสอบไวยากรณ์ที่มาไฟล์ได้อย่างไร


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ถ้าเปลือกเป็นทุบตี

แต่ละฟังก์ชั่นด้านบนมีรหัสที่ใช้งานได้กับ zsh แต่ไม่ใช่การทุบตี

เมื่อฉันส่งไฟล์นี้มาฉันได้รับข้อผิดพลาดดังต่อไปนี้

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จะสนับสนุนไวยากรณ์ของฟังก์ชัน 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.